JavaScript遍歷對象的方法有幾種-創新互聯

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

創新互聯是一家專業提供南岔企業網站建設,專注與網站設計、做網站H5響應式網站、小程序制作等業務。10年已為南岔眾多企業、政府機構等服務。創新互聯專業的建站公司優惠進行中。

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

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

那和 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遍歷對象有幾種方法的詳細內容,更多請關注創新互聯成都網站設計公司其它相關文章!

另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

本文名稱:JavaScript遍歷對象的方法有幾種-創新互聯
轉載注明:http://m.kartarina.com/article44/ccgcee.html

成都網站建設公司_創新互聯,為您提供定制開發網站內鏈做網站靜態網站商城網站網站導航

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

商城網站建設
主站蜘蛛池模板: 精品人妻系列无码人妻免费视频| 无码欧精品亚洲日韩一区夜夜嗨| 日韩中文无码有码免费视频| 小泽玛丽无码视频一区| 亚洲精品无码久久千人斩| 2024你懂的网站无码内射| 国产精品久久无码一区二区三区网| 久久久久久亚洲av无码蜜芽 | 亚洲AV无码1区2区久久| 影音先锋无码a∨男人资源站| 亚洲中文字幕无码久久综合网| 成人免费无码大片a毛片软件| 国产AV无码专区亚洲AV琪琪| 亚洲AV无码成人精品区天堂| 成人无码区免费视频观看| 亚洲AV无码乱码在线观看富二代 | 亚洲成?Ⅴ人在线观看无码| 亚洲AV无码久久| 日韩午夜福利无码专区a| 亚洲AV综合色区无码另类小说| 人妻少妇无码视频在线| 日韩人妻无码免费视频一区二区三区 | 亚洲人av高清无码| 亚洲精品无码中文久久字幕| 精品亚洲AV无码一区二区| 无码丰满熟妇一区二区| 韩国无码AV片在线观看网站 | 亚洲av无码无在线观看红杏| 97久久精品无码一区二区| 一夲道dvd高清无码| 亚洲乱亚洲乱少妇无码| 无码精品黑人一区二区三区| 久久久久久亚洲av无码蜜芽| 伊人蕉久中文字幕无码专区 | 亚洲热妇无码AV在线播放| 人妻系列无码专区无码中出| 国产又爽又黄无码无遮挡在线观看 | 精品人妻系列无码人妻漫画 | 久久精品岛国av一区二区无码| 中文午夜人妻无码看片| 国模吧无码一区二区三区|