摘要:起源何為迭代器迭代器是被設計專用于迭代的對象,帶有特定接口。所有的迭代器對象都擁有方法,會返回一個結果對象。這個知名符號定義了為指定對象返回迭代器的函數。接下來被調用,迭代器結果對象的屬性被讀出并放入了變量。
起源 何為迭代器?
迭代器是被設計專用于迭代的對象,帶有特定接口。所有的迭代器對象都擁有 next() 方
法,會返回一個結果對象。該結果對象有兩個屬性:對應下一個值的 value ,以及一個布爾
類型的 done ,其值為 true 時表示沒有更多值可供使用。迭代器持有一個指向集合位置的
內部指針,每當調用了 next() 方法,迭代器就會返回相應的下一個值。
記住這些后,在 ES5 中創建一個迭代器就相當簡單了:
function ceateIterator(items) { var i = 0; return { next: function() { var done = (i >= items.length); var value = !done ? items[i++]: undefined; return { done: done, value: value }; } }; } var iterator = createIterator([1, 2, 3]); console.log(iterator.next()); // "{ value: 1, done: false }" console.log(iterator.next()); // "{ value: 2, done: false }" console.log(iterator.next()); // "{ value: 3, done: false }" console.log(iterator.next()); // "{ value: undefined, done: true }" // 之后的所有調用 console.log(iterator.next()); // "{ value: undefined, done: true }"可迭代對象 與 for-of循環
與迭代器緊密相關的是,可迭代對象( iterable )是包含 Symbol.iterator 屬性的對象。這
個 Symbol.iterator 知名符號定義了為指定對象返回迭代器的函數。在 ES6 中,所有的集合
對象(數組、 Set 與 Map )以及字符串都是可迭代對象,因此它們都被指定了默認的迭代
器。可迭代對象被設計用于與 ES 新增的 for-of 循環配合使用。
for-of在循環每次執行時會調用可迭代對象next()方法,并將結果value值保存在一個變量上,循環過程到done變成true時停止。
let values = [1, 2, 3]; for (let num of values) { console.log(num); }
此代碼輸出如下
1 2 3
這個 for-of 循環首先調用了 values 數組的 Symbol.iterator 方法,獲取了一個迭代器
(對 Symbol.iterator 的調用發生在 JS 引擎后臺)。接下來 iterator.next() 被調用,迭
代器結果對象的 value 屬性被讀出并放入了 num 變量。 num 變量的值開始為 1 ,接下來
是 2 ,最后變成 3 。當結果對象的 done 變成 true ,循環就退出了,因此 num 絕不會被
賦值為 undefined 。
你可以使用 Symbol.iterator 來訪問對象上的默認迭代器,就像這樣:
let values = [1, 2, 3]; let iterator = values[Symbol.iterator](); console.log(iterator.next()); // "{ value: 1, done: false }" console.log(iterator.next()); // "{ value: 2, done: false }" console.log(iterator.next()); // "{ value: 3, done: false }" console.log(iterator.next()); // "{ value: undefined, done: true }"
既然 Symbol.iterator 指定了默認迭代器,你就可以使用它來檢測一個對象是否能進行迭
代,正如下例:
function isIterable(object) { return typeof object[Symbol.iterator] === "function"; } console.log(isIterable([1, 2, 3])); // true console.log(isIterable("Hello")); // true console.log(isIterable(new Map())); // true console.log(isIterable(new Set())); // true console.log(isIterable(new WeakMap())); // false console.log(isIterable(new WeakSet())); // false集合的迭代器
ES6 具有三種集合對象類型:數組、 Map 與 Set 。這三種類型都擁有如下的迭代器,有助于
探索它們的內容:
entries() :返回一個包含鍵值對的迭代器;
values() :返回一個包含集合中的值的迭代器;
keys() :返回一個包含集合中的鍵的迭代器;
entries()迭代器entries() 迭代器會在每次 next() 被調用時返回一個雙項數組,此數組代表了集合中每個
元素的鍵與值:對于數組來說,第一項是數值索引;對于 Set ,第一項也是值(因為它的值
也會被視為鍵);對于 Map ,第一項就就是鍵。
let colors = [ "red", "green", "blue" ]; let tracking = new Set([1234, 5678, 9012]); let data = new Map(); data.set("title", "Understanding ES6"); data.set("format", "ebook"); for (let entry of colors.entries()) { console.log(entry); } for (let entry of tracking.entries()) { console.log(entry); } for (let entry of data.entries()) { console.log(entry); }
輸出內容如下:
[0, "red"] [1, "green"] [2, "blue"] [1234, 1234] [5678, 5678] [9012, 9012] ["title", "Understanding ES6"] ["format", "ebook"]values() 迭代器
values() 迭代器僅僅能返回存儲在集合內的值,例如:
let colors = [ "red", "green", "blue" ]; let tracking = new Set([1234, 5678, 9012]); let data = new Map(); data.set("title", "Understanding ES6"); data.set("format", "ebook"); for (let value of colors.values()) { console.log(value); } for (let value of tracking.values()) { console.log(value); } for (let value of data.values()) { console.log(value); }
此代碼輸出了如下內容:
"red" "green" "blue" 1234 5678 9012 "Understanding ES6" "ebook"keys() 迭代器
keys() 迭代器能返回集合中的每一個鍵。對于數組來說,它只返回了數值類型的鍵,永不返
回數組的其他自有屬性; Set 的鍵與值是相同的,因此它的 keys() 與 values() 返回了相
同的迭代器;對于 Map , keys() 迭代器返回了每個不重復的鍵。這里有個例子演示了這三
種情況:
let colors = [ "red", "green", "blue" ]; let tracking = new Set([1234, 5678, 9012]); let data = new Map(); data.set("title", "Understanding ES6"); data.set("format", "ebook"); for (let key of colors.keys()) { console.log(key); } for (let key of tracking.keys()) { console.log(key); } for (let key of data.keys()) { console.log(key); }
本例輸出了如下內容:
0 1 2 1234 5678 9012 "title" "format"
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/109285.html
摘要:有兩個協議可迭代協議和迭代器協議。為了變成可迭代對象,一個對象必須實現或者它原型鏈的某個對象必須有一個名字是的屬性迭代器協議該迭代器協議定義了一種標準的方式來產生一個有限或無限序列的值。 ECMAScript 2015的幾個補充,并不是新的內置或語法,而是協議。這些協議可以被任何遵循某些約定的對象來實現。有兩個協議:可迭代協議和迭代器協議。 可迭代協議 可迭代協議允許 JavaScri...
摘要:可迭代對象就具有屬性,它是一種與迭代器密切相關的對象。它通過指定的函數可以返回一個作用于附屬對象的迭代器。迭代器特點每次調用方法時,返回一個數組,數組中兩個元素,分別表示鍵和值。示例之輸出輸出輸出之迭代器特點返回集合中存在的每一個鍵。 Iterator由來 不推薦Iterator方法。 Iterator 函數是一個 SpiderMonkey 專有特性,并且會在某一時刻被刪除。有一點,需...
摘要:什么是迭代器中創建迭代器如下所示什么是生成器生成器是一種返回迭代器的函數每當招待完一條語句后函數就會自動停止執行關鍵字可返回任何值或表達式關鍵字只可在生成器內部使用,在其它地方使用會導致程序拋出語法錯誤所以下面例子是有錯誤的可迭代對象具有屬 什么是迭代器 ES5中創建迭代器如下所示: function createIterator(items) { var i = 0 retu...
摘要:什么是迭代器中創建迭代器如下所示什么是生成器生成器是一種返回迭代器的函數每當招待完一條語句后函數就會自動停止執行關鍵字可返回任何值或表達式關鍵字只可在生成器內部使用,在其它地方使用會導致程序拋出語法錯誤所以下面例子是有錯誤的可迭代對象具有屬 什么是迭代器 ES5中創建迭代器如下所示: function createIterator(items) { var i = 0 retu...
閱讀 3174·2023-04-25 17:19
閱讀 623·2021-11-23 09:51
閱讀 1345·2021-11-08 13:19
閱讀 783·2021-09-29 09:34
閱讀 1683·2021-09-28 09:36
閱讀 1500·2021-09-22 14:59
閱讀 2715·2019-08-29 16:38
閱讀 2059·2019-08-26 13:40