就是這樣一種機制。它是一種接口,爲各類不一樣的數據結構提供統一的訪問機制。任何數據結構只要部署 Iterator 接口,就能夠完成遍歷操做(即依次處理該數據結構的全部成員)。數組
Iterator 的做用有三個:數據結構
一、是爲各類數據結構,提供一個統一的、簡便的訪問接口;函數
二、是使得數據結構的成員可以按某種次序排列;spa
三、是 ES6 創造了一種新的遍歷命令for...of
循環,Iterator 接口主要供for...of
消費。code
示例代碼:orm
//迭代器示例
function newIterator(arr) { let index = 0; return { next:()=>{ if(index<arr.length){ return {value:arr[index++]} } return {value:'無數據值'} } } } const nit=newIterator(['第一次','第二次','第三次']); console.log( nit.next().value) console.log( nit.next().value) console.log( nit.next().value) console.log( nit.next().value) console.log( nit.next().value) /** 輸出結果 第一次 第二次 第三次 無數據值 無數據值 **/
Symbol.iterator
屬性自己是一個函數,就是當前數據結構默認的遍歷器生成函數。執行這個函數,就會返回一個遍歷器。至於屬性名Symbol.iterator
,它是一個表達式,返回Symbol
對象的iterator
屬性,這是一個預約義好的、類型爲 Symbol 的特殊值,因此要放在方括號內對象
Symbol 是 ES6 引入了一種新的原始數據類型
blogSymbol
,表示獨一無二的值
const obj = { [Symbol.iterator] : function () { return { next: function () { return { value: 1, done: true }; } }; } };
生成器函數語法能夠理解爲對迭代器簡化,爲了更便捷的使用迭代器而出現的生成器函數。用來達到語法層面的代碼精簡;接口
Generator 能夠看做是數據結構,更確切地說,能夠看做是一個數組結構,由於 Generator 函數能夠返回一系列的值,這意味着它能夠對任意表達式,提供相似數組的接口。部署
示例代碼
function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending'; } var hw = helloWorldGenerator();
/** 執行結果
hw.next() // { value: 'hello', done: false } hw.next() // { value: 'world', done: false } hw.next() // { value: 'ending', done: true } hw.next() // { value: undefined, done: true }
**/
for...of
循環能夠自動遍歷 Generator 函數時生成的Iterator
對象,且此時再也不須要調用next
方法。