概述
Object.keys() 方法会返回一个由给定对象的所有可枚举自身属性的属性名组成的数组,数组中属性名的排列顺序和使用for-in
循环遍历该对象时返回的顺序一致(两者的主要区别是 for-in 还会遍历出一个对象从其原型链上继承到的可枚举属性)。
语法
Object.keys(obj)
参数
- obj
- 返回该对象的所有可枚举自身属性的属性名。
描述
Object.keys
返回一个所有元素为字符串的数组,其元素来自于从给定的对象上面可直接枚举的属性。这些属性的顺序与手动遍历该对象属性时的一致。
例子
var arr = ["a", "b", "c"]; alert(Object.keys(arr)); // 弹出"0,1,2" // 类数组对象 var obj = { 0 : "a", 1 : "b", 2 : "c"}; alert(Object.keys(obj)); // 弹出"0,1,2" // getFoo是个不可枚举的属性 var my_obj = Object.create({}, { getFoo : { value : function () { return this.foo } } }); my_obj.foo = 1; alert(Object.keys(my_obj)); // 只弹出foo
如果你想获取一个对象的所有属性,,甚至包括不可枚举的,请查看Object.getOwnPropertyNames
。
兼容旧环境
运行下面的代码可以兼容那些没有原生支持Object.key方法的JavaScript环境。
if (!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 (obj) { if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object'); var result = []; for (var prop in obj) { if (hasOwnProperty.call(obj, prop)) result.push(prop); } if (hasDontEnumBug) { for (var i=0; i < dontEnumsLength; i++) { if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]); } } return result; } })() };
上面的代码在IE7(也许IE8也是)下有个问题,就是如果传入一个来自其他 window 对象下的对象时,不可枚举的属性也会获取到。
另一个简单点的实现方法,来自 Javascript - Object.keys Browser Compatibility
if (!Object.keys) Object.keys = function(o) { if (o !== Object(o)) throw new TypeError('Object.keys called on a non-object'); var k=[],p; for (p in o) if (Object.prototype.hasOwnProperty.call(o,p)) k.push(p); return k; }
规范
Specification | Status | Comment |
---|---|---|
ECMAScript 5.1 (ECMA-262) Object.keys |
Standard | Initial definition. Implemented in JavaScript 1.8.5 |
ECMAScript 2015 (6th Edition, ECMA-262) Object.keys |
Standard |
浏览器兼容性
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 | ? | ? | ? | ? | ? |
相关链接
- Enumerability and ownership of properties
Object.prototype.propertyIsEnumerable
Object.create
Object.getOwnPropertyNames
- Bug 307791 - Implement ES5's Object.keys(O)