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