对象的每一个属性都有一个描述对象(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 种方法遍历对象的键名,都遵照一样的属性遍历的次序规则。