2011-06-29 61 views
0

对于为什么某个赋值顺序起作用而另一个顺序不起作用有一个简短的问题。对象中属性的JS赋值顺序

我想创建一个简单的“继承” /“复制”(只是为了测试它)函数副本的属性从一个对象到另一个对象:

var cat = { tail:"yes", hairy:"yes, hairy" }; 
var dog = { sick:"extremely ill"}; 

function inherit(obj1, obj2) { 
    for (var p in obj1) 
    { 
    obj2[p] = obj1[p]; // this works, but "obj1[p] = obj2[p];" doesn't. Why?? 
    } 
} 

inherit(cat, dog); 

console.log(dog.tail); 

回答

1

您遍历的obj1所有属性,因此所有这些属性都存在于obj1

如果您尝试从obj2复制,那么您试图复制不存在的属性(在该对象上),因此导致错误。

+0

感谢您的回答:) – devdev

1

您正在阅读属性var p in obj1,因此这些索引仅存在于obj1中。因此,尝试分配obj1[p] = obj2[p];将无法​​按预期工作,因为无法保证(并且在您的特定示例中肯定是这种情况)obj[p]已定义。此作业将简单地将undefined分配给obj1obj2中不存在的索引,并复制索引确实存在于obj2中的值。

您需要分别循环每个对象的属性(即两个循环),但这也不是一个好主意,因为任何具有相同索引的值都会导致一个对象被擦除。你究竟想通过这个实现什么?这似乎是一个非常危险/不稳定的事情。

+0

+1当然,OP可以控制两个对象在哪里有一个特定的键,至少有'obj2 [p] = obj2 [p] || obj1 [p];'(或者一些变体,如果你可能会分配falsy值)。如果这只是一个编程练习来学习循环和分配,这是一个公平的问题,国际海事组织。 – brymck

+0

@Bryan,我不是说这个问题不是一个有效的问题,只是代码的意图/目的不明确,没有明确定义。你可以用碰撞键做很多事情,我的问题是OP在这种情况下的意图不清楚。 – davin