迭代一个对象和hasownproperty

时间:2013-07-13 18:27:36

标签: javascript object

我在这里看一个克隆对象函数:

http://jsperf.com/cloning-an-object/2

功能是:

function clone(obj) {
    var target = {};
    for (var i in obj) {
        if (obj.hasOwnProperty(i)) {
            target[i] = obj[i];
        }
    }
    return target;
}

我想知道为什么检查

if (obj.hasOwnProperty(i))

需要吗?

因为如果属性 i 不在对象 obj 中,则不会在 for 循环中首先进行迭代。

我错过了什么吗?

3 个答案:

答案 0 :(得分:3)

for...in构造也循环继承属性。

如果使用构造函数创建对象,例如:

var s = new String();

然后您在属性中列出了所有可枚举的String函数,但不是拥有属性(即直接属性)。例如,在控制台中尝试:

for (var k in s) console.log(k)

你会发现一些有趣的功能对于formatUnicorn等SO开发人员来说可能是不可或缺的。

此检查允许您克隆直接可枚举属性,而无需克隆原型属性。

请参阅documentation on the MDN

答案 1 :(得分:1)

因为原始循环还将显示原型对象的属性,这是您不想要的。

答案 2 :(得分:1)

值得一提的是,从JavaScript 1.8.5开始,您可以使用Object.keys(obj)来获取在对象本身上定义的属性数组 (对obj.hasOwnProperty(key)返回true的那些)。

这比使用for-in循环更好(和可读)。

在这些浏览器上支持:

  • Firefox(Gecko):4(2.0)
  • Chrome:5
  • Internet Explorer:9

更多信息 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys