JS for..in与for..of的区别

for…in是遍历数组、对象的key

1.index索引为字符串型数字,不能直接进行几何运算
2.遍历顺序有可能不是按照实际数组的内部顺序
3.使用for in会遍历数组所有的可枚举属性,包括原型。
4.所以for in更适合遍历对象,不要使用for in遍历数组。

let arr = [1, 2, 3];
for (let i in arr) {
    console.log(i)
}
let obj = {
    name: 'wuxiaodi',
    age: 18,
};
for (let i in obj) {
    console.log(i)//0  1  2 name  age
}

如果想用for…in遍历值那就把JS代码改成这样:

let arr = [1, 2, 3];
for (let i in arr) {
    console.log(arr[i])
}
let obj = {
    name: 'wuxiaodi',
    age: 18,
};
for (let i in obj) {
    console.log(obj[i])//1  2  3  wuxiaodi  18
}

那么除了使用for循环,如何更简单的正确的遍历数组达到我们的期望呢(即不遍历原型上的属性),ES6中的for of更胜一筹.

记住,for in遍历的是数组的索引(即键名),而for of遍历的是数组元素值。

for of遍历的只是数组内的元素,而不包括数组的原型属性。

for…of是遍历数组的value

let arr = [1, 2, 3];
for (let i of arr) {
    console.log(i)//1  2  3
}

 总结

  • for..of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合.但是不能遍历对象,因为对象没有迭代器.与forEach()不同的是,它可以正确响应break、continue和return语句
  • for-of循环不支持普通对象,但如果你想迭代一个对象的属性,你可以用for-in循环(这也是它的本职工作)或内建的Object.keys()方法:
    for (var key of Object.keys(someObject)) {
      console.log(key + ": " + someObject[key]);
    }
  • 遍历map对象时适合用解构,例如;
    for (var [key, value] of phoneBookMap) {
       console.log(key + "'s phone number is: " + value);
    }
  • 当你为对象添加myObject.toString()方法后,就可以将对象转化为字符串,同样地,当你向任意对象添加myObjectSymbol.iterator方法,就可以遍历这个对象了。
  • 举个例子,假设你正在使用jQuery,尽管你非常钟情于里面的.each()方法,但你还是想让jQuery对象也支持for-of循环,你可以这样做:
    jQuery.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
  • 所有拥有Symbol.iterator的对象被称为可迭代的。可迭代对象的概念几乎贯穿于整门语言之中,不仅是for-of循环,还有Map和Set构造函数、解构赋值,以及新的展开操作符。
  • for...of的步骤
    or-of循环首先调用集合的Symbol.iterator方法,紧接着返回一个新的迭代器对象。迭代器对象可以是任意具有.next()方法的对象;for-of循环将重复调用这个方法,每次循环调用一次。举个例子,这段代码是我能想出来的最简单的迭代器:
    var zeroesForeverIterator = {
     [Symbol.iterator]: function () {
       return this;
      },
      next: function () {
      return {done: false, value: 0};
     }
    };
原文地址:https://www.cnblogs.com/art-poet/p/12525444.html