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