javascript对象属性引用

时间:2013-12-21 18:44:30

标签: javascript object properties reference

有人可以对这里发生的事情给出最好的解释:

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

3 个答案:

答案 0 :(得分:1)

字符串按值复制,而不是参考。

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

答案 1 :(得分: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

答案 2 :(得分:0)

  

对象属性只是引用吗?

是和否。

当您更改(或删除)o.name时,它们不是“实时更新”含义中的引用,那么z.name将不会被更改。

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

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

  

z.name创建了o.name?

的副本

是。 JavaScript区分对象(具有可变属性)和原始值(不可变)。所有这些都是按值复制的 - JS中没有call-by / assign-by-reference,因此严格来说,z.nameo.name都引用了两个不同的值。但是,对象值是所谓的引用值,它们在复制时引用内存中相同的属性值结构。