可枚舉性
對(duì)象的每個(gè)屬性都有一個(gè)描述對(duì)象(Descriptor)卒蘸,用來控制該屬性的行為港柜。Object.getOwnPropertyDescriptor方法可以獲取該屬性的描述對(duì)象。
let obj = { foo: 123 };
Object.getOwnPropertyDescriptor(obj, 'foo')
// {
// value: 123,
// writable: true,
// enumerable: true,
// configurable: true
// }
描述對(duì)象的enumerable屬性材义,稱為”可枚舉性“,如果該屬性為false,就表示某些操作會(huì)忽略當(dāng)前屬性饼灿。
目前,有四個(gè)操作會(huì)忽略enumerable為false的屬性:
for...in循環(huán):只遍歷對(duì)象自身的和繼承的可枚舉的屬性帝美。
Object.keys():返回對(duì)象自身的所有可枚舉的屬性的鍵名碍彭。
JSON.stringify():只串行化對(duì)象自身的可枚舉的屬性。
Object.assign(): 忽略enumerable為false的屬性悼潭,只拷貝對(duì)象自身的可枚舉的屬性庇忌。
其中,只有for...in會(huì)返回繼承的屬性舰褪,其他三個(gè)方法都會(huì)忽略繼承的屬性皆疹,只處理對(duì)象自身的屬性。引入“可枚舉”(enumerable)這個(gè)概念的最初目的占拍,就是讓某些屬性可以規(guī)避掉for...in操作略就,不然所有內(nèi)部屬性和方法都會(huì)被遍歷到。
大多數(shù)時(shí)候晃酒,我們只關(guān)心對(duì)象自身的屬性表牢。所以,盡量不要用for...in循環(huán)贝次,而用Object.keys()代替初茶。
遍歷方法
(1)for...in
for...in循環(huán)遍歷對(duì)象自身的和繼承的可枚舉屬性(不含 Symbol 屬性)
(2)Object.keys(obj)
Object.keys返回一個(gè)數(shù)組,包括對(duì)象自身的(不含繼承的)所有可枚舉屬性(不含 Symbol 屬性)的鍵名
(3)Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames返回一個(gè)數(shù)組,包含對(duì)象自身的所有屬性(不含 Symbol 屬性恼布,但是包括不可枚舉屬性)的鍵名螺戳。
(4)Reflect.ownKeys(obj)
Reflect.ownKeys返回一個(gè)數(shù)組,包含對(duì)象自身的所有鍵名折汞,不管鍵名是 Symbol 或字符串倔幼,也不管是否可枚舉。