精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從理解到實現輕松掌握 ES6 中的迭代器

開發 前端
JavaScript 中除了 Array 之外,ES6 還新增加了 Map、Set 結構,當我們需要操作這些數據時,就需要一種統一的接口來處理這些不同的數據結構。ES6 中新增加的 Iterator(迭代器)就提供了這樣一種機制。

[[352311]]

JavaScript 中除了 Array 之外,ES6 還新增加了 Map、Set 結構,當我們需要操作這些數據時,就需要一種統一的接口來處理這些不同的數據結構。ES6 中新增加的 Iterator(迭代器)就提供了這樣一種機制。

Symbol.iterator 支持的數據結構

ES6 中提供了 Symbol.iterator 方法,該方法返回一個迭代器對象,目前 Array、Set、Map 這些數據結構默認具有 Symbol.iterator 屬性,如下所示,可以看到 Object 類型是沒有的。

  1. console.log([][Symbol.iterator]()); // Object [Array Iterator] {} 
  2. console.log((new Map())[Symbol.iterator]()); // [Map Entries] {  } 
  3. console.log((new Set())[Symbol.iterator]()); // [Set Iterator] {  } 
  4. console.log({}[Symbol.iterator]); // undefined 

除了上面提到這些數據結構,JavaScript 中一些類似數組的對象也默認具有 Symbol.iterator 屬性,例如:字符串、arguments 對象、DOM 的 NodeList 對象。

  • 字符串
  1. const str = 'nodejs'
  2. console.log(str[Symbol.iterator]()); // Object [String Iterator] {} 
  3.  
  4. for (const val of str) { 
  5.   console.log(val); // n o d e j s 
  • arguments 對象
  1. function print() { 
  2.   console.log(arguments[Symbol.iterator]()); // Object [Array Iterator] {} 
  3.   for (const val of arguments) { 
  4.     console.log(val); // n o d e 
  5.   } 
  6. print('n''o''d''e'
  • DOM NodeList 對象
  1. const divNodeList = document.getElementsByTagName('div'
  2. console.log(divNodeList[Symbol.iterator]()) // Array Iterator {} 
  3. for (const div of divNodeList) { 
  4.  // 會輸出每個 div 標簽 
  5.  console.log(div); 

迭代器對象的 next 方法

調用可迭代對象的 Symbol.iterator 方法會返回一個迭代器對象,它的接口中有一個 next 方法,該方法返回 value 和 done 兩個屬性,其中 value 屬性是當前成員的值,done 屬性表示遍歷是否結束。了解生成器函數(Generator)的可能不會陌生,同樣的當你執行一個生成器函數也會得到一個迭代器對象,但是要區分 生成器和迭代器不是一個概念。

  1. const arr = ['N''o''d''e']; 
  2. const iterator = arr[Symbol.iterator](); 
  3.  
  4. console.log(iterator.next()); // { value: 'N', done: false } 
  5. console.log(iterator.next()); // { value: 'o', done: false } 
  6. console.log(iterator.next()); // { value: 'd', done: false } 
  7. console.log(iterator.next()); // { value: 'e', done: false } 
  8. console.log(iterator.next()); // { value: undefined, done: true } 

上例中聲明一個數組 arr,調用 arr 的 Symbol.iterator 方法創建了一個迭代器對象 iterator 之后不斷調用 next 方法返回當前數組內容,直到 next 方法返回值 done 為 true 則該數組訪問完畢。

Iterator 接口遍歷

解構賦值

數組、Set、Map 解構賦值時,會默認調用 Symbol.iterator 方法。注意 Map 調用 Symbol.iterator 方法返回的是一個 entries 方法,該方法返回的是一個新的迭代器對象且按插入順序包含了 Map 對象中每個元素的 [key, value] 數組,所以調用 Map 實例的 keys 或 values 方法也會返回一個新的迭代器對象。

  1. const set = new Set().add('n').add('o'); 
  2. const map = new Map().set('d').set('e'); 
  3. const [xSet, ySet] = set
  4. console.log(xSet, ySet) // n o 
  5. const [xMap, yMap] = map.keys(); 
  6. console.log(xMap, yMap) // d e 

擴展運算符

ES6 中的擴展運算符(...)也會默認調用數組、Set、Map 等結構的 Symbol.iterator 方法。

  1. const set = new Set('node'); 
  2. const [x, y, ...z] = set
  3. console.log(x, y, z); // n o [ 'd''e' ] 

for...of 循環

ES6 借鑒了 C++、Python 等語言引入了 for...of 循環,該循環內部也會調用 Symbol.iterator 方法,只要具有 Iterator 接口的數據結構都可以使用。

  1. const set = new Set().add('n').add('o'); 
  2.  
  3. for (const val of set) { 
  4.   console.log(val); 

for...of 循環在執行中還可以使用 break; 中斷迭代器的執行。以下示例,修改循環語句在執行第一次 val 等于 n 之后執行 break。

  1. for (const val of set) { 
  2.   console.log(val); // n 
  3.   if (val === 'n') break; 

其它方法

數組默認是支持 Iterator 接口,所以任何接收數組做為參數的方法也都會默認調用 Symbol.iterator 方法,如下所示:

  1. const set = new Set().add('n').add('o'); 
  2. console.log(Array.from(set)); // [ 'n''o' ] 
  3. Promise.all(set).then(val => console.log(val)) // [ 'n''o' ] 
  4. Promise.race(set).then(val => console.log(val)) // n 

自定義迭代器

迭代協議

  • 參照可迭代協議,要成為可迭代對象首先要有一個 **@@iterator **即(Symbol.iterator)屬性,該屬性為一個無參數的函數,返回一個符合迭代器協議的對象。
  • 根據迭代器協議定義這個迭代器對象要返回一個 next() 方法,這個 next() 方法返回一個包含 value、done 屬性的對象。
  1. const  myIterator = { 
  2.   // for...of 循環會用到 
  3.   [Symbol.iterator]: function() { return this }, 
  4.    
  5.   // 標準的迭代器接口方法 
  6.   nextfunction() { 
  7.    // ... 
  8.   } 

如果用 TypeScript 寫法描述如下:

  1. // 遍歷器接口 Iterable 
  2. interface Iterable { 
  3.  [Symbol.iterator]: Iterator 
  4.  
  5. // 迭代器對象 
  6. interface Iterator { 
  7.  next(value?: any): IterationResult, 
  8.  
  9. // next 方法返回值定義 
  10. interface IterationResult { 
  11.  value: any
  12.   done: boolean 

基于普通函數的迭代器實現

迭代器的函數實現可以是一個普通函數也可以是一個生成器函數,我們先以普通函數為例,定義一個 Range 構造函數,用來輸出兩個數值區域的所有值。

  1. function Range(start, end) { 
  2.   this.id = start; 
  3.   this.end = end
  4. Range.prototype[Symbol.iterator] = function() { return this } 
  5. Range.prototype.next = function next() { 
  6.   if (this.id > this.end) { 
  7.     return { value: undefined, done: true } 
  8.   } 
  9.  
  10.   return { value: this.id++, done: false } 
  11. const r1 = new Range(0, 3); 
  12. const it = r1[Symbol.iterator]() 
  13. for (const id of r1) { 
  14.   console.log(id); // 0,1,2,3 

基于生成器函數的迭代器實現

使用生成器函數(Generator)實現是最簡單的,只要使用 yield 語句返回每一次的值即可。如下所示:

  1. Range.prototype[Symbol.iterator] = function* () { 
  2.   while (this.id <= this.end) { 
  3.     yield this.id++; 
  4.   } 

異步迭代器

到目前為止我們上面講解的都是同步模式的迭代器,這個很好理解,因為我們的數據源本身也就是同步的,但是在 Node.js 中一次網絡 I/O 請求或者一次文件 I/O 請求,它們都是基于事件是異步的,所以我們就不能像使用 Symbol.iterator 的方式來使用。ECMAScript 2018 標準中提供了 **Symbol.asyncIterator **屬性,這是一個異步迭代器,如果一個對象設置了該屬性,它就是異步可迭代對象,相應的我們要使用 for await...of 循環遍歷數據。

自定義異步迭代器

  1. function Range(start, end) { 
  2.   this.id = start; 
  3.   this.end = end
  4. // 與上面不同,function 前我們增加了 async 關鍵字 
  5. Range.prototype[Symbol.asyncIterator] = async function* () { 
  6.   while (this.id <= this.end) { 
  7.     yield this.id++; 
  8.   } 
  9. const r1 = new Range(0, 3); 
  10. console.log(r1[Symbol.asyncIterator]()); // Object [AsyncGenerator] {} 
  11. for await (const id of r1) { 
  12.   console.log(id); // 0,1,2,3 

與同步迭代器的不同

  • 同步迭代器返回的是一個常規的 { value, done } 對象,而異步迭代器返回的是一個包含 { value, done } 的 Promise 對象。
  • 同步可迭代協議具有 Symbol.iterator 屬性,異步可迭代協議具有 Symbol.asyncIterator 屬性。
  • 同步迭代器使用 for...of 循環遍歷,異步迭代器使用 for await...of 循環遍歷。

異步迭代器的支持目前沒有默認設定了 [Symbol.asyncIterator] 屬性的 JavaScript 內建的對象。不過,WHATWG(網頁超文本應用技術工作小組)Streams 會被設定為第一批異步可迭代對象,[Symbol.asyncIterator] 最近已在設計規范中落地。

下一節我們將會講解異步迭代器在 Node.js 中的使用,歡迎關注。

Reference

[1]你不知道的JavaScript(中卷): https://book.douban.com/subject/26854244/[2]可迭代協議: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols[3]Symbol.asyncIterator: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator

本文轉載自微信公眾號「Nodejs技術棧」,可以通過以下二維碼關注。轉載本文請聯系Nodejs技術棧公眾號。 

 

責任編輯:武曉燕 來源: Nodejs技術棧
相關推薦

2018-07-16 16:10:03

前端JavaScript面向對象

2024-08-05 00:00:50

ES6JavaScriptClass

2011-05-20 17:10:31

Bing云計算

2022-09-14 08:01:36

JoinMySQL迭代器

2023-03-01 00:07:32

JavaScript迭代器生成器

2023-05-10 08:21:42

Es6Set

2022-06-01 09:06:58

ES6數組函數

2021-08-16 07:05:58

ES6Promise開發語言

2017-08-31 14:25:34

前端JavascriptES6

2020-07-01 07:58:20

ES6JavaScript開發

2022-10-31 16:20:33

JavaScript前端開發

2024-02-27 08:22:56

2020-12-30 15:06:39

開發技能代碼

2018-05-28 09:20:10

Python迭代for循環

2024-06-26 08:18:08

ES6模板字符串

2021-07-30 07:10:07

ES6函數參數

2021-08-07 21:51:17

服務器網站部署

2023-01-12 22:00:48

2021-07-16 07:26:48

ES6javascript開發語言

2025-05-13 08:25:00

模塊化編程JavaScript
點贊
收藏

51CTO技術棧公眾號

亚洲综合成人网| 久久精品久久精品| 亚洲国产精久久久久久久| r级无码视频在线观看| 欧美一级在线免费观看| 国产欧美精品| 中文字幕亚洲一区二区三区五十路 | 欧美极品aⅴ影院| 成人免费淫片视频软件| 久久久久久天堂| 精品久久久久久久| 欧美一区二区免费观在线| 国产视频九色蝌蚪| 日本在线观看| 99久久99久久综合| 国产一区红桃视频| 亚洲伊人成人网| 99久久影视| 精品美女一区二区| 91国内在线播放| 久草在线资源福利站| 中文字幕一区二区三区av| 久久久水蜜桃| 亚洲av综合色区无码一二三区| 久久精品一本| 国模gogo一区二区大胆私拍| 国产精品视频一区二区在线观看| 欧美亚洲色图校园春色| 日韩一区二区精品葵司在线| 国产三级三级三级看三级| 久色国产在线| 亚洲精品视频在线观看网站| 视频在线精品一区| 四虎在线免费看| 成人18视频在线播放| 成人欧美在线观看| 一区二区三区在线免费观看视频 | 综合久久给合久久狠狠狠97色| 国产欧美一区二区在线播放| av中文字幕观看| 久久精品国产亚洲高清剧情介绍| 热99久久精品| 中文字幕精品三级久久久| 黄色av成人| 欧美乱人伦中文字幕在线| 国精产品视频一二二区| 国产精品亚洲片在线播放| 日韩av在线免费看| 久久久久国产免费| 日韩08精品| 91精品国产乱码| 天堂中文av在线| 日韩成人精品一区二区三区| 欧美三级中文字幕在线观看| 狠狠热免费视频| 在线成人视屏| 精品视频1区2区3区| 午夜视频你懂的| 粉嫩av一区二区三区四区五区 | 亚洲成人黄色片| 国产精品66部| 国产精品久久波多野结衣| 国产福利第一页| 高清在线成人网| 国产欧美一区二区视频| 天堂网在线播放| 91麻豆视频网站| 日韩.欧美.亚洲| 淫片在线观看| 亚洲欧美日韩国产综合在线| 91传媒免费视频| 男女免费观看在线爽爽爽视频| 一区二区三区四区中文字幕| 国产96在线 | 亚洲| 性欧美18xxxhd| 欧洲一区二区三区在线| 午夜久久福利视频| 日韩激情综合| 亚洲国产毛片完整版| 91精品人妻一区二区三区蜜桃欧美| 国产成人三级| 日韩亚洲国产中文字幕| www青青草原| 一本色道久久综合亚洲精品高清| 日韩av手机在线观看| 亚洲一区二区视频在线播放| 国产成人综合亚洲网站| 久久精品二区| 秋霞午夜理伦电影在线观看| 亚洲国产综合人成综合网站| 欧美成人精品欧美一级乱| 欧美videos粗暴| 精品88久久久久88久久久| 91久久免费视频| 久久久久久久久国产一区| 午夜亚洲性色视频| 日韩欧美亚洲国产另类| 亚洲男人在线天堂| 第四色成人网| 久久全国免费视频| 中文人妻熟女乱又乱精品| 国产福利一区二区| 日本免费高清一区二区| 亚洲淫性视频| 91黄视频在线| 中文字幕99页| 999久久久国产精品| 国内精品久久久久久久| 日韩精品成人免费观看视频| 国内精品伊人久久久久av一坑| 国模精品一区二区三区| 亚洲乱亚洲乱妇| 图片区小说区国产精品视频| 亚洲精品综合在线观看| 日韩高清一级| 久久99久久久久久久噜噜| 人人妻人人爽人人澡人人精品| 高清国产一区二区三区| 伊人av成人| 日本综合视频| 国产婷婷成人久久av免费高清 | 自拍偷拍欧美激情| 男人的天堂99| 国产精品天天看天天狠| 日韩亚洲综合在线| 国产一区二区视频网站| 成人黄色国产精品网站大全在线免费观看| 亚洲精品无人区| 综合在线影院| 亚洲精品xxx| 久草网站在线观看| 久久精品国产精品青草| 蜜桃视频在线观看成人| 国产啊啊啊视频在线观看| 欧美日韩黄色一区二区| 亚洲午夜久久久久久久国产| 一区二区福利| 国产视频在线观看一区| 欧美黑人猛交| 日韩午夜激情视频| 久久国产波多野结衣| 美腿丝袜亚洲综合| 日韩一二三区不卡在线视频| 蜜臀国产一区| 亚洲欧美国内爽妇网| 99热只有这里有精品| 不卡的av在线播放| 精品成在人线av无码免费看| 国产福利资源一区| 欧美日韩国产成人在线观看| 国产黄色片免费| 一区二区三区在线免费播放| 秋霞午夜鲁丝一区二区| 欧美日韩国产探花| 99精品99久久久久久宅男| 尤物yw193can在线观看| 日韩欧美久久久| 国产一级av毛片| 成人的网站免费观看| 日韩国产一级片| 国产精品久久久久av蜜臀| 久久久久久久久亚洲| 天天综合网在线观看| 欧美性生交xxxxxdddd| 日本丰满少妇裸体自慰| 鲁大师成人一区二区三区| 欧美日韩免费高清| 福利一区二区免费视频| 久久精品国产清自在天天线| 精品国产无码一区二区三区| 亚洲综合视频网| 国产xxxxxxxxx| 天堂久久一区二区三区| 亚洲天堂电影网| 欧美日韩中出| 97人人模人人爽人人喊中文字| 视频一区二区三区在线看免费看| 在线看国产一区| 蜜桃视频最新网址| 国产iv一区二区三区| 无码人妻精品一区二区三区在线| 国产精品最新| 91九色单男在线观看| 国产探花视频在线观看| 亚洲欧美国产视频| 夜夜躁很很躁日日躁麻豆| 一区二区三区国产| 国产精品成人一区二区三区电影毛片 | 欧美日本视频在线观看| 欧美精品系列| 3d动漫精品啪啪一区二区三区免费| 99re6在线精品视频免费播放| 亚洲午夜小视频| 99久久久国产精品无码网爆| 丰满岳妇乱一区二区三区| 天堂资源在线视频| 成人午夜伦理影院| 91热这里只有精品| 欧美精品网站| 日韩欧美一区二区三区久久婷婷| 亚洲精品国产九九九| 青青久久av北条麻妃黑人| free性欧美hd另类精品| 亚洲无线码在线一区观看| 亚洲国产日韩在线观看| 在线观看日韩电影| 国产午夜久久久| 中文字幕精品三区| 97香蕉碰碰人妻国产欧美 | 亚洲1区2区3区视频| www.com.av| 久久久久久亚洲综合| 欧美熟妇精品一区二区| 蜜桃视频在线一区| 欧美日韩亚洲一| 激情一区二区| 99re99热| 久久国产精品亚洲人一区二区三区 | 亚洲中文字幕久久精品无码喷水| 欧美涩涩网站| 自拍亚洲欧美老师丝袜| 国产精品一区高清| 久久国产精品久久| 99re8这里有精品热视频8在线 | 欧美精品第一页在线播放| 在线观看a视频| 亚洲视频在线观看网站| 黄色美女一级片| 日韩女优视频免费观看| 91精品国产乱码久久| 欧美色网一区二区| 一级黄色在线观看| 色哟哟在线观看一区二区三区| 精品少妇久久久久久888优播| 综合久久给合久久狠狠狠97色 | 国产一区私人高清影院| 日本一道高清亚洲日美韩| 91精品国产91久久久久福利| 久久五月精品中文字幕| 久久99精品久久久久久噜噜 | 亚洲精品一区二区三区区别| 91精品国产91久久久久久最新毛片 | 久久久久欧美| 一区二区三区韩国免费中文网站| 激情小说网站亚洲综合网 | 狠狠色狠狠色综合日日91app| 亚洲欧美日韩一级| 男人的j进女人的j一区| 欧美精品性生活| 麻豆精品国产91久久久久久| 中文字幕网av| 激情综合色综合久久综合| 在线观看免费av网址| 久久99精品国产麻豆婷婷| 天天操天天干天天做| 久久99九九99精品| av在线免费看片| 国产精品18久久久久久vr| 91porn在线| 99re8在线精品视频免费播放| 中文在线永久免费观看| 久久综合久久综合久久| 人妻少妇无码精品视频区| 国产欧美一区二区三区鸳鸯浴| 国产又粗又黄又猛| 中文字幕日韩精品一区| 性色av无码久久一区二区三区| 亚洲精品乱码久久久久久黑人 | 欧美日韩你懂得| 国产精品一区二区人人爽| 日韩视频中午一区| 亚洲欧美国产高清va在线播放| 亚洲国产欧美在线成人app | 麻豆一区一区三区四区| 欧美日韩高清免费| 色综合咪咪久久网| 成年人网站国产| 老牛国产精品一区的观看方式| 9l视频白拍9色9l视频| 狠狠色丁香久久婷婷综合丁香| 三上悠亚 电影| 91麻豆成人久久精品二区三区| 亚洲天堂岛国片| 亚洲精品免费在线播放| 在线观看国产亚洲| 欧美日韩综合在线| www.com欧美| 亚洲欧美在线第一页| 男人影院在线观看| 午夜精品国产精品大乳美女| 色成人免费网站| 成人欧美一区二区三区在线观看| 亚洲调教一区| 4444在线观看| 日韩精品一区第一页| 91亚洲一线产区二线产区| 久久精品一区二区三区不卡| 校园春色 亚洲| 欧美系列亚洲系列| 欧洲精品久久一区二区| 日韩中文综合网| 亚洲天堂免费电影| 亚洲一区二区三区在线免费观看| 蜜乳av综合| 国产精品久久久久7777| 六月丁香婷婷色狠狠久久| 亚洲色图欧美日韩| 日韩一区在线免费观看| 久久久精品视频网站 | 日本亚洲欧洲色| 澳门久久精品| 伊人久久99| 日本中文字幕一区| 青青草视频播放| 亚洲主播在线播放| 91女人18毛片水多国产| 日韩精品在线观看一区二区| а√资源新版在线天堂| 国产精品无码专区在线观看| 性人久久久久| 免费拍拍拍网站| 国产精品亚洲午夜一区二区三区| 91精品久久久久久久久久久久| 欧美特黄级在线| 蜜臀久久久久久999| 久久亚洲国产精品| 丁香久久综合| 亚洲欧美日韩另类精品一区二区三区| 亚洲欧美久久久| 免费黄色三级网站| 亚洲影视在线播放| 国产黄色片免费| 九九精品在线视频| 99国内精品久久久久| 亚洲成人18| 欧美96一区二区免费视频| 级毛片内射视频| 91国偷自产一区二区开放时间| 十九岁完整版在线观看好看云免费| 国内精品久久久久久久久| 日韩最新av| 久久综合久久久久| 福利一区二区在线| 精品无码黑人又粗又大又长| 精品国产乱码久久久久久蜜臀 | 999国产精品视频| 日本中文字幕二区| 国产精品国产自产拍高清av王其| 国产情侣免费视频| 在线观看欧美成人| 欧美大陆国产| 国产卡一卡二在线| 国产福利精品一区| 久久久全国免费视频| 亚洲第一免费网站| 免费毛片b在线观看| 久久久久久高清| 久久精品女人天堂| 岛国片在线免费观看| 91超碰这里只有精品国产| 老司机在线永久免费观看| 91在线网站视频| 欧美日本一区二区高清播放视频| 亚洲少妇中文字幕| 精品久久久中文| 风间由美一区| 成人做爽爽免费视频| 欧美三级视频| 免费看黄色aaaaaa 片| 在线观看亚洲一区| 国产原创精品视频| 国产精品对白刺激久久久| 9色国产精品| 超碰97av在线| 欧美本精品男人aⅴ天堂| 大桥未久在线视频| 日本一区免费观看| 九一九一国产精品| 久久这里只有精品国产| 亚洲女同精品视频| 91精品一久久香蕉国产线看观看| www.好吊操| 国产精品欧美极品| 亚洲av色香蕉一区二区三区| 热99精品里视频精品| 亚洲第一偷拍| 亚洲欧美色图视频| 欧美另类高清zo欧美| 大菠萝精品导航| 在线无限看免费粉色视频| 不卡影院免费观看| 中文字幕人妻色偷偷久久| 欧美美最猛性xxxxxx| 九九在线高清精品视频| 亚洲图片 自拍偷拍| 精品久久久久久久久国产字幕 | 麻豆网站免费观看| 色综合久久六月婷婷中文字幕| 成人影院在线看| 天堂av一区二区|