目錄
關鍵要點
迭代器
生成器
很酷,那麼我現在可以使用生成器和迭代器了嗎?
結論
關於ECMAScript 2015生成器和迭代器的常見問題解答 (FAQ)
ECMAScript 2015中的迭代器和生成器有什麼區別?
如何在ECMAScript 2015中使用yield關鍵字?
ECMAScript 2015中next()方法的目的是什麼?
如何在ECMAScript 2015中使用生成器進行異步編程?
ECMAScript 2015中for…of循環和for…in循環有什麼區別?
如何在ECMAScript 2015中創建自定義迭代器?
Symbol.iterator在ECMAScript 2015中的作用是什麼?
你能提供ECMAScript 2015中生成器函數的示例嗎?
如何在ECMAScript 2015中使用throw()方法和生成器?
done屬性在ECMAScript 2015迭代器中的意義是什麼?
首頁 web前端 js教程 ES6發電機和迭代器:開發人員指南

ES6發電機和迭代器:開發人員指南

Feb 15, 2025 am 11:42 AM

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

熱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

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1655
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1252
29
C# 教程
1226
24
前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

如何實現視差滾動和元素動畫效果,像資生堂官網那樣?
或者:
怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? 如何實現視差滾動和元素動畫效果,像資生堂官網那樣? 或者: 怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? Apr 04, 2025 pm 05:36 PM

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

JavaScript引擎:比較實施 JavaScript引擎:比較實施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

前端開發中如何實現類似 VSCode 的面板拖拽調整功能? 前端開發中如何實現類似 VSCode 的面板拖拽調整功能? Apr 04, 2025 pm 02:06 PM

探索前端中類似VSCode的面板拖拽調整功能的實現在前端開發中,如何實現類似於VSCode...

See all articles