for of 和for in

660 阅读2分钟

For in 和 For of 的区别

1.遍历数组用for循环

ES5可以用forEach,其他具有遍历数组功能的方法还有map、filter、some、every、reduce、reduceRight,但是他们返回的结果不一样。

注意:
1.如果使用forEach遍历数组,使用break无法中断循环
2.使用return也不能返回到外层函数

2.for in 遍历数组的毛病

  1. index索引为字符串型数字,不能直接进行几何运算
  2. 遍历顺序有可能不是按照实际数组的内部顺序
  3. 使用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};
 }
};