Symbol.iterator和Symbol.asyncIterator


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]最近已在設計規范中落地。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM