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
可迭代对象的属性进行迭代。
 
posted @ 2018-11-11 19:17  不服输的Tiger  阅读(152)  评论(0编辑  收藏  举报