Quelle est la différence entre Reflect.ownKeys (obj) et Object.keys (obj)?

Les analyser dans un cas réel simple donne le même résultat:

const obj = {a: 5, b: 5}; console.log(Reflect.ownKeys(obj)); console.log(Object.keys(obj)); // Result ['a', 'b'] ['a', 'b'] 

Quand Reflect.ownKeys(obj) produit-t-il une sortie différente de Object.keys(obj) ?

Object.keys() renvoie un array de chaînes, qui sont les propriétés énumérables de l'objet.

Reflect.ownKeys(obj) renvoie l'équivalent de:

 Object.getOwnPropertyNames(target). concat(Object.getOwnPropertySymbols(target)) 

La méthode Object.getOwnPropertyNames() renvoie un tableau de toutes les propriétés ( enumerable ou non ) directement sur un objet donné.

La méthode Object.getOwnPropertySymbols() renvoie un tableau de toutes les propriétés de symbol directement sur un objet donné.

 var testObject; Object.defineProperty(testObject, 'myMethod', { value: function () { alert("Non enumerable property"); }, enumerable: false }); //does not print myMethod since it is defined to be non-enumerable console.log(Object.keys(testObject)); //prints myMethod irrespective of it being enumerable or not. console.log(Reflect.ownKeys(testObject)); 

Une petite fiddle à démontrer.

Tout d'abord, un exemple ( ES6Fiddle ):

 // getFoo is property which isn't enumerable var my_obj = Object.create({}, { getFoo: { value: function() { return this.foo; } } }); my_obj.foo = 1; console.log(Object.keys(my_obj)); // console ['foo'] console.log(Reflect.ownKeys(my_obj)); // console ['getFoo', 'foo'] 

Ici, Reflect.ownKeys() renvoie un tableau des clés de propriété de l'objet cible. À savoir, un tableau de toutes les propriétés (énumérables ou non) trouvé directement sur l'objet donné concaténé avec un tableau de toutes les propriétés de symbole trouvées directement sur l'objet donné.

Object.ownKeys() ne renverra que les propriétés énumérées.

Les propriétés énumères sont celles qui peuvent être énumérées par un … en boucle , à l'exception des propriétés héritées à travers la chaîne prototype. Consultez la description MDN pour plus de détails.

Résumé:

Reflect.ownKeys () est l'équivalent de Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)) qui renverra les propriétés énumérées et non énumérées

tandis que

Object.keys () renvoie des propriétés énumérables mais ne renvoie pas les propriétés non énumérées (qui est une caractéristique de Object.getOwnPropertyNames () ).

  • Object.keys renvoie uniquement des clés de chaîne énumérables; Reflect.ownKeys renvoie les deux chaînes et les clés de symbole indépendamment de leur énumération. Tous deux fonctionnent uniquement sur leurs propres propriétés.
  • Object.keys renvoie un tableau vide si l'argument n'est pas un objet et non null ou undefined (par exemple, Object.keys(1) ), alors que Reflect.ownKeys lance un TypeError .
  • Reflect.ownKeys été introduit avec ES6 et n'est pas pris en charge dans les moteurs Java plus anciens.