一孝冒、Object(四種集合):無序
- 遍歷自身及原型啤挎?
for in
:遍歷自身及繼承
的可枚舉屬性
。但es6規(guī)定票罐,所有 Class 的原型的方法都是不可枚舉的- 總結(jié):不適合遍歷。(會遍歷原型)
- 遍歷自身所有泞边、symbol屬性该押、可枚舉:
三種集合
- 遍歷
自身所有屬性(除symbol)
:Object.getOwnPropertyNames(obj)- 遍歷
自身symbol屬性
:getOwnPropertySymbols(obj)- 遍歷
自身可枚舉屬性
:assign、entries繁堡、keys沈善、values
遍歷順序
- Chrome 瀏覽器:
先數(shù)字,其它的按創(chuàng)建順序排序
- 其它瀏覽器:按照創(chuàng)建順序排序
- 總結(jié):
對象的遍歷是無序的
二椭蹄、Array(一種原始闻牡,五種Es5迭代):
- 原始:
for(let i=0;i<length;i++){}
- Es5迭代(語義化,簡潔)
every
測試所有绳矩,返回布爾值some
測試部分罩润,返回布爾值filter
過濾,返回新數(shù)組map
映射翼馆,返回新數(shù)組forEach
迭代割以,修改自身
Es5迭代機制
:內(nèi)部完成for迭代金度,用戶傳處理函數(shù)即可
因此:我們在處理函數(shù),使用break或者return严沥,是沒辦法終止迭代的 2录!消玄!
- 但我們可以利用some跟伏、every的機制來終止(個人不建議,語義會歧義)
說明
:雖然Array繼承于Object翩瓜,但Object的迭代不適合Array
三受扳、ES6新增的迭代器Iterator(提供統(tǒng)一接口
)
一、
Iterator迭代器
:
- 類似es5的迭代兔跌。兩層函數(shù)勘高。
- 由之前的自動迭代=>函數(shù)調(diào)用迭代(
可控
)const obj = { randomName() { let index=0; return { next(){ index+=1; if(index<3) return {value: 0,done: false} else return {value:1,done:true} } }; } }; const obj2=obj.randomName();//啟動迭代器,下面可控迭代 console.log(obj2.next());//{ value: 0, done: false } console.log(obj2.next());//{ value: 0, done: false } console.log(obj2.next());//{ value: 1, done: true }
二坟桅、
迭代工具for of
:是Iterator迭代器的迭代工具機制(對比手動使用Iterator华望,自動化執(zhí)行了以下
4
個步驟)
- 默認會查找
[Symbol.iterator]
的函數(shù),作為迭代器- 啟動迭代器
- 執(zhí)行迭代
- 處理返回來的結(jié)果
- done作為是否繼續(xù)迭代的條件(done:true時桦卒,終止迭代立美,及不再執(zhí)行for of主體)
- value作為結(jié)果
const obj = { [Symbol.iterator]() { let index=0; return { next(){ index+=1; if(index<3) return {value: 0,done: false} else return {value:1,done:true} } }; } }; for(item of obj){ console.log(item);//0 0 即value作為結(jié)果。done:true時方灾,終止迭代建蹄,及不再執(zhí)行for of主體 } console.log("手動調(diào)用",obj[Symbol.iterator]().next());//手動調(diào)用 { value: 0, done: false }
- 三、
預(yù)設(shè)了[Symbol.iterator]迭代器的對象有:
- Array
- Map
- Set
- String
- TypedArray
- 函數(shù)的 arguments 對象
- NodeList 對象
總結(jié)
:即對數(shù)組裕偿、類數(shù)組洞慎、String預(yù)設(shè)了迭代器
- 四、
會默認調(diào)用[Symbol.iterator]迭代器的場景有:
- 解構(gòu)賦值:
先對右邊裝包
嘿棘,再迭代器
劲腿,再匹配給左邊
- 拓展運算符:
先迭代器
,再轉(zhuǎn)化
為需要的格式:如[...obj]即轉(zhuǎn)化為數(shù)組鸟妙,{...obj}即轉(zhuǎn)化為對象
補充:
object默認是沒有提供迭代器的焦人,但解構(gòu)賦值或者拓展的時候,會先轉(zhuǎn)化為Map再處理
- generator生成器
- 其它;Array.from()重父,Promise.all()花椭,Promise.race()等
四、 generator生成器
和迭代器的關(guān)系
- 迭代器是
迭代屬性
的- 生產(chǎn)者房午,是
生成迭代器
的一個函數(shù):迭代的是被field分割的代碼塊