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.