漫畫 有趣的了解一下賦值 深淺拷貝

2022-09-19 15:21:09 字數 1934 閱讀 7424

什麼是賦值?

將某一數值賦給某個變數的過程,稱為賦值。將確定的數值賦給變數的語句叫做賦值語句。所賦「值」可以是數字,也可以是字串和表示式等。

賦值識別符號

簡單的賦值,都是由'='表示。復合賦值使用'/'、'+'、'-'後面跟'='表示。這些賦值識別符號,也是常說的「簡寫樣式」。

每個數學賦值識別符號都是獨一無二的:

(注意,數學賦值識別符號只有簡寫作用,無提公升效能作用)

傳值和傳址

賦值包含了傳值和傳址兩種賦值方式。傳值是基本資料的賦值方式,因為基本資料的值存放於棧中。傳值是引用資料的賦值方式,因為引用資料的值存放在堆中。

(上圖為基本資料賦值傳值方式,基本資料型別:stringnumberbooleanundefinednullsymbol。

(上圖為引用資料賦值是傳址的方式,由於引用資料的值只是指標指向同一堆位址,如果操作其中乙個,其餘都會被聯動。)

(為variable name偷偷新增乙個symbol。天吶variable name2居然也能呼叫!!!)

variable name生氣了怎麼辦呢?

拷貝

為解決該問題,就需要使用到拷貝。  也可以理解為只有在是引用性資料型別時,才用到深淺拷貝。

淺拷貝

先分析一下淺拷貝是否可用。淺拷貝:回先建立乙個新的物件,該物件有原始值的精確拷貝,但是屬性值的拷貝是通過賦值來完成的。 也就會有傳說中的「只拷貝表面上的」一層。如果修改的是複雜型別值本身,還是會相互影響。

這不行,不符合 variable name的需求!

深拷貝

啊哦,淺拷貝並不能完全滿足variable name不想讓variable name2拿到它新收集到的資料。或許我們需要看看其他方法:深拷貝。

(上圖為深拷貝後的資料存放圖)

深拷貝後,會拷貝所有的屬性,並將拷貝屬性指向的動態分配的記憶體。深拷貝會另外建立乙個一模一樣的堆,新物件和原物件不共享堆記憶體。所以修改物件的值,也不會相互影響。當物件和它所引用的物件一起拷貝時即發生深拷貝。可以使用遞迴、json.parse()與json.stringify()測試檢視效果。

嘗試一下,用深拷貝來完成variable name的需求:

完全可以!!! 

(注意,文章圖中箭頭方向不代表指標方向!!variable name以及variable name2只是代表變數名的英文!!)

了解一下ES6 函式 簡述深淺拷貝

標準開頭 今天我們來看一下es6的函式部分知識 有時候,函式的非必填引數,我們可以給予其預設值。保證程式完整不會出錯 在早期,我們賦初始值可能是這樣做的 早期es5方法 function ajax url,method,param console.log url,method,param 複製 但是...

講一下我自己理解的「賦值「,「淺拷貝」,「深拷貝」

今天來講一下我自己理解的 賦值 淺拷貝 深拷貝 1.賦值 賦值 賦值只是將a的引用賦值給了b a 1,2,3,4,5 b a print a 執行結果 1,2,3,4,5 6 a如上面所有,a只是將b的引用給了b,而b在尾部新增了乙個元素6則會影響到a。這也是 網上 物件賦值實際上是物件的引用 的體...

學習一下C 的深拷貝

以前一直在寫c 最近玩起了c 才發現c 的深拷貝好麻煩。我在程式的乙個類class1裡新建了乙個list,用於存放另乙個類class2的例項,而class2中另有乙個list。然後某些操作需要將其中乙個class1例項的資料拷貝到另乙個例項當中。我本以為用類似c 的vector的拷貝方法就可以 a....