一、Object.keys

定义:返回一个对象可枚举属性的字符串数组;

二、Object.getOwnPropertyNames

定义:返回一个对象可枚举、不可枚举属性的名称;

三、 共同点

都是返回自身的属性,不会返回原型链上的。都不会返回自身中Symbol值作为名称的属性。

(Reflect.ownKeys() 可以返回Symbol作为key的属性)

四、属性的可枚举性、不可枚举性

定义:可枚举属性是指那些内部 “可枚举” 标志设置为 true 的属性。对于通过直接的赋值和属性初始化的属性,该标识值默认为即为 true,对于通过 Object.defineProperty 等定义的属性,该标识值默认为 false。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var obj = { "prop1": "v1" };
Object.defineProperty(obj, "prop2", { value: "v2", writable: false });
console.log(Object.keys(obj).length); // output:1
console.log(Object.getOwnPropertyNames(obj).length); // output:2

console.log(Object.keys(obj)); // output:Array[1] => [0: "prop1"]

console.log(Object.getOwnPropertyNames(obj)); // output:Array[2] => [0: "prop1", 1: "prop2"]

const PROP_NAME = Symbol()
let obj = {
a: '1',
[PROP_NAME]: "一斤代码"
}
console.log(Object.keys(obj)) // ['a']
console.log(Object.getOwnPropertyNames(obj)) // ['a']

五、总结:

1、给对象直接赋值和属性初始化时,属性可枚举为true;通过Object.defineProperty定义的属性,可枚举为false;

2、Object.kes() 只返回对象可枚举的属性返回字符串数组;Object.getOwnPropertyNames() 返回可枚举和不可枚举的属性名称;

Reflect.ownKeys() 可以返回所有属性包括Symbol作为key的值。