Como respondió Sam Dutton, un nuevo método para este propósito se ha introducido en ECMAScript 5th Edition. Object.keys()
hará lo que quiera y es compatible con Firefox 4, Chrome 6, Safari 5 y IE 9.
También puede implementar fácilmente el método en navegadores que no lo admiten. Sin embargo, algunas de las implementaciones no son totalmente compatibles con Internet Explorer.I've detailed this on my blog y produjo una solución más compatible:
Object.keys = Object.keys || (function() {
var hasOwnProperty = Object.prototype.hasOwnProperty,
hasDontEnumBug = !{toString:null}.propertyIsEnumerable("toString"),
DontEnums = [
'toString', 'toLocaleString', 'valueOf', 'hasOwnProperty',
'isPrototypeOf', 'propertyIsEnumerable', 'constructor'
],
DontEnumsLength = DontEnums.length;
return function (o) {
if (typeof o != "object" && typeof o != "function" || o === null)
throw new TypeError("Object.keys called on a non-object");
var result = [];
for (var name in o) {
if (hasOwnProperty.call(o, name))
result.push(name);
}
if (hasDontEnumBug) {
for (var i = 0; i < DontEnumsLength; i++) {
if (hasOwnProperty.call(o, DontEnums[i]))
result.push(DontEnums[i]);
}
}
return result;
};
})();
Nota que la respuesta aceptado actualmente no incluye un cheque por hasOwnProperty() y volverá propiedades que se heredan a través de la cadena de prototipo. Tampoco da cuenta del famoso error DontEnum en Internet Explorer, donde las propiedades no enumerables en la cadena del prototipo causan propiedades declaradas localmente con el mismo nombre para heredar su atributo DontEnum.
Implementando Object.keys() le dará una solución más robusta.
EDIT: tras una reciente discusión con kangax, un contribuyente conocido a prototipo, que implementó la solución para el error DontEnum basado en el código de su función Object.forIn()
encontrado here.
Un poco fuera de tema, pero si se utiliza underscore.js: '_.keys (myJSONObject)' –
Posible duplicado de [¿Cómo puedo recorrer o enumerar un objeto JavaScript?] (http: // stackoverfl ow.com/questions/684672/how-do-i-loop-through-or-enumerate-a-javascript-object) –