摘要:我個人認為迭代器和生成器是新增的特性里面,非常重要的部分,充分地掌握和使用迭代器和生成器,是十分必要和重要的,所以我會寫關于二者的一系列文章。
我個人認為迭代器和生成器是es6新增的特性里面,非常重要的部分,充分地掌握和使用迭代器和生成器,是十分必要和重要的,所以我會寫關于二者的一系列文章。話不多說,先來了解一下基本概念:
一:什么是迭代器
1: 迭代器是一個對象 2: 迭代器有一個屬性:next()方法,它的返回值是一個對象,我姑且叫它‘next返回對象’,以便在下文使用 3: ’next返回對象有2個屬性:value和done 4: ’next返回對象‘的value:表示迭代器的數據集里面下一個將要返回的值 5: ’next返回對象‘的done:如果這輪調用next(),有數據返回,那么done為false; 如果這輪調用next(),已經沒有可返回的數據了,done為true,相應地value為undefined
根據以上描述,我們可以用ES5的語法創建一個方法,這個方法的參數是一個數組,返回值是一個迭代器對象:
function createIterator(items) { var i = 0; return { next: function () { var done = i >= items.length; var value = done ? undefined : items[i++]; return { value: value, done: done } } } } var iterator = createIterator([1, 2, 3]); console.log(iterator.next());//{value: 1, done: false} console.log(iterator.next());//{value: 2, done: false} console.log(iterator.next());//{value: 3, done: false} //沒有更多可返回的值 console.log(iterator.next());//{value: undefined, done: true}
二:什么是生成器
在上面的內容里我們了解到了什么是迭代器,并且根據迭代器的定義用es5的語法自己創建了一個生成迭代器的方法:createIterator()。在es6里面呢,我們不用再手動創建這個createIterator()方法,生成器就是用來做這個工作的。照舊,我們來看看生成器的具體定義和語法:
1: 生成器是一個函數 2: 生成器返回迭代器 3: function關鍵字后面緊挨著或者留一個空格后,必須有一個星號(*) 4: 函數體里面會用到關鍵字yield,來依次返回想要迭代的值
根據上面的定義,我們來使用生成器創建一個迭代器,取代前面的es5的語法:
function* createIterator() { yield 1; yield 2; yield 3; } let iterator = createIterator(); console.log(iterator.next());//{value: 1, done: false} console.log(iterator.next());//{value: 2, done: false} console.log(iterator.next());//{value: 3, done: false} //沒有更多可返回的值 console.log(iterator.next());//{value: undefined, done: true}
以上,我們就用生成器創建了一個迭代器,生成器創建的迭代器會按照yield語句的順序,依然返回迭代的值。當然這個例子與我們前面的es5的例子,并不是完全一樣,這里我們沒有傳入參數,而是方法體里面寫死了迭代的值。當然我們也可以傳入參數:
function* createIterator(items) { for(let i = 0; i < items.length; i++){ yield items[i]; } }
三:生成器函數表達式
生成器函數擁有一般函數的特性,所以也可以通過函數表達式來創建生成器:
let createIterator = function* (items) { for (let i = 0; i < items.length; i++) { yield items[i]; } }; let iterator = createIterator([1, 2, 3]); console.log(iterator.next()); //{value: 1, done: false} console.log(iterator.next()); //{value: 2, done: false} console.log(iterator.next()); //{value: 3, done: false} //沒有更多可返回的值 console.log(iterator.next()); //{value: undefined, done: true}
這里要特別注意的是,不能使用箭頭函數創建生成器。
四:yield的使用限制
1: yield關鍵字只能用在生成器函數內 2: 第一條所說的生成器函數內,是指最近一層的函數作用域是生成器函數。
看一個例子:
function* createIterator(items) { items.forEach(function (item) { //語法錯誤 yield item; }) }
上面這個例子里,最外層的函數數一個生成器。但是離yield最近一層的函數是forEach()里面的function,而這個function不是一個生成器函數,所以這里使用yield,依然會導致語法錯誤。
以上就是關于迭代器和生成器的基本概念,怎么創建迭代器和生成器,以及使用中一些需要特別注意的點。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105638.html
摘要:在生成器中使用語句生成器也是函數,所以它也可以使用語句。只是由于生成器本身的特性,其內部的的行為會和一般函數有些差別。 前面2篇系列文章講解了迭代器和生成器的最常用,最基礎的用法;這篇來討論迭代器和生成器的一些稍稍高級一點的用法: 1: 給迭代器的next()方法傳參 2: 從迭代器中拋出錯誤 3: 在生成器中使用return語句 4: 委托生成器(組合生成器或者生成器組合?) 1: ...
摘要:迭代器和生成器將迭代的概念直接帶入核心語言,并提供一種機制來自定義循環的行為。本文主要會介紹中新增的迭代器和生成器。屬性本身是函數,是當前數據結構默認的迭代器生成函數。 本文是 重溫基礎 系列文章的第十三篇。今日感受:每次自我年終總結,都會有各種情緒和收獲。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎】1.語法和數據類型 【重溫基礎】2.流...
摘要:迭代器迭代器用于循環構建和擴展集合類型逐行遍歷文本文件列表推導字典推導和集合推導元組拆包調用函數時,使用拆包實參解釋器需要迭代對象時,會自動調用內置的函數,有以下功能檢查對象是否實現了方法,如果實現了就調用它,獲取一個迭代器。 迭代器 迭代器用于: for 循環 構建和擴展集合類型 逐行遍歷文本文件 列表推導、 字典推導和集合推導 元組拆包 調用函數時, 使用 * 拆包實參 解釋器...
摘要:迭代器模式迭代器模式是指提供一種方法順序訪問一個聚合對象中的各個元素,而不需要暴露該對象的內部表示。可迭代協議和迭代器協議。生成器函數是可以作為迭代器工廠的函數,當它被執行時會返回一個新的對象,該對象符合可迭代協議和迭代器協議。 迭代器模式 迭代器模式是指提供一種方法順序訪問一個聚合對象中的各個元素,而不需要暴露該對象的內部表示。 迭代器分為內部迭代器和外部迭代器。內部迭代器只需一次初...
摘要:沒有顯示顯示顯示關鍵字迭代器生成器用于馬上退出代碼塊并保留現場,當執行迭代器的函數時,則能從退出點恢復現場并繼續執行下去。迭代器迭代器是一個擁有方法和方法的對象,通過函數不斷執行以關鍵字分割的代碼段,通過函數令分割的代碼段拋出異常。 一、前言 第一次看koajs的示例時,發現該語句 function *(next){..........
閱讀 1037·2023-04-25 17:51
閱讀 2852·2021-11-23 09:51
閱讀 1470·2021-11-08 13:21
閱讀 2428·2021-09-22 15:14
閱讀 1515·2019-08-30 12:48
閱讀 1076·2019-08-29 12:44
閱讀 1138·2019-08-26 12:21
閱讀 1396·2019-08-26 10:47