這篇文章只是聊一下iterator
的基礎知識, 若是想全面瞭解iterator
是什麼東西, 能夠點這es6
阮一峯老師的ES6入門bash
Iterator
是一個提供給各類數據結構訪問的統一接口, 簡單來講, iterator
就是一個接口數據結構
使用iterator
主要有三個做用dom
Map,Set,Array,String...
提供一個統一的簡便的訪問接口next
關鍵字按順序訪問數據結構的數據for...of
遍歷消費 (主要)重點在這 : 全部的遍歷器 iterator
都是從名爲 [Symbol.iterator]
的接口(方法)開始出發的, 而後調用 next
方法按順序輸出數據ui
上面說到了 [Symbol.iterator]
next
, 那什麼是 [Symbol.iterator]
? 什麼是 next
?spa
[Symbol.iterator]
[Symbol.iterator]
是啓動遍歷器的開關, 若是沒有這個開關, 就不存在遍歷器[Symbol.iterator]
分爲先天的和後天的首先, 先天的[Symbol.iterator]
存在在一些特殊的數據結構中, 包括 Array
String
Map
Set
TypedArray
arguments
NodeList(dom)
GeneratorObject
等等, 以下圖所示3d
看到沒, 就是這個東西, 在我說的那幾個數據結構中都有, 不信的能夠本身一個一個去試試code
可是, 不知道有沒有發現, 咱們最經常使用的 Object
是沒有 [Symbol.iterator]
接口的cdn
因此 Object
是不能使用 for...of
進行遍歷的對象
Object
有不少方法能夠遍歷, 可是產品經理就要你用
for ... of
遍歷
Object
, 怎麼辦, 這就要說到後天的
[Symbol.iterator]
var obj = {
[Symbol.iterator] : () => {
return {}
}
}
for (const val of obj) {
console.log(val)
}
複製代碼
Object
不是沒有 [Symbol.iterator]
方法嗎, 咱們本身加一個不就好了
看 ! 如今 obj
是可遍歷的了 ( 這裏的錯誤先無論, 後面會說到 )
next
上面說過 iterator
從 [Symbol.iterator]
開始, 經過 next
按順序輸出數據, 因此, 咱們來看一下從 [Symbol.iterator]
出發後的是什麼東西
能夠很清楚的看到, [Symbol.iterator]
執行後會返回一個包含 next
方法的對象
因此 , next
就是由 [Symbol.iterator]
執行後返回的一個方法, 下面咱們來執行一下next
每次執行 next
都會返回一個對象 {value: xxx, done: xxx}
value
爲遍歷的數據結構的每一位, done
表示是否完成遍歷
如今咱們能夠完善一下上面的錯誤了
var obj = {
[Symbol.iterator] : () => {
return {
next : () => {
const isContinue = (Math.random() > 0.75)
if (isContinue)
return {
value : `數字 ${Math.floor(Math.random() * 10)}`,
done : false
}
return { value : undefined, done : true}
}
}
}
}
for (const val of obj) {
console.log(val)
}
複製代碼
ber ~ 這樣對象就算沒有 [Symbol.iterator]
接口也可使用 for ... of
去遍歷了
for ... of
一直在用 for ... of
, 順帶提一嘴, for ... of
是什麼玩意
for ... of
是ES6
的一個新遍歷的方法, 且只能遍歷具備 iterator
接口的數據結構, 也就是要有 [Symbol.iterator]
, 至於這個遍歷有什麼好處, 你們可自行百度一下
全部的遍歷器 iterator
都是從名爲 [Symbol.iterator]
的接口(方法)開始出發的, 而後調用 next
方法按順序輸出數據
ber~