我在这里看一个克隆对象函数:
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 循环中首先进行迭代。
我错过了什么吗?
答案 0 :(得分:3)
for...in
构造也循环继承属性。
如果使用构造函数创建对象,例如:
var s = new String();
然后您在属性中列出了所有可枚举的String
函数,但不是拥有属性(即直接属性)。例如,在控制台中尝试:
for (var k in s) console.log(k)
你会发现一些有趣的功能对于formatUnicorn
等SO开发人员来说可能是不可或缺的。
此检查允许您克隆直接可枚举属性,而无需克隆原型属性。
答案 1 :(得分:1)
因为原始循环还将显示原型对象的属性,这是您不想要的。
答案 2 :(得分:1)
值得一提的是,从JavaScript 1.8.5开始,您可以使用Object.keys(obj)
来获取在对象本身上定义的属性数组
(对obj.hasOwnProperty(key)
返回true的那些)。
这比使用for-in循环更好(和可读)。
在这些浏览器上支持:
更多信息 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys