变量obj={name:“西蒙”,年龄:“20”,服装:{style:“简单”,嬉皮士:假}}for(obj中的var propt){console.log(propt+':'+obj[propt]);}
变量propt如何表示对象的财产?它不是内置方法或属性。为什么它会产生对象中的每个属性?
变量obj={name:“西蒙”,年龄:“20”,服装:{style:“简单”,嬉皮士:假}}for(obj中的var propt){console.log(propt+':'+obj[propt]);}
变量propt如何表示对象的财产?它不是内置方法或属性。为什么它会产生对象中的每个属性?
当前回答
用于。。。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循环则相反。
我希望这有帮助。
其他回答
这是为了。。。in语句(MDN、ECMAScript规范)。
您可以将其读为“对于obj对象中的每个属性,依次将每个属性分配给PROPT变量”。
检查类型
您可以检查propt如何表示对象属性
typeof propt
发现它只是一个字符串(属性名称)。由于for in js“内置”循环的工作方式,它会生成对象中的每个属性。
变量obj={name:“西蒙”,年龄:“20”,服装:{style:“简单”,嬉皮士:假}}for(obj中的var propt){console.log(propt类型,propt+:“+obj[propt]);}
在ES的最新实现中,您可以使用Object.entries:
for (const [key, value] of Object.entries(obj)) { }
or
Object.entries(obj).forEach(([key, value]) => ...)
如果您只想迭代这些值,请使用Object.values:
for (const value of Object.values(obj)) { }
or
Object.values(obj).forEach(value => ...)
你可以使用Lodash。文件
var obj = {a: 1, b: 2, c: 3};
_.keys(obj).forEach(function (key) {
...
});
添加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迭代