JS 5種遍歷對象的方式
幾天前一個小伙伴問我 Object.getOwnPropertyNames() 是干什么用的
平時還真沒有使用到這個方法,一時不知如何回答
從方法名稱來分析,應(yīng)該是返回的是對象自身屬性名組成的數(shù)組
那和 Object.keys() 方法不就一樣了嗎
感覺事情并不這么簡單,于是我仔細(xì)看了一下這幾種遍歷對象的方法的區(qū)別
for in
for in 循環(huán)是最基礎(chǔ)的遍歷對象的方式,它還會得到對象原型鏈上的屬性
// 創(chuàng)建一個對象并指定其原型,bar 為原型上的屬性const obj = Object.create({ bar: ’bar’})// foo 為對象自身的屬性obj.foo = ’foo’for (let key in obj) { console.log(obj[key]) // foo, bar}
可以看到對象原型上的屬性也被循環(huán)出來了
在這種情況下可以使用對象的 hasOwnProperty() 方法過濾掉原型鏈上的屬性
for (let key in obj) { if (obj.hasOwnProperty(key)) { console.log(obj[key]) // foo }}
這時候原型上的 bar 屬性就被過濾掉了
Object.keys
Object.keys() 是 ES5 新增的一個對象方法,該方法返回對象自身屬性名組成的數(shù)組,它會自動過濾掉原型鏈上的屬性,然后可以通過數(shù)組的 forEach() 方法來遍歷
Object.keys(obj).forEach((key) => { console.log(obj[key]) // foo})
另外還有 Object.values() 方法和 Object.entries() 方法,這兩方法的作用范圍和 Object.keys() 方法類似,因此不再說明
for in 循環(huán)和 Object.keys() 方法都不會返回對象的不可枚舉屬性
如果需要遍歷不可枚舉的屬性,就要用到前面提到的 Object.getOwnPropertyNames() 方法了
Object.getOwnPropertyNames
Object.getOwnPropertyNames() 也是 ES5 新增的一個對象方法,該方法返回對象自身屬性名組成的數(shù)組,包括不可枚舉的屬性,也可以通過數(shù)組的 forEach 方法來遍歷
// 創(chuàng)建一個對象并指定其原型,bar 為原型上的屬性// baz 為對象自身的屬性并且不可枚舉const obj = Object.create({ bar: ’bar’}, { baz: { value: ’baz’, enumerable: false }})obj.foo = ’foo’// 不包括不可枚舉的 baz 屬性O(shè)bject.keys(obj).forEach((key) => { console.log(obj[key]) // foo})// 包括不可枚舉的 baz 屬性O(shè)bject.getOwnPropertyNames(obj).forEach((key) => { console.log(obj[key]) // baz, foo})
ES2015 新增了 Symbol 數(shù)據(jù)類型,該類型可以作為對象的鍵,針對該類型 ES2015 同樣新增Object.getOwnPropertySymbols() 方法
Object.getOwnPropertySymbols
Object.getOwnPropertySymbols() 方法返回對象自身的 Symbol 屬性組成的數(shù)組,不包括字符串屬性
Object.getOwnPropertySymbols(obj).forEach((key) => { console.log(obj[key])})
什么都沒有,因為該對象還沒有 Symbol 屬性
// 給對象添加一個不可枚舉的 Symbol 屬性O(shè)bject.defineProperties(obj, { [Symbol(’baz’)]: { value: ’Symbol baz’, enumerable: false }})// 給對象添加一個可枚舉的 Symbol 屬性obj[Symbol(’foo’)] = ’Symbol foo’Object.getOwnPropertySymbols(obj).forEach((key) => { console.log(obj[key]) // Symbol baz, Symbol foo})
Reflect.ownKeys
Reflect.ownKeys() 方法是 ES2015 新增的靜態(tài)方法,該方法返回對象自身所有屬性名組成的數(shù)組,包括不可枚舉的屬性和 Symbol 屬性
Reflect.ownKeys(obj).forEach((key) => { console.log(obj[key]) // baz, foo, Symbol baz, Symbol foo})
對比
方式 基本屬性 原型鏈 不可枚舉 Symbol for in 是 是 否 否 Object.keys() 是 否 否 否 Object.getOwnPropertyNames() 是 否 是 否 Object.getOwnPropertySymbols() 否 否 是 是 Reflect.ownKeys() 是 否 是 是
結(jié)論
這其中只有 for in 循環(huán)會得到對象原型鏈上的屬性,其它方法都只適用于對象自身的屬性
ES 語言后續(xù)添加的新特性不會對以前的代碼產(chǎn)生副作用,比如在 ES2015 之前就存在的 for in 循環(huán),Object.keys() 和 Object.getOwnPropertyNames() 是肯定不會返回 Symbol 屬性的
以上就是JS 5種遍歷對象的方式的詳細(xì)內(nèi)容,更多關(guān)于JS 遍歷對象的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. CSS自定義滾動條樣式案例詳解2. 通過工廠模式返回Spring Bean方法解析3. JSP實(shí)現(xiàn)客戶信息管理系統(tǒng)4. PHP 面向?qū)ο蟪绦蛟O(shè)計之類屬性與類常量實(shí)現(xiàn)方法分析5. Java Spring WEB應(yīng)用實(shí)例化如何實(shí)現(xiàn)6. python 批量下載bilibili視頻的gui程序7. Intellij IDEA連接Navicat數(shù)據(jù)庫的方法8. 關(guān)于Mysql-connector-java驅(qū)動版本問題總結(jié)9. 使用css實(shí)現(xiàn)全兼容tooltip提示框10. python numpy庫np.percentile用法說明
