これが私の質問を表現する正しい方法であるかどうかはわかりません。次の JavaScript コードを設定するとします。
var x = 5;
var y = function(z) {
z=7;
return z;
}
y(x);
x;
7関数呼び出しから返されますxが、元の値のままです。JavaScript 変数は参照によって呼び出されると思っていたのにx、なぜ の値が実際には関数によって変更されないのでしょうか?
これが私の質問を表現する正しい方法であるかどうかはわかりません。次の JavaScript コードを設定するとします。
var x = 5;
var y = function(z) {
z=7;
return z;
}
y(x);
x;
7関数呼び出しから返されますxが、元の値のままです。JavaScript 変数は参照によって呼び出されると思っていたのにx、なぜ の値が実際には関数によって変更されないのでしょうか?
ここでの本当の問題は、何も変更していないことです。関数で変数zを再割り当てしているだけです。オブジェクトまたは配列を渡しても違いはありません。
var x = ['test'];
var y = function(z) {
z=['foo'];
return z;
}
y(x);
x; // Still ['test']
さて、他の人が言ったことも真実です。プリミティブは変更できません。次のコードが機能するため、これは実際には思ったよりも興味深いものです。
> var x = 1;
> x.foo = 'bar';
"bar"
> x
1
> x.foo
undefined
への割り当てx.fooが一見成功したように見えx.fooますが、どこにも見つからないことに注意してください。これは、JavaScript がプリミティブ型とオブジェクト型を容易に強制するためです (通常のオブジェクトであるプリミティブの「オブジェクト」バージョンがあります)。この場合、プリミティブ1は新しいオブジェクト ( ) に強制されnew Number(1)、そのfoo属性が設定され、すぐに破棄されるため、永続的な効果は発生しません。
このメモについて@TeddHoppに感謝します:
プリミティブだけでなく、すべての変数に値のみが渡されます。変数を関数に渡して、呼び出し元のコードで変数を変更することはできません。(確かに、渡される可能性のあるオブジェクトまたは配列を変更できます。ただし、変数自体は呼び出しコードで変更されません。)
xとにかくの値を変更したい場合は、次のようにします。
x = y(x);