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}; } };