变量obj={name:“西蒙”,年龄:“20”,服装:{style:“简单”,嬉皮士:假}}for(obj中的var propt){console.log(propt+':'+obj[propt]);}

变量propt如何表示对象的财产?它不是内置方法或属性。为什么它会产生对象中的每个属性?


当前回答

迭代财产需要额外的hasOwnProperty检查:

for (var prop in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, prop)) {
        // do stuff
    }
}

这是必要的,因为对象的原型包含对象的附加财产,这些属性在技术上是对象的一部分。这些附加的财产继承自基本对象类,但仍然是obj的财产。

hasOwnProperty只是检查这是否是该类特有的属性,而不是从基类继承的属性。


也可以通过对象本身调用hasOwnProperty:

if (obj.hasOwnProperty(prop)) {
    // do stuff
}

但如果对象具有同名的不相关字段,则此操作将失败:

var obj = { foo: 42, hasOwnProperty: 'lol' };
obj.hasOwnProperty('foo');  // TypeError: hasOwnProperty is not a function

这就是为什么通过Object.prototype调用它更安全的原因:

var obj = { foo: 42, hasOwnProperty: 'lol' };
Object.prototype.hasOwnProperty.call(obj, 'foo');  // true

其他回答

上面的答案有点烦人,因为在你确定它是一个对象之后,它们没有解释你在for循环中做什么:你没有直接访问它!实际上,您只收到了需要应用于OBJ的密钥:

var obj = {
  a: "foo",
  b: "bar",
  c: "foobar"
};

// We need to iterate the string keys (not the objects)
for(var someKey in obj)
{
  // We check if this key exists in the obj
  if (obj.hasOwnProperty(someKey))
  {
    // someKey is only the KEY (string)! Use it to get the obj:
    var myActualPropFromObj = obj[someKey]; // Since dynamic, use [] since the key isn't literally named "someKey"

    // NOW you can treat it like an obj
    var shouldBeBar = myActualPropFromObj.b;
  }
}

这是所有ECMA5安全的。甚至可以在Rhino等蹩脚的JS版本中使用;)

用于。。。in循环表示对象中的每个属性,因为它就像for循环。您在for中定义了propt。。。在循环中执行以下操作:

    for(var propt in obj){
alert(propt + ': ' + obj[propt]);
}

A代表。。。在循环中迭代对象的可枚举财产。无论您定义哪个变量,或将其放入for。。。在循环中,每次转到它迭代的下一个属性时都会发生更改。for中的变量。。。in循环遍历键,但它的值是键的值。例如:

    for(var propt in obj) {
      console.log(propt);//logs name
      console.log(obj[propt]);//logs "Simon"
    }

您可以看到变量与变量值的区别。相比之下,a for。。。of循环则相反。

我希望这有帮助。

你可以使用Lodash。文件

var obj = {a: 1, b: 2, c: 3};
_.keys(obj).forEach(function (key) {
    ...
});

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

Object.keys(obj).forEach(function(key,index) {
    // key: the name of the object key
    // index: the ordinal position of the key within the object 
});

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

这些浏览器支持:

Firefox(壁虎):4(2.0)铬:5Internet Explorer:9

有关更多信息,请参阅Mozilla Developer Network Object.keys()的参考。

如果运行Node,我建议:

Object.keys(obj).forEach((key, index) => {
    console.log(key);
});