摘要:什么是迭代器中創建迭代器如下所示什么是生成器生成器是一種返回迭代器的函數每當招待完一條語句后函數就會自動停止執行關鍵字可返回任何值或表達式關鍵字只可在生成器內部使用,在其它地方使用會導致程序拋出語法錯誤所以下面例子是有錯誤的可迭代對象具有屬
什么是迭代器
ES5中創建迭代器如下所示:
function createIterator(items) { var i = 0 return { next: function () { var done = i >= items.length var value = !done ? items[i++] : undefined return { done: done, value: value } } } } var iterator = createIterator([1, 2, 3]) console.log(iterator.next())什么是生成器
生成器是一種返回迭代器的函數
每當招待完一條yield語句后函數就會自動停止執行
function *createIterator(){ yield 1 yield 2 yield 3 } let iterator =createIterator() console.log(iterator.next())
yield關鍵字可返回任何值或表達式
function* createIterator(items) { for (let i = 0; i < items.length; i++) { yield items[i] } } let iterator = createIterator([1, 2, 3]) console.log(iterator.next())
yield關鍵字只可在生成器內部使用,在其它地方使用會導致程序拋出語法錯誤
所以下面例子是有錯誤的
function* createIterator(items) { items.forEach(function (element) { yield itemsm + 1 }); } let iterator = createIterator([1, 2, 3]) console.log(iterator.next())
可迭代對象具有Symbol.iterator屬性,可通過Symbol.iterator指定的函數來作用于一個附屬對象的迭代器
由于生成器默認會有Symbol.iterator屬性賦值,因此所有通過生成器創建的迭代器都是可迭代對象
如果將for of 語句用于不可迭代對象、null或undefined將會導致程序拋出錯誤
let values = [1, 2, 3] let iterator = values[Symbol.iterator]() console.log(iterator.next())
檢測一個對象是否為可迭代對象
function isIterable(obj) { return typeof obj[Symbol.iterator] === "function" } console.log(isIterable([1, 2, 3]))創建可迭代對象
let collection = { items: [], *[Symbol.iterator]() { for (let item of this.items) { yield item } } } collection.items.push(1) collection.items.push(2) collection.items.push(3) for (let x of collection) { console.log(x) }內建迭代器
數組、Map集合、Set集合,這3個對象都內建了以下三種迭代器
keys
values
entries
每個集合對象都有一個默認的迭代器,在for of循環中,如果沒有顯式指定則使用默認迭代器
數組和set集合默認的迭代器是values
Map集合默認的迭代器是entries
let tracking = new Set([123, 456, 789]) //與調用tracking.values方法相同 for (let num of tracking) { console.log(num) }
不僅僅字符串可以用for of來迭代,NodeList也可以
let divs = document.getElementsByTagName("div") for (let div of divs) { console.log(div) }
展開運算符可作用于任何可迭代對象
let one = [1, 2, 3] let two = [100, 101, 102] let all = [0, ...one, ...two] console.log(all)//[0, 1, 2, 3, 100, 101, 102]高級迭代器
給迭代器傳遞參數
function* createIterator() { let first = yield 1 let second = yield first + 2//4+2 yield second + 3//5+3 } let iterator = createIterator() console.log(iterator.next()) console.log(iterator.next(4)) console.log(iterator.next(5)) console.log(iterator.next())
在迭代器中拋出錯誤
function* createIterator() { let first = yield 1 let second try { second = yield first + 2 } catch (error) { second = 6 } yield second + 3 } let iterator = createIterator() console.log(iterator.next())//{value: 1, done: false} console.log(iterator.next(4)) //{value: 6, done: false} console.log(iterator.throw(new Error("Boom")))//{value: 9, done: false} console.log(iterator.next())//{value: undefined, done: true}
生成器返回語句
function* createIterator() { yield 1 return; yield 2 yield 3 } let iterator = createIterator() console.log(iterator.next())//{value: 1, done: false} console.log(iterator.next())//{value: undefined, done: true}
function* createIterator() { yield 1 return 42 } let iterator = createIterator() console.log(iterator.next())//{value: 1, done: false} console.log(iterator.next())//{value: 42, done: true} console.log(iterator.next())//{value: undefined, done: true}
有一點需要注意的是展開運算符與for of循環語句會直接忽略掉通過return語句指定的任何返回值,只要done一變為true就立即停止讀取其它的值
異步任務執行器向任務執行器傳遞參數
function run(taskDef) { let task = taskDef() let result = task.next() function step() { if (!result.done) { result = task.next(result.value) step() } } step() } run(function* () { let value = yield 1 console.log(value) value = yield value + 3 console.log(value) })
異步任務執行器
function run(taskDef) { //創建一個無使用限制的迭代器 let task = taskDef() // 開始執行任務 let result = task.next() // 循環調用next函數 function step() { // 如果任務未完成則繼續執行 if (!result.done) { if (typeof result.value === "function") { result.value(function (err, data) { if (err) { result = task.throw(err) return; } result = task.next(data) step() }) } else { result = task.next(result.value) step() } } } // 開始執行迭代任務 step() } let fs = require("fs") function readFile(fileName) { return function (callback) { fs.readFile(fileName, callback) } } run(function* () { let contents = yield readFile("config.json") doSomethingWith(contents) console.log("hello") })
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/112502.html
摘要:什么是迭代器中創建迭代器如下所示什么是生成器生成器是一種返回迭代器的函數每當招待完一條語句后函數就會自動停止執行關鍵字可返回任何值或表達式關鍵字只可在生成器內部使用,在其它地方使用會導致程序拋出語法錯誤所以下面例子是有錯誤的可迭代對象具有屬 什么是迭代器 ES5中創建迭代器如下所示: function createIterator(items) { var i = 0 retu...
摘要:通過生成器創建的迭代器也是可迭代對象,因為生成器默認會為屬性賦值。我們可以用來訪問對象的默認迭代器,例如對于一個數組獲得了數組這個可迭代對象的默認迭代器,并操作它遍歷了數組中的元素。 ES6 新的數組方法、集合、for-of 循環、展開運算符(...)甚至異步編程都依賴于迭代器(Iterator )實現。本文會詳解 ES6 的迭代器與生成器,并進一步挖掘可迭代對象的內部原理與使用方法 ...
摘要:的類使用熟悉的關鍵字指定類繼承的函數,并且可以通過方法訪問父類的構造函數。例如繼承一個的類繼承了,術語上稱為基類,為派生類。例如注意到上例中,不僅是派生類的實例,也是派生類的實例,內建對象繼承的實用之處是改變返回對象的類型。 和其它面向對象編程語言一樣,ES6 正式定義了 class 類以及 extend 繼承語法糖,并且支持靜態、派生、抽象、迭代、單例等,而且根據 ES6 的新特性衍...
面試舊敵之紅黑樹(直白介紹深入理解) - Android - 掘金 讀完本文你將了解到: 什么是紅黑樹 黑色高度 紅黑樹的 5 個特性 紅黑樹的左旋右旋 指定節點 x 的左旋 右圖轉成左圖 指定節點 y 的右旋左圖轉成右圖 紅黑樹的平衡插入 二叉查找樹的插入 插入后調整紅黑樹結構 調整思想 插入染紅后... java 多線程同步以及線程間通信詳解 & 消費者生產者模式 & 死鎖 & Thread...
閱讀 1976·2021-11-24 09:38
閱讀 3338·2021-11-22 12:07
閱讀 1903·2021-09-22 16:03
閱讀 1955·2021-09-02 15:41
閱讀 2617·2021-07-24 23:28
閱讀 2211·2019-08-29 13:17
閱讀 1547·2019-08-29 12:25
閱讀 2666·2019-08-29 11:10