for of, for in, forEach比较

forEach

forEach没法中途跳出forEach循环,break、continue和return都不奏效。数据结构

for in

for...in 循环只遍历可枚举属性。
像 Array和 Object使用内置构造函数所建立的对象都会继承自Object.prototype和String.prototype的不可枚举属性,例如 String 的 indexOf() 方法或 Object的toString()方法。函数

循环将遍历对象自己的全部可枚举属性,以及对象从其构造函数原型中继承的属性(更接近原型链中对象的属性覆盖原型属性)。prototype

for...in不该该用于迭代一个 Array,其中索引顺序很重要。

for in 循环的输出顺序问题
先遍历出整数属性(integer properties,按照升序),而后其余属性按照建立时候的顺序遍历出来。code

var obj = {
  a:1,
  '2':1,
  '1':1,
  d:1,
  c:1,
  '3':1
}
obj.b=66;

for (var key in obj) { console.log(key ); }    //"1", "2", "3", "a", "d", "c", "b"
Object.keys(obj);                              //["1", "2", "3", "a", "d", "c", "b"]
Object.keys()和for in 具备相同的排列顺序

for of

有着同for...in同样的简洁语法,可是没有for...in那些缺点。
不一样于forEach方法,它能够与break、continue和return配合使用。
提供了遍历全部数据结构的统一操做接口。对象

遍历对象时,推荐使用for in,使用for of会报错