Reflect.ownKeys() 与 Object.keys() 区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var obj = {
a: 1,
b: 2
};
Object.defineProperty(obj, "method", {
value: function () {
alert("Non enumerable property");
},
enumerable: false
});

console.log(Object.keys(obj));
// ["a", "b"]
console.log(Reflect.ownKeys(obj));
// ["a", "b", "method"]

从结果上看出

Object.keys() 返回属性 key,但不包括不可枚举的属性
Reflect.ownKeys() 返回所有属性 key

Object.keys()

相当于返回属性数组

Reflect.ownKeys()

相当于 Object.getOwnPropertyNames(target) concat(Object.getOwnPropertySymbols(target))

  • getOwnPropertyNames() 返回所有属性的数组
  • Object.getOwnPropertySymbols() 返回所有符号属性直接发现在给定的对象

面试题:

设计一个对象,键名的类型至少包含一个 symbol 类型,并且实现遍历所有 key

1
2
3
4
5
6
let name = Symbol("name");
let product = {
[name]: "平衡车",
price: 1999
};
Reflect.ownKeys(product);