当父对象设置为null时,为什么引用对象仍然可用

时间:2013-01-19 13:59:24

标签: javascript

为什么在JavaScript中将父对象设置为null时,引用的对象不会设置为null?

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

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

为什么objB未设置为null?对象引用如何在这里工作?

3 个答案:

答案 0 :(得分:3)

变量永远不会“包含”对象,它们只包含对象的引用

var objB = objA;只是复制objA中存储的引用,使它们指向同一个对象。当objA设置为null时,表示它不再指向任何内容。但是,objB仍包含对象的引用。

答案 1 :(得分:2)

在您的示例中,objB 引用objA。它引用了objA当前引用的内容。因此,修改objAobjB无效。

这样想:

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

考虑以下图片:

image

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

image

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;