亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

詳解ES6語法之可迭代協議和迭代器協議

2024-05-06 16:41:59
字體:
來源:轉載
供稿:網友

ECMAScript 2015的幾個補充,并不是新的內置或語法,而是協議。這些協議可以被任何遵循某些約定的對象來實現。
有兩個協議:可迭代協議和迭代器協議。

可迭代協議

可迭代協議允許 JavaScript 對象去定義或定制它們的迭代行為, 例如(定義)在一個 for..of 結構中什么值可以被循環(得到)。一些內置類型都是內置的可迭代對象并且有默認的迭代行為, 比如 Array or Map, 另一些類型則不是 (比如Object) 。

Iterator 接口的目的,就是為所有數據結構,提供了一種統一的訪問機制,即for...of循環(詳見下文)。當使用for...of循環遍歷某種數據結構時,該循環會自動去尋找 Iterator 接口,調用Symbol.iterator方法,返回該對象的默認遍歷器。

ES6 規定,默認的 Iterator 接口部署在數據結構的Symbol.iterator屬性,或者說,一個數據結構只要具有Symbol.iterator屬性,就可以認為是“可迭代的”(iterable)。Symbol.iterator屬性本身是一個函數,就是當前數據結構默認的遍歷器生成函數。執行這個函數,就會返回一個遍歷器。

為了變成可迭代對象, 一個對象必須實現(或者它原型鏈的某個對象)必須有一個名字是 Symbol.iterator 的屬性:

迭代器協議

該迭代器協議定義了一種標準的方式來產生一個有限或無限序列的值。

JavaScript 原有的表示“集合”的數據結構,主要是數組(Array)和對象(Object),ES6 又添加了Map和Set。這樣就有了四種數據集合,用戶還可以組合使用它們,定義自己的數據結構,比如數組的成員是Map,Map的成員是對象。這樣就需要一種統一的接口機制,來處理所有不同的數據結構。

迭代器(Iterator)就是這樣一種機制。它是一種接口,為各種不同的數據結構提供統一的訪問機制。任何數據結構只要部署 Iterator 接口,就可以完成遍歷操作(即依次處理該數據結構的所有成員)。

Iterator 的作用有三個:一是為各種數據結構,提供一個統一的、簡便的訪問接口;二是使得數據結構的成員能夠按某種次序排列;三是 ES6 創造了一種新的遍歷命令for...of循環,Iterator 接口主要供for...of消費。

Iterator 的遍歷過程是這樣的。

  1. 創建一個指針對象,指向當前數據結構的起始位置。也就是說,遍歷器對象本質上,就是一個指針對象。
  2. 第一次調用指針對象的next方法,可以將指針指向數據結構的第一個成員。
  3. 第二次調用指針對象的next方法,指針就指向數據結構的第二個成員。
  4. 不斷調用指針對象的next方法,直到它指向數據結構的結束位置。

每一次調用next方法,都會返回數據結構的當前成員的信息。具體來說,就是返回一個包含value和done兩個屬性的對象。其中,value屬性是當前成員的值,done屬性是一個布爾值,表示遍歷是否結束。

var someString = "hi";typeof someString[Symbol.iterator]; // "function"var iterator = someString[Symbol.iterator]();iterator + "";  // "[object String Iterator]"iterator.next()    // { value: "h", done: false }iterator.next();   // { value: "i", done: false }iterator.next();   // { value: undefined, done: true }

原生具備 Iterator 接口的數據結構如下。

  1. Array
  2. Map
  3. Set
  4. String
  5. TypedArray
  6. 函數的 arguments 對象
  7. NodeList 對象

注意對象是不具備 Iterator 接口的,一個對象如果要具備可被for...of循環調用的 Iterator 接口,就必須在Symbol.iterator的屬性上部署遍歷器生成方法(原型鏈上的對象具有該方法也可)。

調用 Iterator 接口的場合

有一些場合會默認調用 Iterator 接口(即Symbol.iterator方法),除了下文會介紹的for...of循環,解構賦值, 擴展運算符其實也會調用默認的Iterator 接口。

實際上,這提供了一種簡便機制,可以將任何部署了 Iterator 接口的數據結構,轉為數組。也就是說,只要某個數據結構部署了 Iterator 接口,就可以對它使用擴展運算符,將其轉為數組。

由于數組的遍歷會調用遍歷器接口,所以任何接受數組作為參數的場合,其實都調用了遍歷器接口。下面是一些例子。

  1. for...of
  2. Array.from()
  3. Map(), Set(), WeakMap(), WeakSet()(比如new Map([['a',1],['b',2]]))
  4. Promise.all()
  5. Promise.race()

for...of

for...of 循環是最新添加到 JavaScript 循環系列中的循環。

它結合了其兄弟循環形式 for 循環和 for...in 循環的優勢,可以循環任何可迭代(也就是遵守可迭代協議)類型的數據。默認情況下,包含以下數據類型:String、Array、Map 和 Set,注意不包含 Object 數據類型(即 {})。默認情況下,對象不可迭代。

在研究 for...of 循環之前,先快速了解下其他 for 循環,看看它們有哪些不足之處。

for 循環

for 循環的最大缺點是需要跟蹤計數器和退出條件。我們使用變量 i 作為計數器來跟蹤循環并訪問數組中的值。我們還使用 Array.length 來判斷循環的退出條件。

雖然 for 循環在循環數組時的確具有優勢,但是某些數據結構不是數組,因此并非始終適合使用 loop 循環。

for...in 循環

for...in 循環改善了 for 循環的不足之處,它消除了計數器邏輯和退出條件。但是依然需要使用 index 來訪問數組的值.

此外,當你需要向數組中添加額外的方法(或另一個對象)時,for...in 循環會帶來很大的麻煩。因為 for...in 循環循環訪問所有可枚舉的屬性,意味著如果向數組的原型中添加任何其他屬性,這些屬性也會出現在循環中。這就是為何在循環訪問數組時,不建議使用 for...in 循環。

注意: forEach 循環 是另一種形式的 JavaScript 循環。但是,forEach() 實際上是數組方法,因此只能用在數組中。也無法停止或退出 forEach 循環。如果希望你的循環中出現這種行為,則需要使用基本的 for 循環。

for...of 循環

for...of 循環用于循環訪問任何可迭代的數據類型。

const digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];for (const digit of digits) { console.log(digit);}

可以隨時停止或退出 for...of 循環。

const digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];for (const digit of digits) { if (digit % 2 === 0) {  continue; } console.log(digit); //1,3,5,7,9}

不用擔心向對象中添加新的屬性。for...of 循環將只循環訪問對象中的值。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
2019亚洲男人天堂| 日韩www在线| 国产成人拍精品视频午夜网站| 午夜精品一区二区三区在线视频| 亚洲国产私拍精品国模在线观看| 精品国内自产拍在线观看| 成人av.网址在线网站| 国产91热爆ts人妖在线| 国产精品第三页| 国产精品久久久久久久久久新婚| 91久久精品国产91久久性色| 亚洲国产精品va在看黑人| 久久精品国产久精国产思思| 91av福利视频| 最近2019年手机中文字幕| 午夜精品久久久久久久男人的天堂| 亚洲女人天堂av| 欧美在线视频观看| 日韩av在线网页| 欧美精品videossex88| 亚洲精品久久久久久下一站| 韩国美女主播一区| 久久中文字幕一区| 一区二区欧美激情| 日韩欧美一区二区在线| 国产精品88a∨| 日韩中文字幕网站| 成人观看高清在线观看免费| 色老头一区二区三区在线观看| 97精品国产aⅴ7777| 91成人国产在线观看| 日韩精品在线观看网站| 98午夜经典影视| 欧美日韩国产精品一区| 国产视频在线一区二区| 免费91在线视频| 成人激情电影一区二区| 日韩国产在线看| 欧美www视频在线观看| 欧美福利视频在线观看| 日韩精品免费一线在线观看| 欧美日韩第一视频| 国产精品久久久久免费a∨大胸| 欧美激情视频三区| 97视频在线观看免费高清完整版在线观看| 久久这里只有精品视频首页| 国产视频在线一区二区| 国产97免费视| 精品久久久久久中文字幕| 久久精品99无色码中文字幕| 亚洲国产精品成人精品| 91精品国产乱码久久久久久蜜臀| 日韩精品视频免费在线观看| 日韩av三级在线观看| 国产在线观看精品一区二区三区| 国产91网红主播在线观看| 亚洲黄色av女优在线观看| 国产精品视频1区| 欧美与黑人午夜性猛交久久久| 国产欧美日韩精品在线观看| 国产成人97精品免费看片| 国产精品白丝av嫩草影院| 在线播放日韩精品| 国产成人综合精品| 国产精品 欧美在线| 国产精品18久久久久久麻辣| 亚洲片在线资源| 91亚洲va在线va天堂va国| 久久综合免费视频影院| 欧美黑人xxx| 日韩欧美国产免费播放| 91在线网站视频| 亚洲国产精品久久久久| 欧美日韩一区二区三区| 国产亚洲精品91在线| 国产在线精品成人一区二区三区| 91精品在线国产| 日韩视频免费中文字幕| 久久久在线免费观看| 日韩免费精品视频| 91亚洲精品视频| 国产xxx69麻豆国语对白| 亚洲欧洲国产伦综合| www.日韩.com| 在线精品国产成人综合| 国产精品电影观看| 日韩av高清不卡| 国产精品久久久久aaaa九色| 欧美大片欧美激情性色a∨久久| 国产极品精品在线观看| 亚洲男人天堂手机在线| 国产精品极品美女在线观看免费| 国产九九精品视频| 福利微拍一区二区| 欧美精品videosex性欧美| 国产精品免费福利| 成人精品久久一区二区三区| 国产精品入口日韩视频大尺度| 成人欧美一区二区三区在线| 亚洲一二三在线| 亚洲人成网站999久久久综合| 91免费福利视频| www日韩欧美| 97在线日本国产| 亚洲欧美综合精品久久成人| 久久久久久久久久久人体| 大伊人狠狠躁夜夜躁av一区| 97精品国产97久久久久久春色| 午夜精品久久久久久久久久久久| 久久亚洲精品小早川怜子66| 亚州成人av在线| 日韩av网站电影| 欧美高清视频一区二区| 国产aaa精品| 国产精品第10页| 欧美精品中文字幕一区| 国产一区二区三区丝袜| 久久精品亚洲一区| 日韩中文字幕国产| 亚洲精品成人久久电影| 国产精品一区二区三| 91色琪琪电影亚洲精品久久| 91sao在线观看国产| 欧美日韩亚洲91| 亚洲系列中文字幕| 亚洲免费视频一区二区| 91精品久久久久久久久久| 亚洲一区二区黄| 国产一区私人高清影院| 欧美精品在线免费| 国产欧美亚洲视频| 992tv成人免费影院| 国产性色av一区二区| 欧洲成人在线观看| 国产午夜精品美女视频明星a级| 精品国产电影一区| 国产网站欧美日韩免费精品在线观看| 日本在线观看天堂男亚洲| 亚洲色图色老头| 3344国产精品免费看| 日韩久久免费视频| 亚洲在线免费观看| 国产99久久精品一区二区永久免费| 日韩高清av一区二区三区| 国模私拍一区二区三区| 久久精品国产精品亚洲| 懂色aⅴ精品一区二区三区蜜月| 日本亚洲精品在线观看| 国产亚洲成精品久久| 97色在线观看免费视频| 不卡av在线播放| 久久免费少妇高潮久久精品99| 综合国产在线视频| 欧美在线免费观看| 国产精品永久免费视频| 91欧美视频网站| 91视频-88av| 91精品国产99| 91精品国产91久久久久久| 日韩欧美主播在线| 亚洲国产高清高潮精品美女| 久久久久久久香蕉网| 久久91亚洲精品中文字幕| 8x拔播拔播x8国产精品|