Como respondió Sam Dutton, se ha introducido un nuevo método para este mismo propósito en ECMAScript 5th Edition. Object.keys()
hará lo que quieras y es compatible con Firefox 4 , Chrome 6, Safari 5 e 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. Aquí hay 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;
};
})();
Tenga en cuenta que la respuesta actualmente aceptada no incluye una comprobación de hasOwnProperty () y devolverá las propiedades que se heredan a través de la cadena del prototipo. Tampoco tiene en cuenta el famoso error DontEnum en Internet Explorer, donde las propiedades no enumerables en la cadena del prototipo hacen que las propiedades declaradas localmente con el mismo nombre hereden su atributo DontEnum.
Implementar Object.keys () le dará una solución más robusta.
EDITAR: después de una discusión reciente con kangax , un conocido colaborador de Prototype, implementé la solución para el error DontEnum basado en el código para su Object.forIn()
función que se encuentra aquí .
_.keys(myJSONObject)