Iterator(叠代器) 和generator
數組是可叠代的
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