Como Sam Dutton respondeu, um novo método para esse fim foi introduzido no ECMAScript 5th Edition. Object.keys()
fará o que você deseja e é suportado no Firefox 4 , Chrome 6, Safari 5 e IE 9 .
Você também pode implementar muito facilmente o método em navegadores que não o suportam. No entanto, algumas das implementações existentes não são totalmente compatíveis com o Internet Explorer. Aqui está uma solução mais compatível:
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;
};
})();
Observe que a resposta atualmente aceita não inclui uma verificação de hasOwnProperty () e retornará propriedades herdadas pela cadeia de protótipos. Ele também não é responsável pelo famoso bug DontEnum no Internet Explorer, onde propriedades não enumeráveis na cadeia de protótipos fazem com que propriedades declaradas localmente com o mesmo nome herdem seu atributo DontEnum.
A implementação de Object.keys () fornecerá uma solução mais robusta.
EDIT: após uma discussão recente com kangax , um conhecido colaborador do Prototype, implementei a solução alternativa para o bug DontEnum com base no código para sua Object.forIn()
função encontrada aqui .
_.keys(myJSONObject)