国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

JS 5種遍歷對(duì)象的方式

瀏覽:69日期:2024-05-03 17:45:49

幾天前一個(gè)小伙伴問(wèn)我 Object.getOwnPropertyNames() 是干什么用的

平時(shí)還真沒(méi)有使用到這個(gè)方法,一時(shí)不知如何回答

從方法名稱來(lái)分析,應(yīng)該是返回的是對(duì)象自身屬性名組成的數(shù)組

那和 Object.keys() 方法不就一樣了嗎

感覺(jué)事情并不這么簡(jiǎn)單,于是我仔細(xì)看了一下這幾種遍歷對(duì)象的方法的區(qū)別

for in

for in 循環(huán)是最基礎(chǔ)的遍歷對(duì)象的方式,它還會(huì)得到對(duì)象原型鏈上的屬性

// 創(chuàng)建一個(gè)對(duì)象并指定其原型,bar 為原型上的屬性const obj = Object.create({ bar: ’bar’})// foo 為對(duì)象自身的屬性obj.foo = ’foo’for (let key in obj) { console.log(obj[key]) // foo, bar}

可以看到對(duì)象原型上的屬性也被循環(huán)出來(lái)了

在這種情況下可以使用對(duì)象的 hasOwnProperty() 方法過(guò)濾掉原型鏈上的屬性

for (let key in obj) { if (obj.hasOwnProperty(key)) { console.log(obj[key]) // foo }}

這時(shí)候原型上的 bar 屬性就被過(guò)濾掉了

Object.keys

Object.keys() 是 ES5 新增的一個(gè)對(duì)象方法,該方法返回對(duì)象自身屬性名組成的數(shù)組,它會(huì)自動(dòng)過(guò)濾掉原型鏈上的屬性,然后可以通過(guò)數(shù)組的 forEach() 方法來(lái)遍歷

Object.keys(obj).forEach((key) => { console.log(obj[key]) // foo})

另外還有 Object.values() 方法和 Object.entries() 方法,這兩方法的作用范圍和 Object.keys() 方法類似,因此不再說(shuō)明

for in 循環(huán)和 Object.keys() 方法都不會(huì)返回對(duì)象的不可枚舉屬性

如果需要遍歷不可枚舉的屬性,就要用到前面提到的 Object.getOwnPropertyNames() 方法了

Object.getOwnPropertyNames

Object.getOwnPropertyNames() 也是 ES5 新增的一個(gè)對(duì)象方法,該方法返回對(duì)象自身屬性名組成的數(shù)組,包括不可枚舉的屬性,也可以通過(guò)數(shù)組的 forEach 方法來(lái)遍歷

// 創(chuàng)建一個(gè)對(duì)象并指定其原型,bar 為原型上的屬性// baz 為對(duì)象自身的屬性并且不可枚舉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ù)類型,該類型可以作為對(duì)象的鍵,針對(duì)該類型 ES2015 同樣新增Object.getOwnPropertySymbols() 方法

Object.getOwnPropertySymbols

Object.getOwnPropertySymbols() 方法返回對(duì)象自身的 Symbol 屬性組成的數(shù)組,不包括字符串屬性

Object.getOwnPropertySymbols(obj).forEach((key) => { console.log(obj[key])})

什么都沒(méi)有,因?yàn)樵搶?duì)象還沒(méi)有 Symbol 屬性

// 給對(duì)象添加一個(gè)不可枚舉的 Symbol 屬性O(shè)bject.defineProperties(obj, { [Symbol(’baz’)]: { value: ’Symbol baz’, enumerable: false }})// 給對(duì)象添加一個(gè)可枚舉的 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)方法,該方法返回對(duì)象自身所有屬性名組成的數(shù)組,包括不可枚舉的屬性和 Symbol 屬性

Reflect.ownKeys(obj).forEach((key) => { console.log(obj[key]) // baz, foo, Symbol baz, Symbol foo})

對(duì)比

方式 基本屬性 原型鏈 不可枚舉 Symbol for in 是 是 否 否 Object.keys() 是 否 否 否 Object.getOwnPropertyNames() 是 否 是 否 Object.getOwnPropertySymbols() 否 否 是 是 Reflect.ownKeys() 是 否 是 是

結(jié)論

這其中只有 for in 循環(huán)會(huì)得到對(duì)象原型鏈上的屬性,其它方法都只適用于對(duì)象自身的屬性

ES 語(yǔ)言后續(xù)添加的新特性不會(huì)對(duì)以前的代碼產(chǎn)生副作用,比如在 ES2015 之前就存在的 for in 循環(huán),Object.keys() 和 Object.getOwnPropertyNames() 是肯定不會(huì)返回 Symbol 屬性的

以上就是JS 5種遍歷對(duì)象的方式的詳細(xì)內(nèi)容,更多關(guān)于JS 遍歷對(duì)象的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 精品一区二区在线观看 | 能在线观看的一区二区三区 | 亚洲精品天堂一区在线观看 | 女人张开腿男人猛桶视频 | 欧美日韩视频在线第一区二区三区 | 欧美一区二区三区日韩免费播 | 婷婷色九月综合激情丁香 | 国产成人久久精品区一区二区 | 日本三级网站在线观看 | 真实国产乱子伦高清 | 中文字幕一区二区三区亚洲精品 | www中文字幕 | 99精品视频免费在线观看 | 中文字幕亚洲精品第一区 | 欧美一区二区三区激情视频 | 久久精品国产福利 | 手机在线毛片 | 国产日韩亚洲不卡高清在线观看 | rion美乳弹出来四虎在线观看 | 免费成人高清视频 | 美女做爰视频在线观看免费 | 中文三级视频 | 国内精品一区二区2021在线 | 日韩中文字幕在线观看视频 | 美国一级毛片免费看成人 | 女人抠逼视频 | 亚洲第99页 | 波多野结衣在线播放 | 欧美日韩一区二区三区高清不卡 | 在线观看片成人免费视频 | 免费看黄色三级毛片 | 综合网自拍 | 国产日韩欧美精品一区二区三区 | 97超级碰碰碰碰在线视频 | 最近中文字幕免费视频 | 国厂自拍| 亚洲综合中文 | 高清亚洲 | 中国a毛片 | 特别福利视频在线观看 | 一区二区不卡在线 |