搜尋
首頁web前端js教程ES6發電機和迭代器:開發人員指南

ES6 Generators and Iterators: a Developer’s Guide

ES6為JavaScript語言引入了許多新特性。其中兩個特性,生成器和迭代器,極大地改變了我們在更複雜的前端代碼中編寫特定函數的方式。

雖然它們可以很好地協同工作,但它們實際的功能可能有點令人困惑,所以讓我們來仔細研究一下。

關鍵要點

  • ES6提供了一種更簡潔的for循環編寫方式,提供了一種更類似Python的方式來直接與數據集中的元素交互,使代碼更易於閱讀和編寫。
  • ES6中的生成器是記住每次調用之間狀態的函數。它們每次被調用時都可以生成序列中的下一個值,有效地創建自定義迭代。
  • 生成器函數中的“yield”關鍵字類似於“return”,但它保持函數的狀態,允許它在下一次調用時從中斷處繼續執行。
  • 雖然Node和現代瀏覽器支持ES6特性,但舊版瀏覽器可能需要Babel等轉譯器將ES6代碼轉換為ECMAScript 5代碼。

迭代器

迭代是編程中常見的做法,通常用於循環遍歷一組值,轉換每個值,或以某種方式使用或保存它以備後用。

在JavaScript中,我們一直都有這樣的for循環:

for (var i = 0; i < foo.length; i++) {
  // 对i执行某些操作
}

但ES6給了我們另一種選擇:

for (const i of foo) {
  // 对i执行某些操作
}

這可以說是更簡潔、更容易使用,讓我想起了Python和Ruby等語言。但是,關於這種新型迭代,還有一點非常重要需要注意:它允許您直接與數據集的元素交互。

假設我們想找出數組中的每個數字是否為素數。我們可以通過創建一個執行此操作的函數來做到這一點。它可能看起來像這樣:

function isPrime(number) {
  if (number <= 1) {
    return false;
  } else if (number === 2) {
    return true;
  }

  for (var i = 2; i < number; i++) {
    if (number % i === 0) {
      return false;
      break;
    }
  }

  return true;
}

不是世界上最好的,但它有效。下一步是循環遍歷我們的數字列表,並使用我們閃亮的新函數檢查每個數字是否為素數。這很簡單:

var possiblePrimes = [73, 6, 90, 19, 15];
var confirmedPrimes = [];

for (var i = 0; i < possiblePrimes.length; i++) {
  if (isPrime(possiblePrimes[i])) {
    confirmedPrimes.push(possiblePrimes[i]);
  }
}

// confirmedPrimes现在是[73, 19]

同樣,它有效,但它很笨拙,這種笨拙很大程度上取決於JavaScript處理for循環的方式。但是,有了ES6,我們就在新的迭代器中得到了一個幾乎類似Python的選項。因此,前面的for循環可以這樣編寫:

const possiblePrimes = [73, 6, 90, 19, 15];
const confirmedPrimes = [];

for (const i of possiblePrimes){
   if ( isPrime(i) ){
      confirmedPrimes.push(i);
   }
}

// confirmedPrimes现在是[73, 19]

這要乾淨得多,但最引人注目的是for循環。變量i現在代表名為possiblePrimes的數組中的實際項。因此,我們不再需要按索引調用它了。這意味著我們不必在循環中調用possiblePrimes[i],而只需調用i即可。

在幕後,這種迭代利用了ES6閃亮的新Symbol.iterator()方法。這個方法負責描述迭代,並且在被調用時,返回一個JavaScript對象,其中包含循環中的下一個值和一個done鍵,該鍵根據循環是否完成而為true或false。

如果您對這種細節感興趣,您可以閱讀Jake Archibald撰寫的這篇精彩博文《Iterators gonna iterate》。當我們深入探討本文的另一部分:生成器時,它也會讓您很好地了解幕後發生了什麼。

生成器

