for each in/for in/for of
for each...in
Syntax
for each (variable in object) {
statement
}
variable
- 用来遍历属性值的变量,前面的
var
关键字是可选的.该变量是函数的局部变量而不是语句块的局部变量.
object
- 该对象的属性值会被遍历.
statement
- 遍历属性值时执行的语句. 如果想要执行多条语句, 请用(
{ ... }
) 将多条语句括住.
一些对象的内置属性是无法被遍历到的,包括所有的内置方法,例如String对象的indexOf
方法.不过,大部分的用户自定义属性都是可遍历的.
for...in
以任意顺序遍历一个对象的可枚举属性。对于每个不同的属性,语句都会被执行。
Syntax:
for (variable in object) { ... }
参数:
variable
- 在每次迭代时,将不同的属性名分配给变量。
object
- 被迭代其枚举属性的对象。
for..in
不应该被用来迭代一个下标顺序很重要的 Array
.
数组索引仅是可枚举的整数名,其他方面和别的普通对象属性没有什么区别。for...in 并不能够保证返回的是按一定顺序的索引,但是它会返回所有可枚举属性,包括非整数名称的和继承的。
因为迭代的顺序是依赖于执行环境的,所以数组遍历不一定按次序访问元素。 因此当迭代那些访问次序重要的 arrays 时用整数索引去进行 for
循环 (或者使用 Array.prototype.forEach()
或 for...of
循环) 。
仅迭代自身的属性
如果你只要考虑对象本身的属性,而不是它的原型,那么使用 getOwnPropertyNames()
或执行 hasOwnProperty()
来确定某属性是否是对象本身的属性 (也能使用propertyIsEnumerable
)。另外,如果你知道外部不存在任何的干扰代码,你可以扩展内置原型与检查方法。
例子
var obj = {a:1, b:2, c:3}; for (var prop in obj) { console.log("obj." + prop + " = " + obj[prop]); } // Output: // "obj.a = 1" // "obj.b = 2" // "obj.c = 3"
var triangle = {a:1, b:2, c:3}; function ColoredTriangle() { this.color = "red"; } ColoredTriangle.prototype = triangle; var obj = new ColoredTriangle(); for (var prop in obj) { if( obj.hasOwnProperty( prop ) ) { console.log("o." + prop + " = " + obj[prop]); } } // Output: // "o.color = red"
for...of
Syntax
for (variable of iterable) {
statement
}
variable
- 在每个迭代中的值被分配给不同的属性可变。
iterable
- 可迭代对象的属性进行迭代。