Symbol.iterator和Symbol.asyncIterator
Symbol.iterator
Symbol.iterator為每一個對象定義了默認的迭代器。該迭代器可以被for...of循環使用。
當需要對一個對象進行迭代時(比如開始用於一個for...of循環中),它的@@iterator方法都會在不傳參情況下被調用,返回的迭代器用於獲取要迭代的值。
一些內置類型擁有默認的迭代器行為,其他類型(如Object)則沒有。下表中的內置類型擁有默認的@@iterator方法:
- Array.prototype[@@iterator]()
- TypedArray.prototype[@@iterator]()
- String.prototype[@@iterator]()
- Map.prototype[@@iterator]()
- Set.prototype[@@iterator]()
示例
自定義迭代器
我們可以像下面這樣創建自定義的迭代器:
/** 自定義迭代器 */ var myIterable = {}; myIterable[Symbol.iterator] = function* () { yield 1; yield 2; yield 3; } console.log([...myIterable])
不符合標准的迭代器
如果一個迭代器@@iterator沒有返回一個迭代器對象,那么它就是一個不符合標准的迭代器,這樣的迭代器將會在運行期拋出異常,甚至非常詭異的Bug
Symbol.asyncIterator
Symbol.asyncIterator符號指定了一個對象的默認異步迭代器。如果一個對象設置了這個屬性,它就是異步迭代對象,可用於for await...of循環
Symbol.asyncIterator是一個用於訪問對象的@@asyncIterator方法的內建符號。一個異步可迭代對象必須要有Symbol.asyncIterator屬性
示例
自定義異步可迭代對象
/** 自定義異步可迭代對象 */ const myAsyncIterable = new Object(); myAsyncIterable[Symbol.asyncIterator] = async function*() { yield "hello"; yield "async"; yield "iteration!"; } (async () => { for await (const x of myAsyncIterable) { console.log(x); } })();
內建異步可迭代對象
目前沒有默認設定了[Symbol.asyncItetor]屬性的JavaScript內建的對象。不過,WHATWG(網頁超文本應用技術工作小組)Streams會被設定為第一批異步可迭代對象,[Symbol.asyncItertor]最近已在設計規范中落地。