生成器(也稱為“迭代器工廠”)是一種新型的JavaScript函數,用於創建特定的迭代。它們為您提供了特殊、自定義的循環遍歷內容的方式。

好的,那麼這一切意味著什麼?讓我們來看一個例子。假設我們想要一個函數,每次調用它時都會給我們下一個素數:

for (var i = 0; i < foo.length; i++) {
  // 对i执行某些操作
}

如果您習慣使用JavaScript,其中一些內容看起來有點像巫術,但實際上它並不太糟糕。我們在關鍵字function之後有那個奇怪的星號,但這只是告訴JavaScript我們正在定義一個生成器。

另一個奇怪的部分是yield關鍵字。這實際上是生成器在您調用它時吐出的內容。它大致相當於return,但它保留了函數的狀態,而不是在每次調用它時都重新運行所有內容。它在運行時“記住”它的位置,因此下次您調用它時,它會從中斷處繼續執行。

這意味著我們可以這樣做:

for (const i of foo) {
  // 对i执行某些操作
}

然後,每當我們想要獲得——你猜對了——下一個素數時,都可以調用nextPrime:

function isPrime(number) {
  if (number <= 1) {
    return false;
  } else if (number === 2) {
    return true;
  }

  for (var i = 2; i < number; i++) {
    if (number % i === 0) {
      return false;
      break;
    }
  }

  return true;
}

您也可以只調用nextPrime.next(),這在您的生成器不是無限的情況下很有用,因為它返回一個這樣的對象:

var possiblePrimes = [73, 6, 90, 19, 15];
var confirmedPrimes = [];

for (var i = 0; i < possiblePrimes.length; i++) {
  if (isPrime(possiblePrimes[i])) {
    confirmedPrimes.push(possiblePrimes[i]);
  }
}

// confirmedPrimes现在是[73, 19]

在這裡,done鍵告訴您函數是否已完成其任務。在我們的例子中,我們的函數永遠不會結束,理論上可以為我們提供所有直到無窮大的素數(如果我們有那麼多的計算機內存的話)。

很酷,那麼我現在可以使用生成器和迭代器了嗎?

儘管ECMAScript 2015已經完成,並且已經存在多年了,但其特性(特別是生成器)的瀏覽器支持遠未完善。如果您真的想使用這些和其他現代特性,您可以查看Babel和Traceur等轉譯器,它們會將您的ECMAScript 2015代碼轉換為等效的(如果可能)ECMAScript 5代碼。

還有許多在線編輯器支持ECMAScript 2015,或者專門關注它,特別是Facebook的Regenerator和JS Bin。如果您只是想玩玩並了解JavaScript現在如何編寫,那麼這些值得一看。

結論

生成器和迭代器為我們處理JavaScript問題的方法提供了相當多的新靈活性。迭代器允許我們以更類似Python的方式編寫for循環,這意味著我們的代碼看起來更簡潔,更容易閱讀。

生成器函數使我們能夠編寫記住上次看到它們的位置的函數,並且可以從中斷處繼續執行。它們在實際記住的內容方面也可以是無限的,這在某些情況下非常方便。

對這些生成器和迭代器的支持很好。它們在Node和所有現代瀏覽器中都受支持,Internet Explorer除外。如果您需要支持舊版瀏覽器,最好的辦法是使用Babel等轉譯器。

關於ECMAScript 2015生成器和迭代器的常見問題解答 (FAQ)

ECMAScript 2015中的迭代器和生成器有什麼區別?

迭代器和生成器都是ECMAScript 2015的特性,用於處理數據流。迭代器是一個對象,允許程序員遍歷集合中的所有元素。它有一個next()方法,返回序列中的下一個項目。另一方面,生成器是一個可以中途停止然後從停止處繼續的函數。換句話說,生成器看起來像一個函數,但它的行為像一個迭代器。

如何在ECMAScript 2015中使用yield關鍵字?

