对象中属性的JS赋值顺序

JS assignment order of properties in objects

本文关键字:赋值 顺序 JS 属性 对象      更新时间:2023-09-26

刚才有一个快速的问题,关于为什么某个分配顺序有效,而另一个则无效。

我想创建一个简单的"inherit"/"copy"函数(只是为了测试它),将属性从一个对象复制到另一个对象:

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);

您正在对obj1的所有属性进行循环,因此所有这些属性都存在于obj1上。

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

您正在读取属性var p in obj1,因此这些索引必然只存在于obj1中。因此,尝试分配obj1[p] = obj2[p];不会像预期的那样工作,因为不能保证(在您的特定示例中肯定是这样)obj[p]已经定义。此分配将简单地将undefined分配给obj1中不存在于obj2中的索引,并复制obj2中确实存在索引的值。

您需要分别对每个对象的属性进行循环(即两个循环),尽管这也不是一个好主意,因为在两个对象上具有相同索引的任何值都会导致一个值被删除。你到底想通过这种方式实现什么?这似乎是一件非常危险/不稳定的事情。