pass by Value vs pass by Reference
javascript 總是 pass by reference
例一、
var a = 1;
意思是將這個 1 的 object 的位址 assign 給 a 變數。
例二、
var a = 1; var b = a;
意思是將這個 1 的 object 的位址 assign 給 a 變數;
再將 a 所參考的位置 reassign 給 b,這時 b 的參考位置將會向這個 1 的 object 的位址。
例三、
var d = { num: 1 }; var e = d;
意思是將這個 1 的 object 的位址 assign 給 num 屬性;
{ } object 擁有 num 屬性;
而這 { } object 的位址 assign 給 d 變數;
然後再將 d 所參考的位置 reassign 給 e,這時 e 的參考位置將會向這個 { } 的 object 的位址。
有了以上觀念之後,再來看其他容易誤導例子
例四、
var a = 1; var b = a; console.log(a); console.log(b); a = 0; console.log(a); console.log(b);
b 是參考到 1 object 這位址,所以當 a 重新參考到 0 object 這位址時,
並不會影響到 b。
例五、
var d = { num: 1 }; var e = d; console.log(d); console.log(e); d.num = 2; console.log(d); console.log(e);
e 是參考到 { } object 這位址,{ } object 擁有 num 屬性,當 num 屬性重新參考到 2 object 時,
e 去取 num 屬性值時,將會參考到 2 這個 object。
再來看 function scope 例子
例六、
var f = 1; var Foo = (val) => { val = 2; }; Foo(f); console.log(f);
Foo function 參數 val 的參考位址將會指到呼叫 Foo function 所代進來的變數 f,
Foo(f) 的意思是將 f 所參考到 1 object 的位址,reassign 給參數 val,
也就是參數 val 的參考位址將會指到 1 object 的位址;
而當 Foo function 將 val 的參考位址重新指到 2 object 的位址時,
並不會影響到 f 所參考到 1 object 的位址。
例七、
var b = { num: 1 }; var changeB = (val) => { val.num = 2; }; changeB(b); console.log(b);
changeB function 參數 val 的參考位址將會指到呼叫 changeB function 所代進來的變數 b,
changeB(b) 的意思是將 b 所參考到 { } object 的位址,reassign 給參數 val,
也就是參數 val 的參考位址將會指到 { } object 的位址;
當參數 val 的 num 屬性重新指到 2 object 位址時,
變數 b 的 num 屬性也將會參考到 2 這個 object。