For in 和 For of 的区别
1.遍历数组用for循环
ES5可以用forEach,其他具有遍历数组功能的方法还有map、filter、some、every、reduce、reduceRight,但是他们返回的结果不一样。
注意:
1.如果使用forEach遍历数组,使用break无法中断循环
2.使用return也不能返回到外层函数
2.for in 遍历数组的毛病
- index索引为字符串型数字,不能直接进行几何运算
- 遍历顺序有可能不是按照实际数组的内部顺序
- 使用for in 会遍历数组所有的可枚举属性,包括原型。所以for in 更适合遍历对象,不要使用for in 遍历数组。
Array.prototype.method=function(){
  console.log(this.length);
}
var myArray=[1,2,4,5,6,7]
myArray.name="数组";
for (var value of myArray) {
console.log(value);
}
注意:
1.for in遍历的是数组的索引(即键名)
2.for of遍历的是数组的元素值
3.for of遍历的只是数组内的元素,而不包括数组的原型属性method和索引name
3.遍历对象
遍历对象,通常用for in 来遍历对象的键名
Object.prototype.method=function(){
  console.log(this);
}
var myObject={
  a:1,
  b:2,
  c:3
}
for (var key in myObject) {
console.log(key);
}
for in 可以遍历到myObject的原型方法method,如果不想遍历原型方法和属性的话,可以再循环内部判断一下,hasOwnPropery方法可以判断某属性是否是该对象的实例属性
for (var key in myObject) {
  if(myObject.hasOwnProperty(key)){
    console.log(key);
  }
}
还可以通过ES5的Object.keys(myObject)获取对象的实例属性组成的数组,不包括原型方法和属性。
4.转换对象
- 当你为对象添加 myObject.toString() 方法后,就可以将对象转化为字符串。
- 当你为对象添加myObject.Symbol.iterator方法,就可以遍历这个对象了。
举例:
jQuery.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
这样jQuery就可以遍历了
所有拥有Symbol.iterator的对象被称为可迭代的。
for...of循环原理
for...of循环首先调用集合的Symbol.iterator方法,紧接着返回一个新的迭代器对象。迭代器对象可以试任意具有.next()方法的对象,每次循环调用一次。
var zeroesForeverIterator = {
[Symbol.iterator]: function () {
return this;
},
next: function () {
return {done: false, value: 0};
}
};