摘要:本質(zhì)上,遍歷器是一種線性處理,對(duì)于任何非線性的數(shù)據(jù)結(jié)構(gòu),部署遍歷器接口,就等于部署一種線性轉(zhuǎn)換。不過,嚴(yán)格地說,對(duì)象部署遍歷器接口并不是很必要,因?yàn)檫@時(shí)對(duì)象實(shí)際上被當(dāng)作結(jié)構(gòu)使用,沒有結(jié)構(gòu),而原生提供了。
經(jīng)??吹?b>迭代這個(gè)詞,那么歸總下吧~
什么是可迭代對(duì)象:
一個(gè)對(duì)象(或它的原型鏈上的某個(gè)對(duì)象)必須有一個(gè)名字是 Symbol.iterator的屬性
String Array Map Set 是內(nèi)置可迭代的對(duì)象,因?yàn)樗鼈兊脑蛯?duì)象都有一個(gè) @@iterator 方法
Object 不是
接收可迭代對(duì)象的API
數(shù)組的遍歷 會(huì)調(diào)用迭代器接口,所以使用到數(shù)組作為參數(shù)的場(chǎng)合,都使用了遍歷器
Map([iterable]) WeakMap([iterable])
Set([iterable]) WeakSet([iterable])
Promise.all([iterable]) Promise.race([iterable])
Array.from([iterable])
for...in for...of
getOwnPropertyNames
不能用 for...in 來迭代 Set, 因?yàn)?Set 中的元素沒有 key, 使用 for...of 遍歷
迭代器 與 迭代對(duì)象的差別:
迭代器是一種特殊的對(duì)象,每一個(gè)迭代器都有一個(gè) next(),該方法返回一個(gè)對(duì)象,包括 value 和done 屬性
// 實(shí)現(xiàn)一個(gè)返回迭代器對(duì)象的函數(shù) function createIterator(items){ var i = 0; return { next () { var done = (i >= items.length); var value = !done ? items[i++] : "undefined" return { done, value } } } } const a = createIterator([1, 2, 3]); //該方法返回的最終是一個(gè)對(duì)象,包含value、done屬性。 console.log(a.next()); //{value: 1, done: false} console.log(a.next()); //{value: 2, done: false} console.log(a.next()); //{value: 3, done: false} console.log(a.next()); //{value: undefined, done: true}
可迭代 和 可枚舉的差別
舉例說明不可迭代
let arrayLike = { 0: "aa", 1: "bb", 2: "cc", length: 3 } for (var item of arrayLike) { console.log(item) // TypeError: arrayLike is not iterable } let obj = { a: "monday", b: "sunday" } for (var item of obj) { console.log(item) // TypeError: obj is not iterable }
上面這個(gè)例子是想遍歷一個(gè) 類數(shù)組對(duì)象 和 一個(gè) 對(duì)象, 因?yàn)樗豢傻?,所以?for...of不能遍歷
報(bào)錯(cuò)TypeError: arrayLike is not iterable
但是使用 for...in 又可以遍歷了
for (var item in arrayLike) { console.log(item) // 0 1 2 length } for (var item in obj) { console.log(item) // a b }
這是為什么呢?
附上阮一峰老師的解釋
對(duì)象(Object)之所以沒有默認(rèn)部署Iterator接口,是因?yàn)閷?duì)象的哪個(gè)屬性先遍歷,哪個(gè)屬性后遍歷是不確定的,需要開發(fā)者手動(dòng)指定。本質(zhì)上,遍歷器是一種線性處理,對(duì)于任何非線性的數(shù)據(jù)結(jié)構(gòu),部署遍歷器接口,就等于部署一種線性轉(zhuǎn)換。不過,嚴(yán)格地說,對(duì)象部署遍歷器接口并不是很必要,因?yàn)檫@時(shí)對(duì)象實(shí)際上被當(dāng)作Map結(jié)構(gòu)使用,ES5沒有Map結(jié)構(gòu),而ES6原生提供了。
以及知乎上的解答為什么for...of對(duì)象不可迭代---賀師俊回調(diào) , 寫的很棒,一下就清晰了~
// 幾種迭代方式 for (const k of Object.keys(obj)) ... // enumerable own keys for (const [k, v] of Object.entries(obj)) ... // enumerable own [key, value]s for (const k of Object.getOwnPropertyNames(obj)) // all own keys for (const s of Object.getOwnPropertySymbols(obj)) // all own symbols for (const k of Reflect.ownKeys(obj)) // all own keys (include symbols)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/99322.html
摘要:為什么不更規(guī)范點(diǎn),令生成的是迭代器呢關(guān)于這個(gè)問題,我沒找到官方解釋,以下純屬個(gè)人觀點(diǎn)。類型是什么以上是我對(duì)為什么不產(chǎn)生迭代器的一種解答。小結(jié)回顧全文,我得到了兩個(gè)偏冷門的結(jié)論是可迭代對(duì)象而不是迭代器對(duì)象是不可變的等差序列。 showImg(https://segmentfault.com/img/bVbmKjd?w=6000&h=4000); 迭代器是 23 種設(shè)計(jì)模式中最常用的一種(...
摘要:示例代碼如下此示例中可以看出,當(dāng)?shù)鹘K止時(shí),通過拋出異常告知迭代器已耗盡。但如果迭代器所指向的數(shù)據(jù)結(jié)構(gòu)在其存在時(shí)發(fā)生了插入或刪除操作,則迭代器將可能失效。與的情形類似,對(duì)進(jìn)行任何插入操作也將損壞迭代器。 花下貓語:之前說過,我對(duì)于編程語言跟其它學(xué)科的融合非常感興趣,但我還說漏了一點(diǎn),就是我對(duì)于 Python 跟其它編程語言的對(duì)比學(xué)習(xí),也很感興趣。所以,我一直希望能聚集一些有其它語言基...
摘要:簡(jiǎn)評(píng)迭代器是惰性可迭代對(duì)象,函數(shù)在中是一個(gè)惰性的可迭代對(duì)象,那么是不是迭代器呢為什么。如果你不能將某些東西傳遞給函數(shù),那么它不是一個(gè)迭代器。的對(duì)象不是迭代器。 簡(jiǎn)評(píng):迭代器(iterator)是惰性可迭代對(duì)象(lazy iterable),range 函數(shù)在 Python 3 中是一個(gè)惰性的可迭代對(duì)象,那么 range 是不是迭代器呢?為什么。 TLNR:Python 3 中的 ran...
閱讀 2650·2023-04-26 02:47
閱讀 3066·2023-04-26 00:42
閱讀 937·2021-10-12 10:12
閱讀 1459·2021-09-29 09:35
閱讀 1768·2021-09-26 09:55
閱讀 543·2019-08-30 14:00
閱讀 1595·2019-08-29 12:57
閱讀 2417·2019-08-28 18:00