yield關鍵字用於ECMAScript 2015暫停和恢復生成器函數(function*或舊版生成器函數)。 yield可以從生成器函數返回一個值。這個返回值通常是一個具有兩個屬性的對象:value和done。 value屬性是計算yield表達式的結果,done是一個布爾值,指示生成器是否已生成其最後一個值。

ECMAScript 2015中next()方法的目的是什麼?

next()方法是ECMAScript 2015中迭代器協議的關鍵部分。它返回一個具有兩個屬性的對象:value和done。 value屬性是迭代序列中的下一個值,done是一個布爾值,指示迭代是否完成。如果done為true,則迭代器已超出迭代序列的末尾。

如何在ECMAScript 2015中使用生成器進行異步編程?

ECMAScript 2015中的生成器可用於簡化異步編程。它們可用於阻止執行以等待異步操作完成,而不會阻塞整個程序。這可以使異步代碼看起來和行為更像同步代碼,這更容易理解和推理。

ECMAScript 2015中for…of循環和for…in循環有什麼區別?

ECMAScript 2015中的for…of循環用於循環遍歷可迭代對象,例如數組、字符串、映射、集合等等。它使用語句調用自定義迭代鉤子,這些語句將為每個不同屬性的值執行。另一方面,for…in循環用於循環遍歷對象的屬性。它返回正在迭代的對象的鍵列表。

如何在ECMAScript 2015中創建自定義迭代器?

在ECMAScript 2015中,您可以通過定義一個具有next()方法的對象來創建自定義迭代器。此方法應返回一個具有兩個屬性的對象:value和done。 value屬性是迭代序列中的下一個值,done是一個布爾值,指示迭代是否完成。

Symbol.iterator在ECMAScript 2015中的作用是什麼?

Symbol.iterator是ECMAScript 2015中一個特殊的內置符號。它用於指定對象的默認迭代器。當需要迭代一個對象時(例如在for…of循環的開頭),它的@@iterator方法將不帶任何參數被調用,並且返回的迭代器將用於獲取要迭代的值。

你能提供ECMAScript 2015中生成器函數的示例嗎?

當然,這是ECMAScript 2015中生成器函數的一個簡單示例:

for (var i = 0; i < foo.length; i++) {
  // 对i执行某些操作
}

在這個例子中,idMaker函數是一個生成器,它產生一個數字序列。

如何在ECMAScript 2015中使用throw()方法和生成器?

ECMAScript 2015中的throw()方法可用於生成器,以恢復生成器函數的執行並從yield表達式拋出錯誤。 throw()方法可用於處理生成器函數執行期間發生的錯誤。

done屬性在ECMAScript 2015迭代器中的意義是什麼?

done屬性是一個布爾值,由ECMAScript 2015中的迭代器返回。它指示迭代器是否還有更多值要返回。如果done為true,則迭代器已超出迭代序列的末尾。如果done為false,則迭代器仍然可以生成更多值。

以上是ES6發電機和迭代器:開發人員指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python和JavaScript:了解每個的優勢Python和JavaScript:了解每個的優勢May 06, 2025 am 12:15 AM

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

JavaScript的核心:它是在C還是C上構建的?JavaScript的核心:它是在C還是C上構建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript應用程序:從前端到後端JavaScript應用程序:從前端到後端May 04, 2025 am 12:12 AM

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

Python vs. JavaScript:您應該學到哪種語言?Python vs. JavaScript:您應該學到哪種語言?May 03, 2025 am 12:10 AM

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架:為現代網絡開發提供動力JavaScript框架:為現代網絡開發提供動力May 02, 2025 am 12:04 AM

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

JavaScript,C和瀏覽器之間的關係JavaScript,C和瀏覽器之間的關係May 01, 2025 am 12:06 AM

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

node.js流帶打字稿node.js流帶打字稿Apr 30, 2025 am 08:22 AM

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python vs. JavaScript:性能和效率注意事項Python vs. JavaScript:性能和效率注意事項Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境