0

JavaScriptで親オブジェクトがnullに設定されている場合、参照されるオブジェクトがnullに設定されないのはなぜですか?

var objA = { 1 : "hello" };
var objB = objA;
objA = null;

console.log(objB);  // { 1 : "hello" }

objBが に設定されていないのはなぜnullですか? オブジェクト参照はここでどのように機能しますか?

4

3 に答える 3

3

変数はオブジェクトを「含む」ことはなく、単にオブジェクトへの参照を含みます。

var objB = objA;に格納されている参照を単純にコピーしobjAて、同じオブジェクトを指すようにします。objAが に設定されている場合null、何も指していないことを意味します。ただし、objBオブジェクトへの参照はまだ含まれています。

于 2013-01-19T14:03:06.047 に答える
2

あなたの例では、参照objB していませんobjA。現在参照しているものを参照しobjAます。したがって、変更objAしても には影響しませんobjB

次のように考えてください。

var a = "test"; //a -> "test"
var b = a;      //a -> "test" <- b
a = null; //a -> null, "test" <- b

次の画像を検討してください。

画像

これは、最初の 2 行で行うことです: setabto は同じオブジェクトを指します。bnullに変更すると、次のようになります。

画像

a変更されていません。

于 2013-01-19T14:02:36.507 に答える
0

他の値と同じように機能します。オブジェクトの代わりに数値または文字列を使用してみてください。

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;

于 2013-01-19T14:03:32.850 に答える