El mètode Object.keys()
retorna un array de les propietats enumerables pròpies de l'objecte, en el mateix ordre en que es donarien en un bucle for...in
(la diferència radica en que el bucle for-in també enumera les propietats que pertanyen a la cadena de prototipus).
Sintaxi
Object.keys(obj)
Paràmetres
obj
- L'objecte del qual es retornaran les seves propietats pròpies enumerables.
Descripció
Object.keys()
retorna un array els elements del qual són strings que corresponen a les propietats enumerables que pertanyen directament a l'objecte obj
. L'ordre de les propietats és el mateix que el donat per recòrrer les propieats de l'objecte de forma manual.
Exemples
var arr = ['a', 'b', 'c']; console.log(Object.keys(arr)); // console: ['0', '1', '2'] // objecte en forma d'array var obj = { 0: 'a', 1: 'b', 2: 'c' }; console.log(Object.keys(obj)); // console: ['0', '1', '2'] // objecte en forma d'array amb les claus ordenades de manera aleatòria var an_obj = { 100: 'a', 2: 'b', 7: 'c' }; console.log(Object.keys(an_obj)); // console: ['2', '7', '100'] // getFoo és una propietat no 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 esteu interessats en obtenir totes les propietats, no només les enumerables, vegeu Object.getOwnPropertyNames()
.
Notes
A l'EcmaScript 5 llençarà una excepció TypeError
si el paràmetre obj
no és un objecte. A l'EcmaScript 6 el paràmetre serà forçat al tipus Object
.
Object.keys("foo"); // TypeError: "foo" no és un objecte (codi EcmaScript 5) Object.keys("foo"); // ["0", "1", "2"] (codi EcmaScript 6)
Polyfill
Per a afegit una funció compatible amb Object.keys
en plataformes que no la suporten de forma nativa, podeu utilitzar el codi següent:
// Tret 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; }; }()); }
Cal destacar que aquest codi inclou també propietats no enumerables a Internet Explorer 7 (i possiblement també a Internet Explorer 8), al passar un objecte pertanyent a una altra finestra.
Per a una versió simplificada Polyfill per a navegadors vegeu Compatibilitat de navegadors amb la funció Object.keys de JavaScript.
Especificacions
Especificació | Estat | Comentaris |
---|---|---|
ECMAScript 5.1 (ECMA-262) The definition of 'Object.keys' in that specification. |
Standard | Definició inicial. Implementat a 1.8.5. |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Object.keys' in that specification. |
Standard |
Compatibilitat amb navegadors
Característica | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Suport bàsic | 5 | 4.0 (2.0) | 9 | 12 | 5 |
Característica | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Suport bàsic | ? | ? | ? | ? | ? | ? |