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

 什麼是賦值?

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

 賦值標識符

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

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

 

 

 

    • +=(加)
    • -=(減)
    •  *=(乘)
    • /=(除)
    • %=(取余)
    • <<=(左移)
    • >>=(右移)
    • >>>=(無符號又移)

(注意,數學賦值標識符只有簡寫作用,無提升性能作用)

傳值和傳址

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

 (上圖為基本數據賦值傳值方式,基本數據類型:stringnumberbooleanundefinednullsymbol。

 

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

 

 (為variable name偷偷添加一個symbol。天吶variable name2居然也能調用!!!)

 

variable name生氣了怎麼辦呢?

拷貝

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

淺拷貝

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

 

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

深拷貝

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

 

 

 

 

(上圖為深拷貝後的數據存放圖)

深拷貝後,會拷貝所有的屬性,並將拷貝屬性指向的動態分配的內存。深拷貝會另外創建一個一模一樣的堆,新對象和原對象不共享堆內存。所以修改對象的值,也不會相互影響。當對象和它所引用的對象一起拷貝時即發生深拷貝。可以使用遞歸、JSON.parse()與JSON.stringify()測試查看效果。

 

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

 

完全可以!!! 

 

 

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

Tags: