有人可以对这里发生的事情给出最好的解释:
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
答案 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.name
和o.name
都引用了两个不同的值。但是,对象值是所谓的引用值,它们在复制时引用内存中相同的属性值结构。