如果不能搞懂原生 JS 的數值會怎麼變化,後續在編寫程式會遇上不小麻煩

call by value

在 JS 中的基本型別值,其賦予值的方式為此。
在做指派運算子時,其實是將 變數 指向

1
2
3
4
5
6
let a = 10
let b = a
a = 20

console.log(a) //20
console.log(b) //10

上述例子,即使 a 變動了, b 不會因此而跟著改變。
因為在 b = a 時, b 這個變數指向了 a 原本所指向的值 10

call by reference

1
2
3
4
5
6
let c = [1, 2, 3, 4]
let d = c
c[0] = 2

console.log(c) //[2, 2, 3, 4];
console.log(d) //[2, 2, 3, 4];

特別要注意的是,跟基本型別不同,
以上面為例,在複合型別時,
他們只會指向該 array, 而該 array 內的 的各個 slot 會再指向其儲存的
因此 d = c 之後改動了 c[0] 這個位址的值
d 也會跟著變化。
除了 array ,同樣的事情也會發生在 object

結論

基本型別值: call by value
複合型別: call by reference

reference

https://blog.techbridge.cc/2018/06/23/javascript-call-by-value-or-reference/)