JS獲取對象屬性的各種方式和區別(自身/原型屬性、可枚舉/不可枚舉)


對象的屬性有自身屬性和原型屬性之分,自身屬性是對象自己的屬性,原型屬性是存在於原型鏈上的屬性。

可以用Object.prototype.hasOwnProperty()判斷是自身屬性還是原型屬性。(in操作符只可以判斷對象是否有某個屬性,不能判斷是自身的,還是原型上的)

對象屬性也有可枚舉和不可枚舉之分,可枚舉屬性的屬性描述符enumerable為true,不可枚舉屬性的為false。

原生對象的大多數屬性都是不可枚舉的,比如數組和字符串的length,對象原型上的一些方法和屬性,比如toString、constructor、hasOwnProperty等等

下面看下都有哪些方式可以獲取對象的屬性

Object.keys()

返回自身的可枚舉屬性組成的數組 (不包含symbol)

Object.getOwnPropertyNames()

返回所有的自身屬性 組成的數組 (不包含symbol)

Object.getOwnPropertySymbols()

返回自身所有的Symbol屬性組成的數組

for...in

遍歷對象的所有可枚舉屬性

區別

可枚舉 可枚舉和不可枚舉
僅自身屬性 Object.keys Object.getOwnPropertyNames
自身和原型屬性 for...in

沒有原生的方法可以獲取對象上所有的屬性,包含自身和原型、可枚舉和不可枚舉,需要自己實現,示例如下:

function getAllkeys (obj) {
  const keys = []
  let temp = obj
  while (temp) {
      keys.push.apply(keys, Object.getOwnPropertyNames(temp))
      keys.push.apply(keys, Object.getOwnPropertySymbols(temp))
      temp = Object.getPrototypeOf(temp)
  }
  return keys
}

for...of 和 for...in的區別

for let i in obj 是以任意順序遍歷對象的可枚舉屬性,i是key

for let value of iterable 是按順序迭代一個可迭代對象,i是值

iterable可迭代對象包括:Array、Map、Set、String、TypedArray、arguments


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM