Summary
The Object.keys()
method returns an array of a given object's own enumerable properties, in the same order as that provided by a for...in
loop (the difference being that a for-in loop enumerates properties in the prototype chain as well).
Syntax
Object.keys(obj)
Parameters
- obj
- The object whose enumerable own properties are to be returned.
Description
Object.keys
returns an array whose elements are strings corresponding to the enumerable properties found directly upon object
. The ordering of the properties is the same as that given by looping over the properties of the object manually.
Examples
var arr = ["a", "b", "c"]; alert(Object.keys(arr)); // will alert "0,1,2" // array like object var obj = { 0 : "a", 1 : "b", 2 : "c"}; alert(Object.keys(obj)); // will alert "0,1,2" // array like object with random key ordering var an_obj = { 100: "a", 2: "b", 7: "c"}; alert(Object.keys(an_obj)); // will alert "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; alert(Object.keys(my_obj)); // will alert only foo
If you want all properties, even not enumerables, see Object.getOwnPropertyNames
.
Polyfill
To add compatible Object.keys
support in older environments that do not natively support it, copy the following snippet:
// From 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; }; }()); }
Please note that the above code includes non-enumerable keys in IE7 (and maybe IE8), when passing in an object from a different window.
For a simple browser polyfill, see Javascript - Object.keys Browser Compatibility.
Specifications
Specification | Status | Comment |
---|---|---|
ECMAScript Language Specification 5.1th Edition (ECMA-262) | Standard | Initial definition. Implemented in JavaScript 1.8.5 |
ECMAScript Language Specification 6th Edition (ECMA-262) | Draft |
Browser compatibility
Feature | Firefox (Gecko) | Chrome | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 4 (2.0) | 5 | 9 | 12 | 5 |
Feature | Firefox Mobile (Gecko) | Android | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Basic support | ? | ? | ? | ? | ? |
Based on Kangax's compat table.