1. 程式人生 > >Iterator(叠代器) 和generator

Iterator(叠代器) 和generator

Oz http con code lan bubuko efi ati key

數組是可叠代的

var a = [];

console.dir(a);

技術分享圖片

發現這裏有一個Symbol.iterator ,說明它是可叠代的。

object 是不可以叠代的

var a = {}

console.dir(a);

技術分享圖片

發現這裏沒有iterator

set

weakset

map

weakmap

這四種數據結構都是iterable

騷操作:

通過iterator.next()

技術分享圖片

多來幾次:

技術分享圖片

再來一次,到undefined了就結束了

技術分享圖片

再次理解symbol:

https://developer.mozilla.org/zh-CN/docs/Glossary/Symbol

根據MDN官網描述,

數據類型 “symbol” 是一種原始數據類型,該類型的性質在於這個類型的值可以用來創建匿名的對象屬性(註:是對象。也就是之前都認為object,js中object的屬性一般只能是string類型,其實這裏還能使Symbol類型)。該數據類型通常被用作一個對象屬性的鍵值,當這個屬性是用於類或對象類型的內部使用的時候。

是不是懂了一些...

Symbol(‘12‘) !== Symbol(‘12‘) //true

var obj = {Symbol(‘a‘):123}

技術分享圖片

再繼續看MDN的文檔:

技術分享圖片

Symbol可以用來實現匿名屬性。




Object.entries:


Object.entries()方法返回一個給定對象自身可枚舉屬性的鍵值對數組(就是一個二維數組,這個二維數組對應著key-value值),其排列與使用 for.key..in .. 循環遍歷該對象時返回的順序一致(區別在於 for-in 循環也枚舉原型鏈中的屬性)。

for..in有一個缺陷就是順序是依賴於執行環境的,不一定按數組的索引順序,如果對於很重要的數組,要用foreach來循環(來自MDN原話)。

經過查詢資料,for..key..in..的順序是這樣的

技術分享圖片

所謂的這個順序,其實也就是在瀏覽器裏打印這個對象時候你看的那個key的順序。

技術分享圖片

for .. value..of .. 只能用在iterable對象上,所以for..of是不能給object來使用的,Object.entries返回的是一個iterable的鍵值對數組。

可以這樣用:

技術分享圖片

Iterator(叠代器) 和generator