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

詳解簡單易懂的 ES6 Iterators 指南和示例

 更新時間:2019年09月24日 09:27:55   作者:前端小智  
這篇文章主要介紹了詳解簡單易懂的 ES6 Iterators 指南和示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

本文旨在分析理解 Iterators。 Iterators 是 JS中的新方法,可以用來循環(huán)任意集合。 在ES6中登場的Iterators。因其可被廣泛使用,并且已在多處場景派上用場,我們將從概念上理解迭代器是什么,以及在何處使用它們和示例。我們還將看到它在JS 中的一些實現(xiàn)。

簡介

假設(shè)有這樣數(shù)組

const myFavouriteAuthors = [
 'Neal Stephenson',
 'Arthur Clarke',
 'Isaac Asimov', 
 'Robert Heinlein'
];

在某些情況下,希望返回數(shù)組中的所有單獨值,以便在屏幕上打印它們、操作它們或?qū)λ鼈儓?zhí)行某些操作。

如何處理? 簡單方法就是使用 for, while, for-of 方法。

如下:

現(xiàn)在,假設(shè)你擁有一個自定義數(shù)據(jù)結(jié)構(gòu)來保存所有authors

myFavouriteAuthors 是一個對象,它包含另一個對象 allAuthors。allAuthors 包含三個數(shù)組,其中包含 fiction、scienceFictionfantasy。

現(xiàn)在,如果要求你循環(huán)遍歷 myFavouriteAuthors 以獲得所有的author,你的方法是什么? 你可能會嘗試一些循環(huán)組合來獲得所有數(shù)據(jù)。

但是,如果你這樣做了 ——

for (let author of myFavouriteAuthors) { 
 console.log(author)
}
// TypeError: {} is not iterable

你將得到一個類型錯誤,說明該對象不可迭代。讓我們看看什么是可迭代的,以及如何使對象可迭代。

可迭代對象與迭代器 (Iterables and Iterators)

在上一節(jié)中看到了問題,從我們的自定義對象中獲取所有的author 是不容易的。我們需要某種方法,通過它我們可以有序地獲取內(nèi)部數(shù)據(jù)。

我們在 myFavouriteAuthors 中添加一個返回所有作者的方法 getAllAuthors。如:

這是一個簡單的方法。它幫我們完成了獲取所有author的功能。但是,這種實現(xiàn)可能會出現(xiàn)一些問題:

  • getAllAuthors 的名稱非常具體。如果其他人正在創(chuàng)建自己的 myFavouriteAuthors,他們可能會將其命名為retrieveAllAuthors。
  • 作為開發(fā)人員,我們總是需要知道返回所有數(shù)據(jù)的特定方法,在本例中,它被命名為getAllAuthors
  • getAllAuthors 返回的是字符串?dāng)?shù)組,如果另一個開發(fā)人員以這種格式返回一個對象數(shù)組,該怎么辦:
[ {name: 'Agatha Christie'}, {name: 'J. K. Rowling'}, ... ]

開發(fā)人員必須知道返回所有數(shù)據(jù)的方法的確切名稱和返回類型。

如果我們規(guī)定方法的名稱和它的返回類型是固定不變的呢?

讓我們將這個方法命名為 --- iteratorMethod

ECMA 也采取了類似的步驟來標(biāo)準化在定制對象上循環(huán)的過程。但是,ECMA 沒有使用名稱 iteratorMethod,而是使用名稱 Symbol.iterator。

Symbols 提供的名稱是唯一的,不能與其他屬性名稱沖突。同時,Symbol.iterator 返回一個名為迭代器的對象,這個迭代器將擁有一個名為next的方法,該方法將返回一個具有鍵值為 valuedone 的對象。

值鍵 value 包含當(dāng)前值,它可以是任何類型的,done 是布爾值,它表示是否獲取了所有的值。

下圖可以幫助建立可迭代對象、迭代器和next之間的關(guān)系,這種關(guān)系稱為迭代協(xié)議。

根據(jù)Axel Rauschmayer博士的《探索JS》一書:

