在了解array methods方法時,可以先熟悉call by value 和 call by reference,以及深拷貝(deep copy),淺拷貝(shallow copy)

call by value ⇒ 值賦予值,兩個值各自改動互相不干擾

call by reference ⇒ 值賦予值,值為array或物件,參考記憶體位置相同,修改各自的值時會互相影響

由下圖的 JS資料型別可以分辨,左邊的type為基本資料型別call by value ,右邊的type為物件型別 call by reference

截圖 2021-10-07 上午10.08.33.png

傳參考 Ex:

會發生以下情況是因為array是參考記憶體的位置,而不是值本身,b = [222]已經修改了值,這樣a與b指向的參考位置就不同了

var a = [111];
var b = a
// 修改b值
b = [222]
console.log(a) // 111
console.log(b) // 222

call by reference (array)比照的是憶體位置,b = [111]已經修改了他的記憶體位置,即使值一樣,但比照的位置已經不同,所以最後回傳false

var a = [111]
var b = a
console.log(a === b) // true
b = [111]
console.log(a === b) // false

參考記憶體位置一樣,修改其中一個值時,兩者皆會變動

var a = [111, 222]
var b = a
b[2] = 333
console.log(a) // [111, 222, 333]
console.log(b) // [111, 222, 333]

淺拷貝(shallow copy)/深拷貝(deep copy) Ex:

知道了object屬性(Array, 物件...)有傳參考(call by reference)的特性,在只有一層的情況下可以使用淺層拷貝解決此問題

var a = [111, 222]
var b = [...a]
b[2] = 333
console.log(a) // [111, 222]
console.log(b) // [111, 222, 333]

淺拷貝只能拷貝到第一層(記憶體位置),會造成以下狀況發生

var a = [[1,2], [3,4]]
var b = [...a]
b[0][0] = 'change'
console.log(a) // [["change", 2], [3, 4]]
console.log(b) // [["change", 2], [3, 4]]