什麼是賦值?
將某一數值賦給某個變數的過程,稱為賦值。將確定的數值賦給變數的語句叫做賦值語句。所賦“值”可以是數字,也可以是字串和表示式等。
賦值識別符號
簡單的賦值,都是由'='表示。複合賦值使用'/'、'+'、'-'後面跟'='表示。這些賦值識別符號,也是常說的“簡寫樣式”。
每個數學賦值識別符號都是獨一無二的:
-
- +=(加)
- -=(減)
- *=(乘)
- /=(除)
- %=(取餘)
- <<=(左移)
- >>=(右移)
- >>>=(無符號又移)
(注意,數學賦值識別符號只有簡寫作用,無提升效能作用)
傳值和傳址
賦值包含了傳值和傳址兩種賦值方式。傳值是基本資料的賦值方式,因為基本資料的值存放於棧中。傳值是引用資料的賦值方式,因為引用資料的值存放在堆中。
(上圖為基本資料賦值傳值方式,基本資料型別:string、number、boolean、undefined、null、symbol。)
(上圖為引用資料賦值是傳址的方式,由於引用資料的值只是指標指向同一堆地址,如果操作其中一個,其餘都會被聯動。)
(為variable name偷偷新增一個symbol。天吶variable name2居然也能呼叫!!!)
variable name生氣了怎麼辦呢?
拷貝
為解決該問題,就需要使用到拷貝。 也可以理解為只有在是引用性資料型別時,才用到深淺拷貝。
淺拷貝
先分析一下淺拷貝是否可用。淺拷貝:回先建立一個新的物件,該物件有原始值的精確拷貝,但是屬性值的拷貝是通過賦值來完成的。 也就會有傳說中的“只拷貝表面上的”一層。如果修改的是複雜型別值本身,還是會相互影響。
這不行,不符合 variable name的需求!
深拷貝
啊哦,淺拷貝並不能完全滿足variable name不想讓variable name2拿到它新收集到的資料。或許我們需要看看其他方法:深拷貝。
(上圖為深拷貝後的資料存放圖)
深拷貝後,會拷貝所有的屬性,並將拷貝屬性指向的動態分配的記憶體。深拷貝會另外建立一個一模一樣的堆,新物件和原物件不共享堆記憶體。所以修改物件的值,也不會相互影響。當物件和它所引用的物件一起拷貝時即發生深拷貝。可以使用遞迴、JSON.parse()與JSON.stringify()測試檢視效果。
嘗試一下,用深拷貝來完成variable name的需求:
完全可以!!!
(注意,文章圖中箭頭方向不代表指標方向!!variable name以及variable name2只是代表變數名的英文!!)