Object.getOwnPropertyNames
和Object.keys
在JavaScript中有什么区别?同时,一些示例会很受欢迎。
Object.getOwnPropertyNames
和Object.keys
在JavaScript中有什么区别?同时,一些示例会很受欢迎。
有一点不同。Object.getOwnPropertyNames(a)
返回对象a
的所有自有属性。Object.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;
那么这样的属性将自动变为可枚举,并将出现在两个方法返回的数组中。
length
属性不可枚举,因此它不会显示在 Object.keys
中。 - Barmarlength
属性存在于原型上而不是对象本身,因此Object.keys
和Object.getOwnPropertyNames
都无法列出它。 - The QodesmithObject.getOwnPropertyNames(anyArray)
的结果包括 length
。 - thorn0length
属性不可枚举:Object.getOwnPropertyDescriptor([], 'length')
- zurfyx另一个区别在于数组的情况下,Object.getOwnPropertyNames
方法将返回一个额外的属性,即length
。
var x = ["a", "b", "c", "d"];
Object.keys(x); //[ '0', '1', '2', '3' ]
Object.getOwnPropertyNames(x); //[ '0', '1', '2', '3', '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
之间没有区别。 - Boric如之前所解释的那样,.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')));
Object.keys(o).forEach(function(k) {
if (!o.propertyIsEnumerable(k)) return;
// do something...
});
getOwnPropertyNames
无序的示例?因为ES2015指定了Obect.getOwnPropertyNames
的顺序,而Obect.keys
的顺序仍取决于实现。 - szupiefor-in 循环
、Object.keys
和 Object.getOwnPropertyNames
。尽管如此,这三个方法枚举的顺序是相互一致的。 - Thomas Eding
Object.keys()
不会返回它们,而Object.getOwnPropertyNames()
会返回。 - Sirko