私の 2 セント.... JavaScript がパラメーターを参照または値で渡すかどうかは関係ありません。本当に重要なのは、代入と突然変異です。
このリンクに、より長く、より詳細な説明を書きました。
何か (オブジェクトであろうとプリミティブであろうと) を渡すと、JavaScript は関数内で新しい変数を割り当てるだけです... 等号 ( =
) を使用するのと同じように。
そのパラメーターが関数内でどのように動作するかは、等号を使用して新しい変数を割り当てた場合の動作とまったく同じです... これらの簡単な例を見てください。
var myString = 'Test string 1';
// Assignment - A link to the same place as myString
var sameString = myString;
// If I change sameString, it will not modify myString,
// it just re-assigns it to a whole new string
sameString = 'New string';
console.log(myString); // Logs 'Test string 1';
console.log(sameString); // Logs 'New string';
myString
パラメータとして関数に渡すと、関数は単に新しい変数に代入したかのように動作します。さて、同じことをしましょう。ただし、単純な割り当ての代わりに関数を使用します。
function myFunc(sameString) {
// Reassignment... Again, it will not modify myString
sameString = 'New string';
}
var myString = 'Test string 1';
// This behaves the same as if we said sameString = myString
myFunc(myString);
console.log(myString); // Again, logs 'Test string 1';
オブジェクトを関数に渡すときにオブジェクトを変更できる唯一の理由は、再割り当てを行っていないためです...代わりに、オブジェクトを変更または変更できます....繰り返しますが、同じように機能します。
var myObject = { name: 'Joe'; }
// Assignment - We simply link to the same object
var sameObject = myObject;
// This time, we can mutate it. So a change to myObject affects sameObject and visa versa
myObject.name = 'Jack';
console.log(sameObject.name); // Logs 'Jack'
sameObject.name = 'Jill';
console.log(myObject.name); // Logs 'Jill'
// If we re-assign it, the link is lost
sameObject = { name: 'Howard' };
console.log(myObject.name); // Logs 'Jill'
myObject
パラメータとして関数に渡すと、関数は単に新しい変数に代入したかのように動作します。繰り返しますが、まったく同じ動作で同じことですが、関数があります。
function myFunc(sameObject) {
// We mutate the object, so the myObject gets the change too... just like before.
sameObject.name = 'Jill';
// But, if we re-assign it, the link is lost
sameObject = {
name: 'Howard'
};
}
var myObject = {
name: 'Joe'
};
// This behaves the same as if we said sameObject = myObject;
myFunc(myObject);
console.log(myObject.name); // Logs 'Jill'
変数を関数に渡すたびに、等号を使用した場合と同様に、パラメーターの名前が何であれ「代入」しています=
。
等号=
は割り当てを意味することを常に覚えておいてください。また、関数にパラメーターを渡すことは、代入も意味します。それらは同じであり、2 つの変数はまったく同じ方法で接続されます。
変数の変更が別の変数に影響を与えるのは、基になるオブジェクトが変更されたときだけです。
オブジェクトとプリミティブを区別しても意味がありません。関数がなく、等号を使用して新しい変数に代入した場合とまったく同じように機能するからです。