javascript - es6 - ¿Cuál es la diferencia entre Reflect.ownKeys(obj) y Object.keys(obj)?
es6 browser support (3)
Probarlos en un caso real simple produce el mismo resultado:
const obj = {a: 5, b: 5};
console.log(Reflect.ownKeys(obj));
console.log(Object.keys(obj));
// Result
[''a'', ''b'']
[''a'', ''b'']
¿Cuándo produce Reflect.ownKeys(obj)
resultado diferente de Object.keys(obj)
?
Primero, un ejemplo ( 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'']
Aquí, Reflect.ownKeys()
devuelve una matriz de las propias claves de propiedad del objeto de destino. A saber, una matriz de todas las propiedades (enumerables o no) que se encuentran directamente sobre el objeto dado concatenado con una matriz de todas las propiedades de símbolos encontradas directamente sobre el objeto dado.
Object.ownKeys()
solo devolverá las propiedades enumerables.
Las propiedades enumerables son aquellas que pueden ser enumeradas por un bucle for ... in , con la excepción de las propiedades heredadas a través de la cadena de prototipos. Vea la descripción de MDN para más detalles.
Resumen:
Reflect.ownKeys () es el equivalente de Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))
que devolverá las propiedades enumerables y no enumerables.
mientras
Object.keys () devuelve propiedades enumerables pero no devuelve propiedades no enumerables (que es una característica de Object.getOwnPropertyNames () ).
Object.keys()
devuelve una array
de cadenas, que son las propiedades enumerables propias del objeto.
Reflect.ownKeys(obj)
devuelve el equivalente de:
Object.getOwnPropertyNames(target).
concat(Object.getOwnPropertySymbols(target))
El método Object.getOwnPropertyNames()
devuelve una matriz de todas las propiedades ( enumerable
o no ) encontradas directamente sobre un objeto determinado.
El método Object.getOwnPropertySymbols()
devuelve una matriz de todas las propiedades de symbol
encontradas directamente sobre un objeto dado.
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));
Un pequeño fiddle
para demostrar.
-
Object.keys
devuelve solo claves de cadena enumerables;Reflect.ownKeys
devuelve claves de cadena y símbolo independientemente de su enumerabilidad. Ambos operan solo en propiedades propias. -
Object.keys
devuelve una matriz vacía si el argumento no es un objeto ninull
niundefined
(por ejemplo,Object.keys(1)
), mientras queReflect.ownKeys
arroja unTypeError
. -
Reflect.ownKeys
se introdujo con ES6 y no es compatible con motores JavaScript más antiguos.