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

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


当前回答

检查类型

您可以检查propt如何表示对象属性

typeof propt

发现它只是一个字符串(属性名称)。由于for in js“内置”循环的工作方式,它会生成对象中的每个属性。

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

其他回答

这是为了。。。in语句(MDN、ECMAScript规范)。

您可以将其读为“对于obj对象中的每个属性,依次将每个属性分配给PROPT变量”。

为了进一步完善接受的答案,值得注意的是,如果使用var object=object.create(null)实例化对象,那么object.hasOwnProperty(property)将触发TypeError。所以为了安全起见,您需要从原型中调用它,如下所示:

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

如果运行Node,我建议:

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

虽然最高评级的答案是正确的,但这里有一个备用用例,即如果您正在迭代一个对象,并希望最终创建一个数组。使用.map而不是forEach

const newObj = Object.keys(obj).map(el => {
    //ell will hold keys 
   // Getting the value of the keys should be as simple as obj[el]
})

添加ES2015对Reflect.ownKeys(obj)的使用,并通过迭代器迭代财产。

例如:

let obj = { a: 'Carrot', b: 'Potato', Car: { doors: 4 } };

可以通过

// logs each key
Reflect.ownKeys(obj).forEach(key => console.log(key));

如果您想直接迭代对象的键的值,可以定义迭代器,就像JavaScipts的字符串、数组、类型化数组、Map和Set的默认迭代器一样。

JS将尝试通过默认迭代器属性进行迭代,该属性必须定义为Symbol.iterator。

如果希望能够遍历所有对象,可以将其添加为Object的原型:

Object.prototype[Symbol.iterator] = function*() { 
    for(p of Reflect.ownKeys(this)){ yield this[p]; }
}

这将使您能够使用for。。。例如:

for(val of obj) { console.log('Value is:' + val ) }

注意:截至撰写此答案(2018年6月),除IE外,所有其他浏览器都支持生成器和。。。通过Symbol.iterator迭代