少し前にJavaScriptの値の受け渡し方について改めて調べていたら、Passing by value vs. by referenceの話が大変参考になった。詳しくは上記リンクを参照。
簡単に言うと、JavaScriptの値の受け渡しは「Pass by value」なのだけど、渡す値がObjectの場合は、Objectが格納されている場所に関する情報が渡される。
つまり
var a = 0;
function f(x){
x = 10;
console.log(a, x);
};
f(a);
とすると、値が渡されただけなので、元のデータを参照しない。xは10だけど、aは0のままになる。
一方で、
var a = [0];
function f(x){
x[0] = 10;
console.log(a, x);
};
f(a);
とすると、渡された値が配列オブジェクトなので、xの値は元のオブジェクトが格納されている場所の情報になる。いわゆる参照渡しの状態になる。xは[10]となるし、aも[10]となる。
でも、
var a = [0];
function f(x){
x = [10];
console.log(a, x);
};
f(a);
とすると、xが新しい配列オブジェクトに置き換わることになり、元のオブジェクトaとの関連はなくなる。なので、aは[0]のままで、xは[10]となる。
というメモ。