JavaScript Object.getOwnPropertyNamesとの違いは何Object.keysですか?また、いくつかの例をいただければ幸いです。
JavaScript Object.getOwnPropertyNamesとの違いは何Object.keysですか?また、いくつかの例をいただければ幸いです。
回答:
少し違いがあります。オブジェクトのすべての独自のプロパティをObject.getOwnPropertyNames(a)返します。列挙可能なすべての独自のプロパティを返します。つまり、一部を作成せずにオブジェクトのプロパティを定義した場合、これらの2つの方法で同じ結果が得られるということです。aObject.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。オブジェクトを作成する2つの方法では、との間に違いはObject.getOwnPropertyNamesありませんObject.keys。
すでに説明したように、.keys列挙可能なプロパティは返しません。
例に関して、落とし穴のケースの1つは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...
});
getOwnPropertyNames、順序が正しくない例を知っていますか?ES2015はの順序をObect.getOwnPropertyNames指定しているため、の順序Obect.keysはまだ実装次第です。
for-in loop、Object.keysとObject.getOwnPropertyNames。とはいえ、3つすべてが相互に一貫した順序で列挙されます。
Object.keys()それらは返されませんが、返されますObject.getOwnPropertyNames()。