首頁 > web前端 > js教程 > 主體

Javascript迭代器的用法是什麼

WBOY
發布: 2022-03-01 14:59:44
原創
2757 人瀏覽過

在JavaScript中,迭代器是一種設計模式,用來在容器物件上遍歷,就是依序拿到其中的數據,js中的迭代器有一個next()方法,每次呼叫都會傳回一個對象,語法為「next:function(){return{value,done}}」。

Javascript迭代器的用法是什麼

本教學操作環境:windows10系統、javascript1.8.5版、Dell G3電腦。

Javascript迭代器的用法是什麼

  迭代器是一種設計模式,可在容器物件 如 鍊錶、陣列上遍歷,無需關心容器物件的記憶體分配的實作細節。簡單的理解就是可以一個一個的依序拿到其中的數據,類似一個移動的指針,但是會告訴我們什麼時候結束。這樣我們可以拿到資料之後可以做一些我們需要做的事情。

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

#  在javascript 中迭代器是一個特殊對象,這個迭代器物件有一個next()方法,每次呼叫都傳回一個物件(結果物件)。結果物件有兩個屬性:一個是value,表示下一個將要傳回的值;另一個是done,它是一個布林類型的值,如果已經迭代到序列中的最後一個值,則它為 true。迭代器也會保存一個內部指針,用來指向目前集合中值的位置,每呼叫一次next()方法,都會傳回下一個可用的值,類似下面這個物件的結構。

{
  next: function () {
        return {
            value:'',
            done: true / false
        }  
    }
}
登入後複製

迭代協定

  隨著javascript 語言的能力進一步提升,新增了一些新的資料類型 如 Map、Set、WeakMap 等,為了這些不同的資料結構,可以統一的迭代,es6 增加了迭代協定這個東西。

迭代協定並不是新的內建實作或語法,而是協定。這些協議可以被任何遵循某些約定的物件來實現。

迭代協定具體分為兩個協定:可迭代協定和迭代器協定。

簡單的理解就是在js 中任何物件只要滿足迭代協定就可以遍歷

可迭代協定

要成為可迭代對象, 一個物件必須實作 @@iterator 方法。這意味著物件(或它原型鏈上的某個物件)必須有一個鍵為 @@iterator 的屬性,可透過常數 Symbol.iterator 存取該屬性:

簡單的理解,您想要一個東西可以遍歷,那麼這個東西要有一個 @@iterator ,這個屬性可以透過Symbol.iterator 存取

Javascript迭代器的用法是什麼

迭代器協定

迭代器協定定義了產生一系列值(無論是有限個還是無限個)的標準方式。當值為有限個時,所有的值都被迭代完畢後,則會傳回一個預設回傳值。

只有實作了一個擁有以下語意(semantic)的 next() 方法,一個物件才符合迭代器協定:

Javascript迭代器的用法是什麼

##迭代過程

當一個物件需要被迭代的時候(例如被寫入一個 for...of 迴圈時),首先,會不帶參數呼叫它的 @@iterator 方法( 此時回傳的是結構是這樣的 { next: function () {}}),然後使用此方法返回的迭代器來獲得要迭代的值(其實就是不斷的呼叫這個next()方法)

#迭代總結

迭代協定可以總結為,一個東西要遍歷,必須滿足可迭代協定跟迭代器協定

可迭代協定:這個物件必須有@@iterator,可以透過Symbol.iterator 存取

迭代器協定:是一個對象,這個物件的next() 函數傳回一個對象,這個物件包括兩個屬性,一個是value,一個是done(boolean,是否是最後一個元素,done 為 true 時 value 可省略)

也就是說 迭代器物件本質上,就是一個指針對象。透過指針對象的next(),用來移動指針。

自訂迭代

對像是沒有實作迭代器,所以不能遍歷對象,為了可以實現對象的遍歷,我們需要在對像上實作上面說的迭代器,通常有兩種寫法,一種是傳統的寫法,這種需要自己去控制內部的狀態,另外一種是利用生成器函數傳回的Generator的迭代器來實現,程式碼如下:

傳統寫法

let obj = {
  name: 'joel',
  adress: 'gz',
  [Symbol.iterator]: () => {
     // 这里不要用this, 因为是return fn, this 会丢失
    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(&#39;atrrs:&#39; + item + &#39;,value:&#39; + obj[item])
}
登入後複製

生成器函數寫法

// 为不可迭代的对象添加迭代器
let obj = {
  a: 1,
  b: 2
}
obj[Symbol.iterator] = function* () {
  let keys = Object.keys(obj);
  //取到key值的长度
  let len = keys.length;
  //定义循环变量
  let n = 0;
  //条件判断
  while (n <= len - 1) {
      yield { k: keys[n], v: obj[keys[n]] };
      n++
  }
}
//返回的是个对象的key和value
for (let { k, v } of obj) {
  console.log(k, v);
}
登入後複製
相關推薦:

javascript學習教學

以上是Javascript迭代器的用法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!