HEY,小伙伴们!
js属性的可枚举和不可枚举是由enumerable的值决定的,可枚举性决定了是否可以被for...in遍历访问到,Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象;
Object对象的propertyIsEnumerable()方法可以判断此对象是否包含某个属性,并且这个属性是否可枚举。
需要注意的是:如果判断的属性存在于Object对象的原型内,不管它是否可枚举都会返回false;
一下四个操作会忽略enumerable为false的属性:
- for...in循环:只遍历对象自身的和继承的可枚举的属性。
- Object.keys()返回对象自身的所有可枚举的属性的键名。
- JSON.stringify()只串行化对象自身的可枚举的属性。
- Object.assign()忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性。
大多数时候,我们只关心对象自身的属性。所以,尽量不要用for...in循环,而用Object.keys()代替。
一共有5种遍历对象的方式:
1.for...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。
2.Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。
3.Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。
4.Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有 Symbol 属性的键名
5.Reflect.ownKeys返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。
以上的 5 种方法遍历对象的键名,都遵守同样的属性遍历的次序规则。
- 首先遍历所有数值键,按照数值升序排列。
- 其次遍历所有字符串键,按照加入时间升序排列。
- 最后遍历所有 Symbol 键,按照加入时间升序排列。