support es6 ecmascript browsers javascript ecmascript-6 es2015

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 ni null ni undefined (por ejemplo, Object.keys(1) ), mientras que Reflect.ownKeys arroja un TypeError .
  • Reflect.ownKeys se introdujo con ES6 y no es compatible con motores JavaScript más antiguos.