摘要:遍歷器之后數據結構除了數組和對象,又添加了和。遍歷器是一種接口規格,任何數據結構只要部署這個接口,就可以完成遍歷操作提供了一個指針,通過指針的指向進行遍歷操作它提供了一個指針,默認指向當前數據結構的起始位置。
遍歷器iterator
ES6之后數據結構除了數組和對象,又添加了Map和Set。遍歷器是一種接口規格,任何數據結構只要部署這個接口,就可以完成遍歷操作
提供了一個指針,通過指針的指向進行遍歷操作
它提供了一個指針,默認指向當前數據結構的起始位置。也就是說,遍歷器返回一個內部指針,
第一次調用next方法,將指針指向第一個成員,第二次調用next方法,指針指向第二個成員
下面是一個模擬遍歷器指針的例子
function makeIterator(array) { let nextIndex = 0 return { next: function() { return (nextIndex < array.length) ? {value: array[nextIndex++], done: false} : {value: undefined, done: true} } } } let it = makeIterator(["a", "b"]) it.next() // {value: "a", done: false} it.next() // {value: "b", done: false} it.next() // {value: "undefined", done: false}
遍歷器是一個對象,具有next方法,調用next方法,就可以遍歷事先給定的數據結構
Iterator接口的目的,就是為所有的數據結構提供一種統一的訪問機制,就是for of循環
默認的Iterator接口部署在數據結構的Symbol.iterator屬性,或者說數據結構具有該屬性就可以認為是可遍歷的
有三類數據結構原生具備了Iterator接口:數組、類數組對象、Set和Map,可以直接使用for of方法
而對象需要在Symbol.iterator的屬性上部署遍歷器方法,才可以for of
下面是通過遍歷器實現指針結構的例子
// 在原型鏈上部署System.iterator方法,調用該方法,會返回遍歷器對象iteator。調用該對象的next方法,在返回一個值的同時,自動將內部指針指向下一個實例 function test (value) { this.value = value this.next = null } test.prototype[Symbol.iterator] = function () { let iterator = { next: next // iterator.next是一個function } let current = this function next () { if (current) { let value = current.value let done = current == null current = current.next return { value: value, done: done } } else { return { done: true } } } return iterator } let one = new test(1), two = new test(2), three = new test(3); one.next = two two.next = three for (let i of one) { console.log(i) // 1 2 3 }
還有一種簡單操作,對于類數組對象
NodeList.prototypoe[Symbol.iterator] = Array.prototype[Symbol.iterator]
默認調用iterator接口的場合
解構賦值
擴展運算符
yield*
Arrat.from()
Map和Set
部署Symbol.iterator最簡單實現是結合Generator
let myIterable = [] myiIterable[Symbol.iterator] = function* () { yield 1 yield 2 yield 3 } [...myIterable] // [1, 2, 3] // 或者 let obj = { * [Symbol.iterator]() { yield "hello" yield "world" } } for (let x of obj) { console.log(x) // hello world }
而對于對象來說,是不能直接使用for of的,需要使用yield包裝以下
// 以下情況報錯 let e = { a: 1, b: "bbb" } for (let [key, value] of e) { console.log() // error,e is not iterable } // 使用yield包裝一下 function* (obj) { for (let key of Object.keys(obj)) { yield [key, obj[key]] } } for (let [key, value] of entries(obj)) { console.log(key, "->", value) } // a -> 1 // b -> 2 // c -> 3
JavaScript 原有的 for...in 循環,只能獲得對象的鍵名,不能直接獲取鍵值。ES6 提供 for...of 循環,允許遍歷獲得鍵值。
var arr = ["a", "b", "c", "d"]; for (a in arr) { console.log(a); // 0 1 2 3 } for (a of arr) { console.log(a); // a b c d }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88446.html
摘要:我關注的賀老賀師俊前輩最近發表個這樣一條微博雖然這條微博沒有引起大范圍的關注和討論,但是作為新人,我陷入了思考。通過賀老的微博,對一個問題進行探究,最終找到核心成員的一文,進行參考并翻譯。 我關注的賀老—賀師俊前輩@johnhax 最近發表個這樣一條微博: showImg(https://segmentfault.com/img/remote/1460000010452807); 雖然...
摘要:文章內容分兩部分前半部分為迭代器模式概念后半部分為中迭代器上半部分開始迭代器模式提供一種方法順序訪問一個聚合對象中的各個元素,而又不需要暴露該對象的內部表示。下半部分開始的迭代器迭代器等同于遍歷器。執行該函數,會返回一個遍歷器對象。 showImg(https://segmentfault.com/img/bVbuyaZ?w=800&h=600); 文章內容分兩部分: 前半部分為 迭...
摘要:示例代碼如下此示例中可以看出,當迭代器終止時,通過拋出異常告知迭代器已耗盡。但如果迭代器所指向的數據結構在其存在時發生了插入或刪除操作,則迭代器將可能失效。與的情形類似,對進行任何插入操作也將損壞迭代器。 花下貓語:之前說過,我對于編程語言跟其它學科的融合非常感興趣,但我還說漏了一點,就是我對于 Python 跟其它編程語言的對比學習,也很感興趣。所以,我一直希望能聚集一些有其它語言基...
摘要:接口也是集合中的一員,但它與接口有所不同,接口與接口主要用于存儲元素,而主要用于迭代訪問即遍歷中的元素,因此對象也被稱為迭代器。迭代器的實現原理我們在之前案例已經完成了遍歷集合的整個過程。 【Collection、泛型】 主要內容 Collection集合 迭代器 增強for 泛型 教學目標 [ ] 能夠說出集合與數組的區別 [ ] 說出Collection集合的常用功能 [ ]...
閱讀 1294·2021-10-08 10:05
閱讀 4107·2021-09-22 15:54
閱讀 3105·2021-08-27 16:18
閱讀 3107·2019-08-30 15:55
閱讀 1436·2019-08-29 12:54
閱讀 2748·2019-08-26 11:42
閱讀 543·2019-08-26 11:39
閱讀 2129·2019-08-26 10:11