Javascript 迭代对象和hasownproperty

Javascript 迭代对象和hasownproperty,javascript,object,Javascript,Object,我在这里查看克隆对象函数: 功能是: 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不在对象ob

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

功能是:

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循环中首先迭代


我遗漏了什么吗?

中的“
for…”构造也在继承属性上循环

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

var s = new String();
然后,属性中列出了所有可枚举的
String
函数,但不作为own属性(即直接属性)列出。例如,在控制台中尝试以下操作:

for (var k in s) console.log(k)
您将发现一些有趣的函数,这些函数对于像
formatUnicorn
这样的开发人员来说可能是必不可少的

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


请参阅。

中的
for…in
构造也会在继承的属性上循环

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

var s = new String();
然后,属性中列出了所有可枚举的
String
函数,但不作为own属性(即直接属性)列出。例如,在控制台中尝试以下操作:

for (var k in s) console.log(k)
您将发现一些有趣的函数,这些函数对于像
formatUnicorn
这样的开发人员来说可能是必不可少的

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


请参阅。

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

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

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

这比使用for-in-loop更好(更可读)

以下浏览器支持它:

  • 火狐(壁虎):4(2.0)
  • 铬:5
  • Internet Explorer:9
更多关于

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

这比使用for-in-loop更好(更可读)

以下浏览器支持它:

  • 火狐(壁虎):4(2.0)
  • 铬:5
  • Internet Explorer:9
更多关于

可以从prototype继承。可以从prototype继承。@JanDvorak您添加的每个函数有时都是可枚举的-尤其是在较旧的实现中,您可能希望使用hasOwnPropertyName来过滤原型上的内容。@BenjaminGruenbaum是的,但大多数函数都是预先存在的,因此不可枚举。绝对不是“所有字符串函数”都是可枚举的。@JanDvorak您添加的每个函数有时都是可枚举的-尤其是在较旧的实现中,您可能希望使用hasOwnPropertyName来过滤原型上的内容。@BenjaminGruenbaum是的,但大多数函数都是预先存在的,因此不可枚举。绝对不是“所有字符串函数”都是可枚举的。