Object.getOwnPropertyNames vs Object.keys

2022-08-30 00:14:52

和 在 javascript 中有什么区别?一些例子也将不胜感激。Object.getOwnPropertyNamesObject.keys


答案 1

有一点区别。 返回对象 的所有自己的属性。 返回所有可枚举的自己的属性。这意味着,如果您定义了对象属性而没有创建其中一些属性,这两种方法将为您提供相同的结果。Object.getOwnPropertyNames(a)aObject.keys(a)enumerable: false

测试起来很容易:

var a = {};
Object.defineProperties(a, {
    one: {enumerable: true, value: 1},
    two: {enumerable: false, value: 2},
});
Object.keys(a); // ["one"]
Object.getOwnPropertyNames(a); // ["one", "two"]

如果在定义属性时未提供属性属性描述符(意味着不使用 ),例如:Object.defineProperties

a.test = 21;

然后这样的属性自动成为可枚举的,并且两种方法产生相同的数组。


答案 2

另一个区别是,如果数组方法将返回一个额外的属性,即 。Object.getOwnPropertyNameslength

var x = ["a", "b", "c", "d"];
Object.keys(x);  //[ '0', '1', '2', '3' ]
Object.getOwnPropertyNames(x);  //[ '0', '1', '2', '3', 'length' ]