對象的每一個屬性都有一個描述對象(Descriptor),用來控制該屬性的行爲。Object.getOwnPropertyDescriptor
方法能夠獲取該屬性的描述對象。es6
{ value: 123, writable: true, enumerable: true, configurable: true }
描述對象的enumerable
屬性,稱爲」可枚舉性「,若是該屬性爲false
,就表示某些操做會忽略當前屬性。數組
目前,有四個操做會忽略enumerable
爲false
的屬性。spa
for...in
循環:只遍歷對象自身的和繼承的可枚舉的屬性。Object.keys()
:返回對象自身的全部可枚舉的屬性的鍵名。JSON.stringify()
:只串行化對象自身的可枚舉的屬性。Object.assign()
: 忽略enumerable
爲false
的屬性,只拷貝對象自身的可枚舉的屬性。其中,只有for...in
會返回繼承的屬性,其餘三個方法都會忽略繼承的屬性,只處理對象自身的屬性。code
操做中引入繼承的屬性會讓問題複雜化,大多數時候,咱們只關心對象自身的屬性。因此,儘可能不要用for...in
循環,而用Object.keys()
代替。對象
ES6 一共有 5 種方法能夠遍歷對象的屬性。繼承
(1)for...inip
for...in
循環遍歷對象自身的和繼承的可枚舉屬性(不含 Symbol 屬性)。字符串
(2)Object.keys(obj)get
Object.keys
返回一個數組,包括對象自身的(不含繼承的)全部可枚舉屬性(不含 Symbol 屬性)的鍵名。string
(3)Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames
返回一個數組,包含對象自身的全部屬性(不含 Symbol 屬性,可是包括不可枚舉屬性)的鍵名。
(4)Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols
返回一個數組,包含對象自身的全部 Symbol 屬性的鍵名。
(5)Reflect.ownKeys(obj)
Reflect.ownKeys
返回一個數組,包含對象自身的全部鍵名,無論鍵名是 Symbol 或字符串,也無論是否可枚舉。
以上的 5 種方法遍歷對象的鍵名,都遵照一樣的屬性遍歷的次序規則。