原文:MDN - for...in(详情可以点击本篇阅读原文)
功能:
for...in
语句以任意顺序遍历一个对象的除Symbol
以外的可枚举属性。语法:
for (variable in object) { statement }
variable
:在每次迭代时,variable
会被赋值为不同的属性名。object
:非Symbol
类型的可枚举属性被迭代的对象。
说明:
for...in
循环只遍历可枚举属性。
像 Array
和 Object
使用内置构造函数所创建的对象都会继承自 Object.prototype
和 String.prototype
的不可枚举属性,例如 String
的 indexOf()
方法或 Object
的 toString()
方法。
循环将遍历对象本身的所有可枚举属性,以及对象从其构造函数原型中继承的属性(更接近原型链中对象的属性覆盖原型属性)。
通常,在迭代过程中最好不要在对象上进行添加、修改或者删除属性的操作,除非是对当前正在被访问的属性。
提示:
for...in
不应该用于迭代一个Array
,其中索引顺序很重要。如果迭代访问顺序很重要时,最好使用for
或者Array.prototype.forEach()
或者for...of
循环。
如果仅迭代对象本身的属性,可以使用
getOwnPropertyNames()
或者执行hasOwnProperty()
来确定某属性是否是对象本身的属性。
代码:
// 案例 1
const obj1 = {
a: 1,
b: 2,
c: 3,
};
for (let prop in obj1) {
console.log('Object.' + prop + ' = ' + obj1[prop]);
}
/**
* 'Object.a = 1'
* 'Object.b = 2'
* 'Object.c = 3'
*/
// 案例 2
const triangle = {
a: 1,
b: 2,
c: 3,
};
function ColoredTriangle() {
this.color = 'deepbluesky';
}
ColoredTriangle.prototype = triangle;
const obj2 = new ColoredTriangle();
for (let prop in obj2) {
if (obj2.hasOwnProperty(prop)) {
console.log(`Object.${prop} = ${obj2[prop]}`);
}
}
/**
* 'Object.color = deepbluesky'
*/
jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。