1

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

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循环中首先对其进行迭代。

我错过了什么吗?

4

3 回答 3

3

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

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

var s = new String();

那么您String在属性中列出了所有可枚举函数,但不是作为自己的属性(即直接属性)。例如在控制台中试试这个:

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

您会发现一些有趣的功能,这些功能对于 SO 开发人员来说可能是必不可少的,例如formatUnicorn.

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

请参阅MDN 上的文档

于 2013-07-13T18:30:46.357 回答
1

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

于 2013-07-13T18:31:05.627 回答
1

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

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

它在这些浏览器上受支持:

  • 火狐(壁虎):4(2.0)
  • 铬:5
  • 互联网浏览器:9

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

于 2013-08-13T07:22:39.463 回答