可迭代是一種數(shù)據(jù)結(jié)構(gòu),它希望使其元素對外部可訪問,通過實現(xiàn)一個關(guān)鍵字是Symbol.iterator的方法來實現(xiàn),該方法是迭代器的工廠,也就是說,它將創(chuàng)建迭代器。迭代器是一個指針,用于遍歷數(shù)據(jù)結(jié)構(gòu)的元素,我們將使用computed property語法來設(shè)置這個鍵,如下:

使用對象可迭代

因此,正如我們在上一節(jié)學(xué)到的,我們需要實現(xiàn)一個名為Symbol.iterator的方法

在第4行,我們創(chuàng)建迭代器。它是一個定義了next方法的對象。next方法根據(jù)step變量返回值。在第25行,我們檢索iterator,27 行,我們調(diào)用next方法,直到 done的值為 true。

這正是for-of循環(huán)中發(fā)生的事情,for-of接受一個迭代器,并創(chuàng)建它的迭代器,它會一直調(diào)用next(),直到 done為 true。

JavaScript中可迭代對象(iterable)

JS 中的很多對象都是可迭代的。它們可能不是很好的察覺,但是如果仔細檢查,就會發(fā)現(xiàn)迭代的特征:

  • Arrays and TypedArrays
  • Strings —— 遍歷每個字符或Unicode代碼點
  • Maps —— 遍歷其鍵-值對
  • Sets —— 遍歷元素
  • arguments  —— 函數(shù)中類似數(shù)組的特殊變量
  • DOM elements (Work in Progress)

JS中使用迭代的其他一些結(jié)構(gòu)是:

for-of -- for-of 循環(huán)需要一個可迭代的對象,否則,它將拋出一個類型錯誤。

for (const value of iterable) { ... }

數(shù)組解構(gòu) -- 由于可迭代性,會發(fā)生析構(gòu)。讓我們來看看:

const array = ['a', 'b', 'c', 'd', 'e'];
const [first, ,third, ,last] = array;

等價于:

const array = ['a', 'b', 'c', 'd', 'e'];
const iterator = array[Symbol.iterator]();
const first = iterator.next().value
iterator.next().value // Since it was skipped, so it's not assigned
const third = iterator.next().value
iterator.next().value // Since it was skipped, so it's not assigned
const last = iterator.next().value

擴展操作符(…)

const array = ['a', 'b', 'c', 'd', 'e'];

const newArray = [1, ...array, 2, 3];

等價于:

const array = ['a', 'b', 'c', 'd', 'e'];
const iterator = array[Symbol.iterator]();
const newArray = [1];
for (let nextValue = iterator.next(); nextValue.done !== true; nextValue = iterator.next()) {
 newArray.push(nextValue.value);
}
newArray.push(2)
newArray.push(3)

Promise.allPromise.race 接受可迭代對象

Maps 和 Sets

讓 myFavouriteAuthors 可迭代

下面是一個實現(xiàn),它使myFavouriteAuthors 具有可迭代性:

const myFavouriteAuthors = {
 allAuthors: {
  fiction: [
   'Agatha Christie', 
   'J. K. Rowling',
   'Dr. Seuss'
  ],
  scienceFiction: [
   'Neal Stephenson',
   'Arthur Clarke',
   'Isaac Asimov', 
   'Robert Heinlein'
  ],
  fantasy: [
   'J. R. R. Tolkien',
   'J. K. Rowling',
   'Terry Pratchett'
  ],
 },
 [Symbol.iterator]() {
  // 獲取數(shù)組中的所有作者
  const genres = Object.values(this.allAuthors);
  
  // 存儲當(dāng)前類型和索引
  let currentAuthorIndex = 0;
  let currentGenreIndex = 0;
  
  return {
   // Implementation of next()
   next() {
    // 根據(jù)當(dāng)前的索引獲取對應(yīng)的作者信息
    const authors = genres[currentGenreIndex];
    
    // 當(dāng)遍歷完數(shù)組 authors是,oNotHaveMoreAuthors 為 true
    const doNothaveMoreAuthors = !(currentAuthorIndex < authors.length);
    if (doNothaveMoreAuthors) {
     // 加一繼續(xù)訪問下一個
     currentGenreIndex++;
     // 重置
     currentAuthorIndex = 0;
    }
    
    // 如果所有 genres 都遍歷完了結(jié),那么我們需要告訴迭代器不能提供更多的值。
    const doNotHaveMoreGenres = !(currentGenreIndex < genres.length);
    if (doNotHaveMoreGenres) {
     return {
      value: undefined,
      done: true
     };
    }
    
    // 如果一切正常,從當(dāng)genre 返回 作者和當(dāng)前作者索引,以便下次,下一個作者可以返回。
    return {
     value: genres[currentGenreIndex][currentAuthorIndex++],
     done: false
    }
   }
  };
 }
};

for (const author of myFavouriteAuthors) {
 console.log(author);
}

console.log(...myFavouriteAuthors)

通過本文獲得的知識,你可以很容易地理解迭代器是如何工作的,這種邏輯可能有點難以理解。因此,理解這個概念的最佳方法是多多敲死代碼,多多驗證!

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解JS對象封裝的常用方式

    詳解JS對象封裝的常用方式

    JS是一門面向?qū)ο笳Z言,其對象是用prototype屬性來模擬的,本文介紹了如何封裝JS對象,具有一定的參考價值,下面跟著小編一起來看下吧
    2016-12-12
  • JS創(chuàng)建對象的十種方式總結(jié)

    JS創(chuàng)建對象的十種方式總結(jié)

    面向?qū)ο笫且环N重要的編程范式,如何靈活的創(chuàng)建對象,是對編程基本功的考驗,本來我們來探討一下JavaScript中創(chuàng)建對象的十種方式,感興趣的小伙伴可以了解下
    2023-10-10
  • 用JavaScript實現(xiàn)UrlEncode和UrlDecode的腳本代碼

    用JavaScript實現(xiàn)UrlEncode和UrlDecode的腳本代碼

    用js自定義函數(shù)寫的實現(xiàn)url加密解密的實現(xiàn)代碼,需要的朋友可以參考下
    2008-07-07
  • js 判斷一個元素是否在頁面中存在

    js 判斷一個元素是否在頁面中存在

    js 判斷一個元素是否存在此功能在項目中很實用,本人搜集整理了一些常用技巧,需要了解的朋友可以參考下
    2012-12-12
  • javascript 貪吃蛇(詳細注釋版)

    javascript 貪吃蛇(詳細注釋版)

    javascript貪吃蛇 作者sunxing007 注釋完整,面向?qū)ο?
    2009-05-05
  • JS實現(xiàn)具備延時功能的滑動門菜單效果

    JS實現(xiàn)具備延時功能的滑動門菜單效果

    這篇文章主要介紹了JS實現(xiàn)具備延時功能的滑動門菜單效果,涉及JavaScript基于鼠標(biāo)事件與時間函數(shù)實現(xiàn)頁面樣式延遲變換功能,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • Javascript 對象(object)合并操作實例分析

    Javascript 對象(object)合并操作實例分析

    這篇文章主要介紹了Javascript 對象(object)合并操作,結(jié)合實例形式分析了javascript基于jQuery的extend方法、對象屬性、遍歷賦值等操作實現(xiàn)對象合并相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下
    2019-07-07
  • javascript中的return和閉包函數(shù)淺析

    javascript中的return和閉包函數(shù)淺析

    這篇文章主要介紹了javascript中的return和閉包函數(shù)淺析,至少可以讓你搞懂那么多()是什么意思,需要的朋友可以參考下
    2014-06-06
  • JavaScript事件代理和委托詳解

    JavaScript事件代理和委托詳解

    這篇文章主要為大家詳細介紹了JavaScript事件代理和委托,感興趣的小伙伴們可以參考一下
    2016-04-04
  • input輸入框鼠標(biāo)焦點提示信息

    input輸入框鼠標(biāo)焦點提示信息

    本文給大家分享的是一則非常常用和實用的小技巧,當(dāng)鼠標(biāo)點擊到輸入框(input)里的時候,輸入框的提示消失,鼠標(biāo)再移開,輸入框提示出現(xiàn),推薦給小伙伴們
    2015-03-03

最新評論