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

您的位置:首頁技術文章
文章詳情頁

JS 5種遍歷對象的方式

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

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

平時還真沒有使用到這個方法,一時不知如何回答

從方法名稱來分析,應該是返回的是對象自身屬性名組成的數組

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

感覺事情并不這么簡單,于是我仔細看了一下這幾種遍歷對象的方法的區別

for in

for in 循環是最基礎的遍歷對象的方式,它還會得到對象原型鏈上的屬性

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

可以看到對象原型上的屬性也被循環出來了

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

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

這時候原型上的 bar 屬性就被過濾掉了

Object.keys

Object.keys() 是 ES5 新增的一個對象方法,該方法返回對象自身屬性名組成的數組,它會自動過濾掉原型鏈上的屬性,然后可以通過數組的 forEach() 方法來遍歷

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

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

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

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

Object.getOwnPropertyNames

Object.getOwnPropertyNames() 也是 ES5 新增的一個對象方法,該方法返回對象自身屬性名組成的數組,包括不可枚舉的屬性,也可以通過數組的 forEach 方法來遍歷

// 創建一個對象并指定其原型,bar 為原型上的屬性// baz 為對象自身的屬性并且不可枚舉const obj = Object.create({ bar: ’bar’}, { baz: { value: ’baz’, enumerable: false }})obj.foo = ’foo’// 不包括不可枚舉的 baz 屬性Object.keys(obj).forEach((key) => { console.log(obj[key]) // foo})// 包括不可枚舉的 baz 屬性Object.getOwnPropertyNames(obj).forEach((key) => { console.log(obj[key]) // baz, foo})

ES2015 新增了 Symbol 數據類型,該類型可以作為對象的鍵,針對該類型 ES2015 同樣新增Object.getOwnPropertySymbols() 方法

Object.getOwnPropertySymbols

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

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

什么都沒有,因為該對象還沒有 Symbol 屬性

// 給對象添加一個不可枚舉的 Symbol 屬性Object.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 新增的靜態方法,該方法返回對象自身所有屬性名組成的數組,包括不可枚舉的屬性和 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() 是 否 是 是

結論

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

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

以上就是JS 5種遍歷對象的方式的詳細內容,更多關于JS 遍歷對象的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 欧美日韩在线视频免费完整 | 香蕉超级碰碰碰97视频蜜芽 | 欧美日韩乱国产 | 国产成人18黄网站免费网站 | 国产精品视频久久久久久 | 亚洲成人91 | 99久久国产免费 - 99久久国产免费 | 日韩经典视频 | 一色屋精品亚洲香蕉网站 | 国产成人午夜片在线观看 | 免费国产高清视频 | 久久免费精彩视频 | 欧美13一14周岁a在线播放 | 黄色大片三级 | 国产视频高清在线观看 | 亚洲综合91社区精品福利 | 日本护士一级毛片在线播放 | 久久视频在线免费观看 | 免费一级毛片私人影院a行 免费一级毛片无毒不卡 | 亚洲午夜久久 | 国产精品亚洲精品久久成人 | 国产精品久久久久久影院 | 日韩欧美亚州 | 亚洲欧美一区二区三区不卡 | 免费久久精品视频 | 久久视频在线免费观看 | 一级视频在线播放 | 亚洲九九色 | 欧美一区二区三区视频在线观看 | 国产成人91 | 成人免费高清视频网址 | 在线播放性xxx欧美 在线播放亚洲视频 | 久久久国产精品免费 | 亚洲精品91香蕉综合区 | 成人影院午夜久久影院 | 国产日韩精品一区在线观看播放 | 欧美日韩在线视频一区 | 男女精品视频 | 欧美怡红院在线 | 天堂8在线天堂资源bt | 国产精自产拍久久久久久蜜 |