为什么在JavaScript中将父对象设置为null时,引用的对象不会设置为null?
var objA = { 1 : "hello" };
var objB = objA;
objA = null;
console.log(objB); // { 1 : "hello" }
为什么objB
未设置为null
?对象引用如何在这里工作?
答案 0 :(得分:3)
变量永远不会“包含”对象,它们只包含对象的引用。
var objB = objA;
只是复制objA
中存储的引用,使它们指向同一个对象。当objA
设置为null
时,表示它不再指向任何内容。但是,objB
仍包含对象的引用。
答案 1 :(得分:2)
在您的示例中,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
没有变化。
答案 2 :(得分:0)
它适用于任何其他值。尝试使用数字或字符串代替对象:
var objA = 5
var objB = objA
objA = null;
对象的唯一特殊之处(与数字等相反)是对象是可变的,因此如果设置对象的属性,则引用该对象的所有变量都将看到更改。
或许引用这个词会让你觉得它与C ++中的含义相同。事实上,在Javascipt中发生的事情是变量的行为更像指针(但没有指针算法,并且derefferencing是隐式的)。因此,如果您有两个指向同一对象的变量,那么如果您通过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;