Object.getOwnPropertyNames
和Object.keys
javascript有什么区别?还可以理解一些示例。
Object.getOwnPropertyNames
和Object.keys
javascript有什么区别?还可以理解一些示例。
Answers:
有一点区别。Object.getOwnPropertyNames(a)
返回该对象的所有自身属性a
。Object.keys(a)
返回所有可枚举的自身属性。这意味着,如果您定义对象属性而不创建其中某些属性,则enumerable: false
这两种方法将为您提供相同的结果。
很容易测试:
var a = {};
Object.defineProperties(a, {
one: {enumerable: true, value: 'one'},
two: {enumerable: false, value: 'two'},
});
Object.keys(a); // ["one"]
Object.getOwnPropertyNames(a); // ["one", "two"]
如果您在定义属性时未提供属性属性描述符(即您不使用Object.defineProperties
),例如:
a.test = 21;
然后,该属性将自动成为可枚举的,并且这两种方法都会产生相同的数组。
length
数组对象的属性不可枚举,因此不会显示在中Object.keys
。
length
对象的属性在原型上,而不是对象本身,因此Object.keys
也Object.getOwnPropertyNames
不会列出它。
Object.getOwnPropertyNames(anyArray)
包括length
Object.getOwnPropertyNames(anyArray)
确实包含length
在返回的数组中!
创建对象时的文字表示法与构造方法。这是让我着迷的东西。
const cat1 = {
eat() {},
sleep() {},
talk() {}
};
// here the methods will be part of the Cat Prototype
class Cat {
eat() {}
sleep() {}
talk() {}
}
const cat2 = new Cat()
Object.keys(cat1) // ["eat", "sleep", "talk"]
Object.keys(Object.getPrototypeOf(cat2)) // []
Object.getOwnPropertyNames(cat1) // ["eat", "sleep", "talk"]
Object.getOwnPropertyNames(Object.getPrototypeOf(cat2)) // ["eat", "sleep", "talk"]
cat1 // {eat: function, sleep: function, talk: function}
cat2 // Cat {}
// a partial of a function that is used to do some magic redeclaration of props
function foo(Obj) {
var propNames = Object.keys(Obj);
// I was missing this if
// if (propNames.length === 0) {
// propNames = Object.getOwnPropertyNames(Obj);
// }
for (var prop in propNames) {
var propName = propNames[prop];
APIObject[propName] = "reasign/redefine or sth";
}
}
因此,在我的情况下,foo
如果我给它分配了cat2类型的对象,该功能将无法正常工作。
还有其他创建对象的方法,因此其中也可能存在其他缺陷。
Object.getOwnPropertyNames
将返回属性名的cat1
,而不是cat2
。创建对象的两种方式在Object.getOwnPropertyNames
和之间没有区别Object.keys
。
如前所述,.keys
不会返回可枚举的属性。
关于示例,一个陷阱是一个Error
对象:它的某些属性是可枚举的。
因此,尽管console.log(Object.keys(new Error('some msg')))
收益率[]
,
console.log(Object.getOwnPropertyNames(new Error('some msg')))
收益率["stack", "message"]
console.log(Object.keys(new Error('some msg')));
console.log(Object.getOwnPropertyNames(new Error('some msg')));
另一个区别是(至少与nodejs一起)“ getOwnPropertyNames”函数不能保证键顺序,这就是为什么我通常使用“ keys”函数:
Object.keys(o).forEach(function(k) {
if (!o.propertyIsEnumerable(k)) return;
// do something...
});
for-in loop
,Object.keys
,和Object.getOwnPropertyNames
。就是说,所有三个将以一致的顺序相互列举。
Object.keys()
不返回,而返回Object.getOwnPropertyNames()
。