迭代一个对象并具有ownproperty

iteration an object and hasownproperty

本文关键字:ownproperty 一个对象 迭代      更新时间:2023-09-26

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

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...in构造也在继承的属性上循环。

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

var s = new String();

则在属性中列出了所有可枚举的String函数,但不是作为自己的属性(即直接属性)。例如,在控制台中尝试以下操作:

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

您将发现一些有趣的函数,这些函数对于像formatUnicorn这样的SO开发人员来说可能是必不可少的。

通过此检查,可以克隆直接可枚举属性,而无需克隆原型属性。

请参阅有关MDN的文档。

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

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

这比在循环中使用for更好(并且可读)。

以下浏览器支持它:

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

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

相关文章: