Object.keys, for in, Object.getOwnPropertyNames, Reflect.ownKeys 區別

緣由

主要是回顧下基礎知識,像這種獲取對象屬性集合的方法不少,以前記憶有點混淆了,寫個實驗代碼,而後記錄下。markdown

測試代碼:

let obj = Object.create({
  e: 5,
})

obj.a = 1

obj.b = 2

obj[Symbol('c')] = 3

Reflect.defineProperty(obj, 'd', {
  enumerable: false,
  value: 4,
})

// for in
for (let key in obj) {
  console.log(key) // a, b, e
}

// Object.keys
console.log(Object.keys(obj)) // [ 'a', 'b' ]

// getOwnPropertyNames
console.log(Object.getOwnPropertyNames(obj)) // [ 'a', 'b', 'd' ]

// ownKeys
console.log(Reflect.ownKeys(obj)) // [ 'a', 'b', 'd', Symbol(c) ]
複製代碼

區別

  • for in,遍歷全部可枚舉屬性,原型屬性。不包括不可枚舉屬性,Symbol
  • Object.keys(),獲取自身可枚舉屬性。不包括不可枚舉屬性,原型屬性,Symbol
  • Object.getOwnPropertyNames,獲取自身全部屬性名稱,包括不可枚舉屬性。不包括Symbol,不包括原型
  • Reflect.ownKeys,獲取自身全部屬性名稱,包括不可枚舉屬性,Symbol。不包括原型(其實就是Object.getOwnPropertyNames與Object.getOwnPropertySymbols之和)

對照表

方法/屬性 可枚舉 不可枚舉 Symbol 原型
for in
Object.keys()
Object.getOwnPropertyNames
Reflect.ownKeys

結論

通常獲取可枚舉屬性用Object.keys()就行了(若是想獲取屬性和值用Object.assign() )。若是想獲取到原型上的枚舉屬性再用for in。測試

若是想獲取自身的全部屬性包括不可枚舉的屬性,推薦用Reflect.ownKeys。Reflect將來會替代掉Object的一些方法。spa

相關文章
相關標籤/搜索