遍历对象
E S 6 一共有 5 种方法可以遍历对象的属性 。
- for ... in
for . . . in 循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。
- Object.keys(obj)
Object . keys 返回 一个数组,包括对象自身的(不含继承的 )所有可枚举属性(不含 Symbol 属性)
- Object . getOwnPropertyNames(obj)
Object . getOwnPropertyNames 返回 一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)
-
Object.getOwnPropertySymbols(obj)
Object . getOwnPropertySymbols 返回 一个数组,包含对象自身的所有 Symbo l 属性 。
- Reflect .ownKeys(obj)
Reflect . ownKeys 返回 一个数组,包含对象自身 的所有属性 , 不管属性名是 Symbol 还 是字符串 , 也不管是否可枚举 。
以上 5 种方法遍历对象的属性时都遵守同样的属性遍历次序规则 。
- 首先遍历所有属性名为数值的属性 , 按照数字排序 。
- 其次遍历所有属性名为字符串的属性,按照生成时间排序。
- 最后遍历所有属性名为 Symbol 值的属性 , 按照生成时间排序。
总结如下:
属性类型 | for ... in | Object.keys(obj) | Object . getOwn-Property-Names(obj) | Object.getOwn-Property-Symbols(obj) | Reflect .ownKeys(obj) |
---|---|---|---|---|---|
原型链 | 是 | 否 | 否 | 否 | 否 |
Symbol | 否 | 否 | 否 | 是 | 是 |
不可枚举 | 否 | 否 | 是 | 是 | 是 |
可枚举 | 是 | 是 | 是 | 是 | 是 |
普通 | 是 | 是 | 是 | 否 | 是 |