(1)Iterator
?他是一個(gè)接口,為各種不同的數(shù)據(jù)結(jié)構(gòu)提供統(tǒng)一訪問(wèn)機(jī)制顷蟀,任何數(shù)據(jù)結(jié)構(gòu)只要部署Iterator接口搜囱,就可以完成遍歷操作
?遍歷過(guò)程
- 創(chuàng)建一個(gè)指針對(duì)象,指向當(dāng)前結(jié)構(gòu)的起始位置
- 第一次調(diào)用指針對(duì)象的next方法趾痘,可以將指針指向數(shù)據(jù)結(jié)構(gòu)的第一個(gè)成員
- 第二次調(diào)用指向第二個(gè)成員
- 不斷調(diào)用next方法,直到指向他數(shù)據(jù)結(jié)構(gòu)的結(jié)束位置
- 每一次調(diào)用next方法蔓钟,都會(huì)返回?cái)?shù)據(jù)結(jié)構(gòu)的當(dāng)前成員信息永票。就是返回包含value和done兩個(gè)屬性的對(duì)象,其中滥沫,value是當(dāng)前成員的值侣集,done是一個(gè)布爾值,表示遍歷是否結(jié)束
?原生具備Iterator接口的結(jié)構(gòu)
- Array
- Map
- Set
- String
- TypedArray
- 函數(shù)的arguments對(duì)象
- NodeList對(duì)象
(2)for...of...
?一個(gè)數(shù)據(jù)結(jié)構(gòu)只要部署了Symbol.iterator屬性兰绣,就會(huì)被視為具有iterator接口世分,就可以用for...of循環(huán)遍歷他的成員
?對(duì)于普通的對(duì)象使用for...of遍歷,會(huì)報(bào)錯(cuò)
解決方法
使用Object.keys方法將對(duì)象的鍵名生成一個(gè)數(shù)組缀辩,然后遍歷這個(gè)數(shù)組臭埋。
優(yōu)點(diǎn)
- 遍歷數(shù)組時(shí),相比于其他方法更簡(jiǎn)潔
- 與forEach方法相比臀玄,他可以與break瓢阴,continue,return結(jié)合使用
for...in...
?for..in循環(huán)會(huì)遍歷原型鏈上可以枚舉的屬性健无,包括原型鏈上的方法
? for...in...的缺點(diǎn)
- for...in循環(huán)不僅遍歷數(shù)字鍵名,還會(huì)遍歷手動(dòng)添加的其他鍵睬涧,甚至包括原型鏈上的鍵募胃。
- 某些情況下,for...in循環(huán)會(huì)以任意順序遍歷鍵名畦浓。
- 數(shù)組的鍵名是數(shù)字痹束,但是for...in循環(huán)是以字符串作為鍵名“0”、“1”讶请、“2”
- 不適合遍歷數(shù)組
- for...in 循環(huán)只遍歷可枚舉屬性
(3)Object.definedPeoperty()
?可以用來(lái)新增對(duì)象的一個(gè)屬性祷嘶,也可以用來(lái)修改一個(gè)對(duì)象的屬性,返回這個(gè)對(duì)象
?Object.defineProperty(obj, prop, descriptor)
descriptor
- configurable:當(dāng)且僅當(dāng)該屬性的 configurable 鍵值為 true 時(shí)夺溢,該屬性的描述符才能夠被改變论巍,同時(shí)該屬性也能從對(duì)應(yīng)的對(duì)象上被刪除。默認(rèn)為false
- enumerable:當(dāng)且僅當(dāng)該屬性的 enumerable 鍵值為 true 時(shí)风响,該屬性才會(huì)出現(xiàn)在對(duì)象的枚舉屬性中嘉汰。默認(rèn)為false
- value: 該屬性對(duì)應(yīng)的值∽辞冢可以是任何有效的 JavaScript 值(數(shù)值鞋怀,對(duì)象,函數(shù)等)持搜。默認(rèn)為undefined
- writable: 當(dāng)且僅當(dāng)該屬性的 writable 鍵值為 true 時(shí)密似,屬性的值,也就是上面的 value葫盼,才能被賦值運(yùn)算符改變残腌。默認(rèn)為false
Object.getOwnPropertyDescriptor(obj, 'name')?//查看一個(gè)屬性的描述
(4)Object.getOwnPropertyNames()
?方法返回一個(gè)數(shù)組,成員是參數(shù)對(duì)象自身的全部屬性的屬性名贫导,不管該屬性是否可遍歷抛猫。