日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解JS前端使用迭代器和生成器原理及示例

瀏覽:143日期:2022-06-01 09:30:01
目錄
  • 正文
  • for of 是干什么用的
  • 可迭代對象是什么?
  • 生成器和迭代器的關系。
  • 讓非迭代對象也可以使用for of 進行遍歷
  • for循環和for in的關系
  • 總結

正文

生成器和迭代器這兩個東西平時作為一個切圖仔,一直都沒有使用到。感覺是只有在面試之前才會的東西。面試過不了幾天,再次看這兩個詞一陣恍惚。

記憶力退化成這樣了么?最大的原因一定是用得少了。然后呢?就是沒有真正的理解它們。我對于它們的認知常常有下面這些:

1. 我常常把迭代器和生成器理解成完全不同的東西。

2. 我常常把for、forEach、map、reducefor of混為一談

3. 我常常把數組、類數組認為是可迭代對象

想來要真正的記住它,增加自己的武器庫,必須要弄明白這些東西才行。

我們首先是要搞明白什么for of是干什么用的。

業務代碼確實使用不上,但是如果不理解的話,等真到了可以使用的場景的時候,又是否真的能夠運用起來,甚至記起來呢?

for of 是干什么用的

所有人都知道一些概念for、forEach、map、reduce這些是可以遍歷數組的,for of是用于遍歷迭代對象的。如下:

