2013-12-21 47 views
1

能有人给这到底是怎么回事最好的解释:JavaScript对象的属性引用

var o = { 
    name: "jack" 
}; 

var z = { 
    name: o.name 
}; 

o = {}; 
alert(z.name); // expected undefined, shows "jack" instead 

是对象的属性只是引用?销毁对象o似乎并不会破坏引用的对象(在本例中为字符串“jack”)。或者,是不是由o.name引用的“jack”实际上被销毁,而z.name是否创建了o.name的副本?

最佳

// consider this too 
var o = { 
    foo: function() { 
     return "hello"; 
    } 
}; 

var z = { 
    m: o.foo 
}; 

o = {}; 
alert(z.m()); // hello is displayed 

回答

1

串由值复制,不能引用。

即使这不是原因,对象只能通过引用来处理,因此覆盖o时引用的新对象不会更改对旧对象的任何引用。

+0

字符串通常以类似于对象的方式通过引用来复制。我们不会这么想,因为它们是不可改变的。这更多的是实现细节。 –

1

您可能会觉得这更有趣。

var o = { 
    name: "Jack" 
}; 

var z = { 
    name: o 
}; 

//Above assignment of 'o' to z.name will create a new alias to object 'o'. 
//So both 'o' and 'z.name' point to same object. 

//When you change value inside 'o' it will still reflect in 'z.name' 
//because both point to same object 
o.name="Jill"; 
console.log(z.name.name); // Logs : Jill and not Jack. 

// Now, here you are actually assigning a new object to 'o'. 
// This means now 'o' refers to a new object. But this will no way affect 
// the 'z.name' reference, it still points to same object. 
o = { name : "Joe"}; 
console.log(z.name.name); // Logs : Jill again and not Joe 
+0

我认为我们可以放心地说原始类型:数字,字符串,布尔值,空值,未定义值的语义和所有其他(对象)具有引用语义。我们也可以说原始类型具有引用语义,但它们是不可变的。 – user3124390

+0

是的,试着用一个例子解释同样的事情。 –

0

是对象的属性只是引用?

是和

号他们不是当您更改(或删除)在“活更新”的含义参考,o.name然后z.name将不会改变。

它们是将一些任意值(带有属性名称)绑定到对象的引用。这些值将独立存在,只有在没有人再对它们进行处理时才会被忘记(从内存中删除)。

您可能会对EcmaScript规范中的overview of Objects感兴趣。

z.name是否创建了o.name的副本?

是的。 JavaScript区分对象(具有可变属性)和原始值(不可变)。所有这些都是按值复制的 - 在JS中没有任何引用/分配引用 - 所以严格来说,z.nameo.name都引用两个不同的值。然而,对象值是所谓的参考值,只要它们被复制,它们在内存中引用相同的属性值结构。