JavaScript では、プリミティブの変数は値によって渡され、オブジェクトの変数は参照によって渡されるのに対し、関数の引数ではプリミティブと参照の両方が値によって渡されるため、混乱の共通点が生じることを読んでいます。
いじり回しの過程で、次のコードを作成しましたが、頭を悩ませています。
> function setName2(obj) {
... obj.name="matt";
... obj = new Object();
... obj.name="obama";
... }
私が設定した場合
var person = new Object();
person.name = "michelle";
次に実行します
> setName2(person);
私は得る
> person.name;
'matt'
作成された新しいオブジェクトはローカル オブジェクトへのポインターであり、グローバルな「人」のプロパティには影響しないため、これは理にかなっています。
ただし、最初に設定した場合はどうなりますか
var obj = new Object();
obj.name = "michelle";
次に実行します
> setName2(obj);
?
私は同じ結果を得ます。これは、コンパイラが同じ名前の 2 つの変数 (obj グローバルと obj ローカル) をヒープ内の異なる場所への参照として認識し、それぞれが異なるポインターの関連付けを持っていることを意味するのでしょうか、それともこの現象には別の説明がありますか?