欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

學(xué)會(huì)javascript之迭代器

 更新時(shí)間:2021年09月02日 09:14:05   作者:風(fēng)吹De麥浪  
本文主要講解javascript之迭代器,在 JavaScript 中,迭代器是一個(gè)對(duì)象,它定義一個(gè)序列,并在終止時(shí)可能返回一個(gè)返回值。需要詳細(xì)了解相關(guān)知識(shí)的小伙伴可以參考一下這篇文章

簡(jiǎn)介

  迭代器是一種設(shè)計(jì)模式,可在容器對(duì)象 如 鏈表、數(shù)組上遍歷,無需關(guān)心容器對(duì)象的內(nèi)存分配的實(shí)現(xiàn)細(xì)節(jié)。簡(jiǎn)單的理解就是可以一個(gè)一個(gè)的依次拿到其中的數(shù)據(jù),類似一個(gè)移動(dòng)的指針,但是會(huì)告訴我們什么時(shí)候結(jié)束。這樣我們可以拿到數(shù)據(jù)之后可以做一些我們需要做的事情。

js 中的迭代器是什么樣子的

  在javascript 中迭代器是一個(gè)特殊對(duì)象,這個(gè)迭代器對(duì)象有一個(gè)next()方法,每次調(diào)用都返回一個(gè)對(duì)象(結(jié)果對(duì)象)。結(jié)果對(duì)象有兩個(gè)屬性:一個(gè)是value,表示下一個(gè)將要返回的值;另一個(gè)是done,它是一個(gè)布爾類型的值,如果已經(jīng)迭代到序列中的最后一個(gè)值,則它為 true。迭代器還會(huì)保存一個(gè)內(nèi)部指針,用來指向當(dāng)前集合中值的位置,每調(diào)用一次next()方法,都會(huì)返回下一個(gè)可用的值,類似下面這個(gè)對(duì)象的結(jié)構(gòu)。

{
  next: function () {
        return {
            value:'',
            done: true / false
        }  
    }
} 

迭代協(xié)議

  隨著javascript 語言的能力進(jìn)一步提升,新增了一些新的數(shù)據(jù)類型 如 Map、Set、WeakMap 等,為了這些不同的數(shù)據(jù)結(jié)構(gòu),可以統(tǒng)一的迭代,es6 增加了迭代協(xié)議這個(gè)東西。

迭代協(xié)議并不是新的內(nèi)置實(shí)現(xiàn)或語法,而是協(xié)議。這些協(xié)議可以被任何遵循某些約定的對(duì)象來實(shí)現(xiàn)。

迭代協(xié)議具體分為兩個(gè)協(xié)議:可迭代協(xié)議和迭代器協(xié)議。

簡(jiǎn)單的理解就是在js 中任何對(duì)象只要滿足迭代協(xié)議就可以遍歷

可迭代協(xié)議

要成為可迭代對(duì)象, 一個(gè)對(duì)象必須實(shí)現(xiàn) @@iterator 方法。這意味著對(duì)象(或者它原型鏈上的某個(gè)對(duì)象)必須有一個(gè)鍵為 @@iterator 的屬性,可通過常量 Symbol.iterator 訪問該屬性:

簡(jiǎn)單的理解,你想讓一個(gè)東西可以遍歷,那么這個(gè)東西要有一個(gè) @@iterator ,這個(gè)屬性可以通過Symbol.iterator 訪問

屬性

[Symbol.iterator]

一個(gè)無參數(shù)的函數(shù),其返回值為一個(gè)符合迭代器協(xié)議的對(duì)象。

迭代器協(xié)議

迭代器協(xié)議定義了產(chǎn)生一系列值(無論是有限個(gè)還是無限個(gè))的標(biāo)準(zhǔn)方式。當(dāng)值為有限個(gè)時(shí),所有的值都被迭代完畢后,則會(huì)返回一個(gè)默認(rèn)返回值。

只有實(shí)現(xiàn)了一個(gè)擁有以下語義(semantic)的 next() 方法,一個(gè)對(duì)象才符合迭代器協(xié)議:

屬性

next

一個(gè)無參數(shù)函數(shù),返回一個(gè)應(yīng)當(dāng)擁有以下兩個(gè)屬性的對(duì)象:

done(boolean)

next() 方法必須返回一個(gè)對(duì)象,該對(duì)象應(yīng)當(dāng)有兩個(gè)屬性: done 和 value,如果返回了一個(gè)非對(duì)象值(比如 false 或 undefined),則會(huì)拋出一個(gè) 異常("iterator.next() returned a non-object value")。

迭代過程

當(dāng)一個(gè)對(duì)象需要被迭代的時(shí)候(比如被寫入一個(gè) for...of 循環(huán)時(shí)),首先,會(huì)不帶參數(shù)調(diào)用它的 @@iterator 方法( 此時(shí)返回的是結(jié)構(gòu)是這樣的 { next: function () {}}),然后使用此方法返回的迭代器獲得要迭代的值(其實(shí)就是不斷的調(diào)用這個(gè)next()方法)

迭代總結(jié)

迭代協(xié)議可以總結(jié)為,一個(gè)東西要遍歷,必須滿足可迭代協(xié)議跟迭代器協(xié)議

  • 可迭代協(xié)議:這個(gè)對(duì)象必須有@@iterator,可以通過Symbol.iterator 訪問
  • 迭代器協(xié)議:是一個(gè)對(duì)象,這個(gè)對(duì)象的next() 函數(shù)返回一個(gè)對(duì)象,這個(gè)對(duì)象包括兩個(gè)屬性,一個(gè)是value,一個(gè)是done(boolean,是否是最后一個(gè)元素,done 為 true 時(shí) value 可省略)

