Join MDN and developers like you at Mozilla's View Source conference, 12-14 September in Berlin, Germany. Learn more at https://viewsourceconf.org

Object.keys()

Esta traducción está incompleta. Por favor, ayuda a traducir este artículo del inglés.

Resumen

El método Object.keys() devuelve un arreglo de las propiedades enumerables de un objeto dado, en el mismo orden que el que provee la iteración for...in (La diferencia radica en que el bulce for-in enumera las propiedades en la cadena prototipo).

Sintaxis

Object.keys(obj)

Parámetros

obj
El objeto cuyas propiedades enumerables serán devueltas.

Descripción

Object.keys devuelve un arreglo cuyos elementos son strings correspondientes a las propiedades enumerables que seencuentran directamente en el object. El orden de las propiedades es el mismo que se proporciona al iterar manualmente sobre las propiedades del objeto.

Ejemplos

var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']

// array like object
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']

// array like object with random key ordering
var an_obj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(an_obj)); // console: ['2', '7', '100']

// 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']

Si quieres todas las propiedades, incluso las no enumerables, mira Object.getOwnPropertyNames().

Notas

En ES5, si el argumento para este método no es un objeto (uno primitivo), causará un TypeError. En ES6, un argumento no-objeto será coaccionado hacia un objeto.

> Object.keys("foo")
TypeError: "foo" is not an object // código ES5

> Object.keys("foo")
["0", "1", "2"]                   // código ES

Polyfill

Para añadir soporte Object.keys en entornos más antiguos que no lo soportan de forma nativa, copia el siguiente fragmento:

// De https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
if (!Object.keys) {
  Object.keys = (function() {
    'use strict';
    var hasOwnProperty = Object.prototype.hasOwnProperty,
        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),
        dontEnums = [
          'toString',
          'toLocaleString',
          'valueOf',
          'hasOwnProperty',
          'isPrototypeOf',
          'propertyIsEnumerable',
          'constructor'
        ],
        dontEnumsLength = dontEnums.length;

    return function(obj) {
      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
        throw new TypeError('Object.keys called on non-object');
      }

      var result = [], prop, i;

      for (prop in obj) {
        if (hasOwnProperty.call(obj, prop)) {
          result.push(prop);
        }
      }

      if (hasDontEnumBug) {
        for (i = 0; i < dontEnumsLength; i++) {
          if (hasOwnProperty.call(obj, dontEnums[i])) {
            result.push(dontEnums[i]);
          }
        }
      }
      return result;
    };
  }());
}

Ten en cuenta que el código anterior incluye claves no-enumerables en IE7 (y quizás IE8), al pasar en un objeto desde una ventana diferente.

Para un simple Polyfill del Navegador, mira Javascript - Compatibilidad de Object.keys en Navegadores.

Especificaciones

Especificación Estado Comentario
ECMAScript 5.1 (ECMA-262)
The definition of 'Object.keys' in that specification.
Standard Definición inicial. Implementado en JavaScript 1.8.5.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.keys' in that specification.
Standard  

Compatibilidad con navegadores

Funcionalidad Chrome Firefox (Gecko) Internet Explorer Opera Safari
Soporte básico 5 4.0 (2.0) 9 12 5
Funcionalidad Android Chrome para Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Soporte básico ? ? ? ? ? ?

Basado en la tabla de compatibilidad de Kangax.

Mira también

Etiquetas y colaboradores del documento

 Colaboradores en esta página: PBartrina, Sanuzzi, cristianjav, rcchristiane
 Última actualización por: PBartrina,