首頁  >  文章  >  web前端  >  JS遍歷物件有幾種方法

JS遍歷物件有幾種方法

hzc
hzc轉載
2020-06-18 09:30:512146瀏覽

幾天前有一個小夥伴問我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

也是ES5 新增的物件方法,該方法傳回物件自身屬性名稱組成的陣列,包括不可枚舉的屬性,也可以透過陣列的 方法來遍歷
// 创建一个对象并指定其原型,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(obj).forEach((key) => {
  console.log(obj[key])
})
// 给对象添加一个不可枚举的 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()
Reflect.ownKeys(obj).forEach((key) => {
  console.log(obj[key]) // baz, foo, Symbol baz, Symbol foo
})
方式基本屬性#for inObject.keys()
# Object.getOwnPropertyNames()forEach
Object.getOwnPropertySymbols()##Object .getOwnPropertySymbols 方法傳回物件本身的Symbol 屬性所組成的數組,不包括字串屬性 什麼都沒有,因為該物件還沒有Symbol 屬性
方法是ES2015 新增的靜態方法,該方法傳回物件自身所有屬性名稱組成的陣列,包括不可枚舉的屬性和Symbol 屬性 對比
##原型鏈 不可枚舉 Symbol
#是

#否

Object.getOwnPropertyNames()######是######否######是########################################################################################################################################################## ###否############Object.getOwnPropertySymbols()#######否############是######是# ###########Reflect.ownKeys()######是#######否######是######是###### #########結論######這其中只有for in 迴圈會得到物件原型鏈上的屬性,其它方法都只適用於物件本身的屬性######ES 語言後續新增的功能不會對先前的程式碼產生副作用,例如在ES2015 之前就存在的for in 循環,Object.keys() 和Object.getOwnPropertyNames() 是肯定不會回傳Symbol 屬性的。 ######推薦教學:《###JS教學###》###

以上是JS遍歷物件有幾種方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除