在[進階 js 01] 變數的資料型態 裡提到 primitive type 和 object 最大差別,除了primitive type 是 Immutable 不能改變以外,還有對於 =
這個賦值這個符號的反應有點不太一樣
例子如下 :
var a = 10
var b = a
console.log(a, b)
b = 200
console.log(a, b)
// 第一個 log 是 10 10
// 第二個 log 是 10 200
想說這樣不是很正常嗎?
讓我們繼續看下去
var obj = {
number: 10
}
var obj2 = obj
console.log(obj, obj2)
obj2.number = 20
console.log(obj, obj2)
// 第一個 log 是 {number: 10} {number: 10}
// 第二個 log 是 {number: 20} {number: 20}
會發現明明只有改 obj2
的值,但連 obj
也一起被改變,這也是 primitive type 和 object 很大的差別之一
在[ JavaScript 06 ] function 傳參數的運作機制裡有提到因為牽扯到底層運作,有圖比較好理解,這邊就不多放一次了
這情形也同樣適用在 array
var arr = []
var arr2 = arr
console.log(arr, arr2)
arr2.push('arr2')
console.log(arr, arr2)
// 第一個 log 是 [] []
// 第二個 log 是 ['arr2'] ['arr2']
因為他們指向同一個記憶體位置,所以改的時候會一起被改到
但今天改成
var arr = []
var arr2 = arr
console.log(arr, arr2)
arr2 = ['arr2']
console.log(arr, arr2)
// 第一個 log 是 [] []
// 第二個 log 是 [] ['arr2']
因為用 =
賦值的時候,意思是會不一樣
arr2 = ['arr2']
這行做法會是 =
後面先給他一個新的記憶體位置,再去改值
所以如果用 .
代表他指到的記憶體底下的某個屬性
用 =
代表開一個新的記憶體存一個新的物件