为什么在 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
考虑下图:
这就是你的前两行所做的:设置a
和b
指向同一个对象。现在,当您更改b
为 null 时:
a
不变。
它的工作原理就像它适用于任何其他值一样。尝试使用数字或字符串而不是对象:
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;