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

考虑下图:

图片

这就是你的前两行所做的:设置ab指向同一个对象。现在,当您更改b为 null 时:

图片

a不变。

于 2013-01-19T14:02:36.507 回答
0

它的工作原理就像它适用于任何其他值一样。尝试使用数字或字符串而不是对象:

var objA = 5
var objB = objA
objA = null;

关于对象(与数字等相反)的唯一特别之处是对象是可变的,因此如果您设置对象的属性,那么引用该对象的所有变量都会看到变化。

也许引用这个词让您感到困惑,认为它与 C++ 中的含义相同。事实上,在 Javascipt 中发生的事情是变量的行为更像指针(但没有指针算术,并且取消引用是隐式的)。因此,如果您有两个变量指向同一个对象,那么如果您通过 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

变量 objB = objA; objA = null;

于 2013-01-19T14:03:32.850 回答