也就是說 迭代器對(duì)象本質(zhì)上,就是一個(gè)指針對(duì)象。通過指針對(duì)象的next(),用來移動(dòng)指針。

自定義迭代

對(duì)象是沒有實(shí)現(xiàn)迭代器,所以不能遍歷對(duì)象,為了可以實(shí)現(xiàn)對(duì)象的遍歷,我們需要在對(duì)象上實(shí)現(xiàn)上面說的迭代器,通常有兩種寫法,一種是傳統(tǒng)的寫法,這種需要自己去控制內(nèi)部的狀態(tài),另外一種是利用生成器函數(shù)返回的Generator的迭代器來實(shí)現(xiàn),代碼如下:

傳統(tǒng)寫法

let obj = {
  name: 'joel',
  adress: 'gz',
  [Symbol.iterator]: () => {
     // 這里不要用this, 因?yàn)槭莚eturn fn, this 會(huì)丟失
    let index = -1, atrrList = Object.keys(obj);
    const objIterator = {
      next: () => {
        let result = ''
        index++
        if (index < atrrList.length) {
          result = {
            value: atrrList[index],
            done: false
          }
        } else {
          result = {
            done: true
          }
        }
        return result
      }
    }
    return objIterator
  }
}

for (const item of obj) {
    console.log('atrrs:' + item + ',value:' + obj[item])
}

生成器函數(shù)寫法

// 為不可迭代的對(duì)象添加迭代器
let obj = {
  a: 1,
  b: 2
}
obj[Symbol.iterator] = function* () {
  let keys = Object.keys(obj);
  //取到key值的長(zhǎng)度
  let len = keys.length;
  //定義循環(huán)變量
  let n = 0;
  //條件判斷
  while (n <= len - 1) {
      yield { k: keys[n], v: obj[keys[n]] };
      n++
  }
}
//返回的是個(gè)對(duì)象的key和value
for (let { k, v } of obj) {
  console.log(k, v);
}

其他相關(guān)如內(nèi)置可迭代對(duì)象、用于可迭代對(duì)象的語法、接受可迭代對(duì)象的內(nèi)置api 等 請(qǐng)點(diǎn)擊 這里

到此這篇關(guān)于學(xué)會(huì)javascript之迭代器的文章就介紹到這了,更多相關(guān)javascript 迭代器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 從JQuery源碼分析JavaScript函數(shù)的apply方法與call方法

    從JQuery源碼分析JavaScript函數(shù)的apply方法與call方法

    這篇文章主要介紹了從JQuery源碼分析JavaScript函數(shù)的apply方法與call方法,本文結(jié)合JQuery源碼和js高級(jí)程序設(shè)計(jì)再次探究apply方法與call方法,需要的朋友可以參考下
    2014-09-09
  • D3.js 實(shí)現(xiàn)帶伸縮時(shí)間軸拓?fù)鋱D的示例代碼

    D3.js 實(shí)現(xiàn)帶伸縮時(shí)間軸拓?fù)鋱D的示例代碼

    這篇文章主要介紹了D3.js 實(shí)現(xiàn)帶伸縮時(shí)間軸拓?fù)鋱D的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • js多功能分頁組件layPage使用方法詳解

    js多功能分頁組件layPage使用方法詳解

    這篇文章主要介紹了js多功能分頁組件layPage的適用方法,layPage是一款多功能的js分頁組件,即適用于異步分頁,又可用于傳統(tǒng)的整頁刷新跳頁,功能多樣,想要了解的朋友可以參考下文進(jìn)行學(xué)習(xí)
    2016-05-05
  • 原生JS生成指定位數(shù)的驗(yàn)證碼

    原生JS生成指定位數(shù)的驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了原生JS生成指定位數(shù)的驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • 一個(gè)頁面元素appendchild追加到另一個(gè)頁面元素的問題

    一個(gè)頁面元素appendchild追加到另一個(gè)頁面元素的問題

    一般都是自己創(chuàng)建元素然后append到頁面的但是如果是頁面本身有的元素append到另一個(gè)頁面元素呢,很多的新手朋友對(duì)此問題比較好奇,本人也是如此啊,好了不多說,切入主題,感興趣的朋友可以了解下哦
    2013-01-01
  • JS中判斷字符串中出現(xiàn)次數(shù)最多的字符及出現(xiàn)的次數(shù)的簡(jiǎn)單實(shí)例

    JS中判斷字符串中出現(xiàn)次數(shù)最多的字符及出現(xiàn)的次數(shù)的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)硪黄狫S中判斷字符串中出現(xiàn)次數(shù)最多的字符及出現(xiàn)的次數(shù)的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • Eval and new funciton not the same thing

    Eval and new funciton not the 

    以前有人會(huì)說,new Function的方式是幾乎與eval相等,今天我查了一下,確實(shí)是不同的東西,說這句話的人太不負(fù)責(zé)了。關(guān)于eval和new function,得到的結(jié)果都是一致的,都會(huì)叫你不要去使用它們。所以結(jié)論就是“不得不”才使用
    2012-12-12
  • chrome下img加載對(duì)height()的影響示例探討

    chrome下img加載對(duì)height()的影響示例探討

    這篇文章主要介紹了chrome下img加載對(duì)height()的影響,需要的朋友可以參考下
    2014-05-05
  • 微信小程序自定義scroll-view的實(shí)例代碼

    微信小程序自定義scroll-view的實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于微信小程序自定義scroll-view的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 修改發(fā)貼的編輯功能

    修改發(fā)貼的編輯功能

    修改發(fā)貼的編輯功能...
    2007-03-03

最新評(píng)論