const arr = [1, 2, 3]arr.forEach((item, index) => {   console.log(item) // 1, 2, 3    console.log(index) // 0, 1, 2})

而巧合的是for of也可以遍歷數組

for (let key of arr) {    console.log(key) // 1 2 3}

將arr改變為const obj = { a: 1, b: 2, c: 3 }的時候,兩者都沒有遍歷出結果。

前者是沒有反應,后者會直接報錯:TypeError: obj is not iterable。翻譯一下,類型錯誤:obj 不是一個可迭代對象。

那么什么是可迭代對象呢?

可迭代對象是什么?

我們先來看看下面這個例子:

const itemLi1 = document.getElementByTagName("li")const itemLi2 = document.querySelectorAll("li")for(let key of itemLi1) {    console.log(item)}for(let key of itemLi2) {    console.log(item)}

也就是說HTMLCollectionNodeList是可以迭代對象。其他的可迭代對象有Array、map、set、string等等。如果說類數組的話,是不是迭代對象呢?

const arrLike = {  0: 1,  1: 2,  2: 3,  lenght: 3}for (let i = 0; i < arrLike.length; i++) {    console.log(arrLike[i]) // 1, 2, 3}for (let of arrLike) {    console.log(key) // uncachh TypeError: obj is not iterable}

for循環打印出了對應的結果,而for of 報錯了。類數組不是可迭代的的對象。這又是為什么呢?我們將類數組和HTMLCollection類型打印出來比較一下。

而類數組如下:

它們有一個明顯的不同,可迭代對象的原型鏈上面是包括Symbol.iterator的。而這個就是讓數組變成可迭代的根本原因。

也就是說,當目的對象的原型鏈上面包括Symbol.iterator的時候,它才是可迭代對象。

對象是無序的,無序的東西自然不可以迭代

這里使用到了Symbol類型,它在MDN上面的解釋就是用于生成全局唯一的變量。而可迭代對象就是它的使用場景。受它的啟發,我們在業務當中,如果需要前端來生成一個唯一ID的時候,再次之前,通常都是創建一個UUID的函數來生成一個唯一ID。Symbol不用這么麻煩,直接使用就可以了。

由此可知,Array.prototype[Symbol.iterater]這個函數封裝了一些東西,使得for of可以將對象的元素給打印出來。

換一句話來說,就是Array.prototype[Symbol.iterater] = function() {}的執行生成一個迭代器對象。

也就是說,當Object.prototype也有[Symbol.iterater]的方法的時候,for of也能夠遍歷它呢?我們來試試看吧。

Object.ptotoype[Symbol.iterator] = function value() {}

這不就是生成器的作用么?

生成器和迭代器的關系。

ES6給我提高了一個生成器的函數。既然叫做生成器,它生成的東西就是迭代器。

表現形式如下:

function * generation(iterableObject) {    for(let i = 0; i < iterableObject; i++) {yield iterableObject[i]    }}

*符號和yield關鍵字組成。

const iterator = generation([1, 2, 3]), 其執行流程如下:

iterator.next() ==> { value: 1, done: false }

iterator.next() ==> { value: 2, done: false }

iterator.next() ==> { value: 3, done: false }

iterator.next() ==> { value: undefined, done: true }

到了第四次,value為undefined的時候,done為true(也就是說,當done為true的時候,value一定為undefined)。所以說,yield的作用有兩個:

  • 生成一個值,將該值封裝成一個對象,而這個對象是{ value: .., done: flase/true }這樣的形式。
  • 停下來

可以明顯的看出來,生成器有一個作用,通過next這個接口,可以看到迭代的過程。

既然說生成器生成了一個迭代器,那么是不是說生成器執行后的結果就是一個迭代器呢?既然是迭代器,自然就可以被for of給遍歷。

for (const key of generation([1, 2, 3]) {    console.log(key) // 1, 2, 3}

果然可以。

經典面試題: 自己實現一個next這樣的接口呢?

上面已經有了實現的思路。通過一個標識符和一個判斷就能夠使用ES5來使用,如下代碼片段。

function generation(iterableObj) {    let nextIndex = 0    function next() {}    return {next: () => {    return nextIndex < iterableObj.length     ? { value: iterableObj[nextIndex++], done: false }     : { value: undefined, done: true } }    }}

當nextIndex下于數組長度的時候,沒有迭代完畢。

注意:nextIndex++是先跑nextIndex,再自增。

何為接口,后臺給你一個url地址,這個是網絡接口。next是設計師給你封裝的一個方法,你通過這個方法來達到上吧yield的兩個作用,所以next()也是一個接口,前端接口。簡單來說,一個封裝好的方法就是一個接口。

讓非迭代對象也可以使用for of 進行遍歷

正如第一節所說,Symbol.iterator的方法是迭代器的關鍵。那么我們也可以給Object掛載上該方法。既然該方法可以讓對象變成迭代器,就可以直接使用上面ES5實現next方法的代碼片段。

const obj = {  a: 1,  b: 2,  c: 3}Object.prototype[Symbol.iterator] = function value() {  const keys = Object.keys(Object(this))  let nextIndex = 0  function next() {    return nextIndex < keys.length? { value: [keys[nextIndex], obj[keys[nextIndex ++]]], done: false }: { value: undefined, done: true }  }  return {    next  }}for (const [key, value] in obj) {  console.log(key)}

for循環和for in的關系

for循環和for in 看著很像,其實只是共用了for這個關鍵字,它們都是JS引擎底層實現的東西。和forEach、map這些是基于for循環的API不同,它們是在實現在for循環之上的。

總結

  • 生成器generator執行的結果就是一個迭代器
  • 生成器可以是也是由ES5實現的,不是基于底層API
  • 是否是迭代器的關鍵是Symbol.iterator方法

以上就是詳解JS前端使用迭代器和生成器原理及示例的詳細內容,更多關于JS前端迭代器生成器的資料請關注其它相關文章!

標簽: JavaScript
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩一二| 日韩国产成人精品| 成人综合一区| 亚洲国产日韩欧美在线| 国产 日韩 欧美一区| 国产国产精品| 91福利精品在线观看| 久久国产亚洲精品| 午夜日本精品| 亚洲影院天堂中文av色| 亚洲深夜影院| 91午夜精品| 国产欧美欧美| 欧美日韩亚洲国产精品| 久久久久久久欧美精品| 精精国产xxxx视频在线野外| 日韩高清电影一区| 日本欧美国产| 视频一区二区中文字幕| 久久精品国内一区二区三区| 国产亚洲久久| 不卡中文字幕| 精品国产亚洲日本| 视频精品一区二区| 日本a口亚洲| 亚洲视频综合| 欧美精品三级在线| 三级在线观看一区二区 | 日韩成人午夜精品| 日韩毛片视频| 老司机免费视频一区二区| 99精品美女| 久久精品资源| 伊人久久成人| 久久国产直播| 久久视频一区| 国产精品久久久免费| 亚洲夜间福利| 99视频精品全国免费| 国产精一区二区| 黑人精品一区| 国产精品久久久亚洲一区| 日韩激情网站| 欧美特黄一区| 蜜桃伊人久久| 日韩精品免费一区二区在线观看| 国产精品日韩精品在线播放| 亚洲精品第一| 女生影院久久| 免费在线亚洲| 亚洲欧美日韩国产一区二区| 欧美精品激情| 亚洲三级在线| 国产精品扒开腿做爽爽爽软件| 国产精品magnet| 国产精品一区2区3区| 综合一区二区三区| 国产精品igao视频网网址不卡日韩 | 精品少妇一区| 国产精品一区免费在线| 国产精品nxnn| 亚洲福利一区| 欧美影院三区| 亚洲天堂黄色| 不卡一区2区| 日本不卡不码高清免费观看 | 女主播福利一区| 国产调教精品| 日韩一区二区免费看| 桃色一区二区| 欧美天堂一区二区| 久久一区二区中文字幕| 欧美日韩a区| 久久99国产精品视频| 久久精品国产久精国产| 日韩av在线播放网址| 免费国产自久久久久三四区久久 | 一本色道精品久久一区二区三区| 激情亚洲影院在线观看| 亚洲国产一区二区三区在线播放| 亚洲18在线| 天堂精品久久久久| 国内揄拍国内精品久久| 米奇777超碰欧美日韩亚洲| 久久精品99国产国产精| 久久久久免费av| 日韩在线a电影| 国产拍在线视频| 精品香蕉视频| 久久亚洲电影| 国产精品白丝久久av网站| 日韩国产一区二区| 国产不卡一区| 影音先锋久久精品| 久久影视三级福利片| 国产主播一区| 91在线成人| 亚洲视频二区| 日韩中文欧美| 福利在线免费视频| 国产欧美高清| 野花国产精品入口| 欧洲激情综合| 午夜久久久久| 色爱综合网欧美| 韩日一区二区| 国产乱码精品一区二区三区四区| 蜜桃精品在线| 日韩欧美精品一区| 麻豆精品在线| 日本特黄久久久高潮| 久久精品卡一| 蜜桃av.网站在线观看| 国产一区二区久久久久| 国产传媒在线| 久久精品午夜| 国产在线不卡一区二区三区 | 国产精品一区亚洲| 欧美激情在线精品一区二区三区| 国产精品主播| 精品欧美日韩精品| 欧美精品福利| 亚洲最新av| 亚洲精品成人一区| 福利一区和二区| av亚洲一区二区三区| 在线日韩一区| 日韩avvvv在线播放| 日韩中文影院| 日韩一区电影| 欧美影院三区| 国产精品99久久免费观看| 影院欧美亚洲| 国产情侣一区| 国产欧美日韩精品高清二区综合区| 黄色欧美日韩| 亚洲三级av| 香蕉久久精品| 日本欧美一区二区| 日韩亚洲精品在线观看| 五月综合激情| 国产精品久久久久久久久久妞妞| 精品久久久网| 日本在线一区二区三区| 亚洲香蕉久久| 国产日韩亚洲| 国产免费av国片精品草莓男男| 久久超级碰碰| 激情91久久| 国产精品一区亚洲| 亚洲四虎影院| 成人看片网站| 91精品国产自产观看在线 | 国产精品美女在线观看直播| 尹人成人综合网| 国产精品66| 亚洲三级网址| 久久精品99国产国产精| 国产欧美高清| 亚洲美洲欧洲综合国产一区| 好吊日精品视频| 日韩av免费| 日韩欧美激情| 亚洲精品一二三区区别| 麻豆国产91在线播放| 91精品啪在线观看国产18 | 国产视频网站一区二区三区| 亚洲1234区| 精品一区二区三区中文字幕视频 | 日韩精选在线| 国产精品videossex| 你懂的亚洲视频| 视频一区二区三区中文字幕| 中文字幕日韩高清在线 | 久久国产婷婷国产香蕉| 高清久久精品| 久久a爱视频| 日韩和欧美的一区| 免费黄网站欧美| 极品av在线| 亚洲精品黄色| 久久久蜜桃一区二区人| 国产精品精品国产一区二区| 免费久久99精品国产自在现线| 免费一二一二在线视频| 欧美肉体xxxx裸体137大胆| 另类欧美日韩国产在线| 一区二区三区国产在线| 女生影院久久| 免费看久久久| 欧美在线资源| 久久精品国产99国产| 久久av导航| 色婷婷亚洲mv天堂mv在影片| 欧美亚洲国产日韩| 日韩午夜视频在线| 亚洲黄页一区| 日精品一区二区三区| 日本va欧美va精品| 欧美日韩网址|