JavaScriptで親オブジェクトがnullに設定されている場合、参照されるオブジェクトがnullに設定されないのはなぜですか?
var objA = { 1 : "hello" };
var objB = objA;
objA = null;
console.log(objB); // { 1 : "hello" }
objB
が に設定されていないのはなぜnull
ですか? オブジェクト参照はここでどのように機能しますか?
JavaScriptで親オブジェクトがnullに設定されている場合、参照されるオブジェクトがnullに設定されないのはなぜですか?
var objA = { 1 : "hello" };
var objB = objA;
objA = null;
console.log(objB); // { 1 : "hello" }
objB
が に設定されていないのはなぜnull
ですか? オブジェクト参照はここでどのように機能しますか?
変数はオブジェクトを「含む」ことはなく、単にオブジェクトへの参照を含みます。
var objB = objA;
に格納されている参照を単純にコピーしobjA
て、同じオブジェクトを指すようにします。objA
が に設定されている場合null
、何も指していないことを意味します。ただし、objB
オブジェクトへの参照はまだ含まれています。
あなたの例では、参照objB
していませんobjA
。現在参照しているものを参照しobjA
ます。したがって、変更objA
しても には影響しませんobjB
。
次のように考えてください。
var a = "test"; //a -> "test"
var b = a; //a -> "test" <- b
a = null; //a -> null, "test" <- b
次の画像を検討してください。
これは、最初の 2 行で行うことです: seta
とb
to は同じオブジェクトを指します。b
nullに変更すると、次のようになります。
a
変更されていません。
他の値と同じように機能します。オブジェクトの代わりに数値または文字列を使用してみてください。
var objA = 5
var objB = objA
objA = null;
(数値などとは対照的に) オブジェクトに関する唯一の特別な点は、オブジェクトが変更可能であるため、オブジェクトのプロパティを設定すると、そのオブジェクトを参照するすべての変数に変更が反映されることです。
おそらく、参照という言葉は、C++ での意味と同じ意味を持っていると考えるのを混乱させているかもしれません。実際、Javascipt で起こっていることは、変数がよりポインターのように振る舞うことです (ただし、ポインター演算はなく、間接参照は暗黙的です)。したがって、同じオブジェクトを指す 2 つの変数がある場合、oe ポインターを介してプロパティを変更すると、もう一方のポインターを介しても表示されます。一方、ポインターの値を他のポインターに割り当てて変更すると、その場所を指していた他のポインターは変更されません。
したがって、例をCに翻訳すると、次のようになります
Obj *a = malloc_new_obj()
Obj *b = a;
//Both pointers point to the same object
a->some_property = 10
printf("%d\n", b->some_property); //should get 10 too
//but assigning the pointer itself doesn't change the otehr pointers
a = NULL;
printf("%d\n", b->some_property); //should still work
var objB = objA; objA = null;