for...in 语句

for...in 语句用于遍历数组或者对象的属性(对数组或者对象的属性进行循环操作)。

语法

for (property in expression) statement;

参数

参数类型描述
property任意类型每次迭代时,将不同的属性名分配给变量。
expressionObject 类型被迭代枚举其属性的对象。
statement-循环执行代码块。

描述

  • for...in 循环只遍历可枚举属性。循环将遍历对象本身的所有可枚举属性,以及对象从其构造函数原型中继承的属性(更接近原型链中对象的属性覆盖原型属性)。
  • for...in 不应该用于迭代一个数组,其中索引顺序很重要。数组索引只是具有整数名称的枚举属性,并且与通用对象属性相同。不能保证 for...in 将以任何特定的顺序返回索引。for...in 循环语句将返回所有可枚举属性,包括非整数类型的名称和继承的那些。因为迭代的顺序是依赖于执行环境的,所以数组遍历不一定按次序访问元素。因此当迭代访问顺序很重要的数组时,最好用整数索引去进行 for 循环(或用 Array.prototype.forEach()for...of 循环)。
  • ECMAScript 对象的属性没有顺序,因此通过 for...in 循环输出的属性名的顺序是不可预测的。具体来说,所有可枚举的属性都会被返回一次,但返回的先后次序可能会因为浏览器而异。
  • 迭代的对象的变量值为 nullundefinedfor...in 语句不抛出错误,但不会执行循环体(ECMAScript5 以上版本可行)。为了保证最大限度的兼容性,建议使用 for...in 之前,先检测确认该对象的值不是 nullundefined

示例

代码示例

for (var propName in window) {
console.log(propName);
}

提取实例自身属性

var seat = { a: 1, b: 2, c: 3 };
function Car() {
this.color = 'red';
}
Car.prototype = seat;
var lamborghini = new Car();
// for...in statement
for (var prop in lamborghini) {
if (lamborghini.hasOwnProperty(prop)) {
console.log(`lamborghini.${prop} = ${lamborghini[prop]}`);
}
}
// Output:
// "lamborghini.color = red"