ES6 共有五种方法遍历对象的属性
-
for...in
循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)
-
Object.keys(obj)
返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名
-
Object.getOwnPropertyNames(obj)
返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名
-
Object.getOwnPropertySymbols(obj)
返回一个数组,包含对象自身的所有 Symbol 属性的键名(不管是否可枚举)
-
Reflect.ownKeys(obj)
返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举
总结如下表
方法 | 自身+可枚举 | 继承 | symbol | 不可枚举 | 返回值 |
---|---|---|---|---|---|
for…in | ✔ | ✔ | ✖ | ✖ | \ |
Object.keys() | ✔ | ✖ | ✖ | ✖ | 数组 |
Object.getOwnPropertyNames() | ✔ | ✖ | ✔ | ✖ | 数组 |
Object.getOwnPropertySymbols() | ✔ | ✖ | ✔ | ✔ | 数组 |
Reflect.ownKeys() | ✔ | ✖ | ✔ | ✔ | 数组 |
遍历次序规则
- 首先遍历所有数值键,按照数值升序排列
- 其次遍历所有字符串键,按照加入时间升序排列
- 最后遍历所有 Symbol 键,按照加入时间升序排列
示例
var obj = {enumProp: "enumProp", a: "strings order by the time", 2: "numbers order by value"};
Object.defineProperty(obj, 'unEnumProp', {
value: 'unenum',
enumerable: false
})
var enumSymbolProp = Symbol("enumSymbolProp");
obj[enumSymbolProp] = "localSymbol";
Object.defineProperty(obj, Symbol("unEnumProp"), {
value: 'unenum',
enumerable: false
})
Object.keys(obj);
Object.getOwnPropertyNames(obj);
Object.getOwnPropertySymbols(obj);
Reflect.ownKeys(obj);
返回值分别如下: