假设我创建了一个对象:
var myObject =
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
检索属性名称列表的最佳方法是什么?即我想最终得到一些变量“键”,这样:
keys == ["ircEvent", "method", "regex"]
假设我创建了一个对象:
var myObject =
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
检索属性名称列表的最佳方法是什么?即我想最终得到一些变量“键”,这样:
keys == ["ircEvent", "method", "regex"]
在现代浏览器(IE9+、FF4+、Chrome5+、Opera12+、Safari5+)中,您可以使用内置的Object.keys方法:
var keys = Object.keys(myObject);
上面有一个完整的 polyfill,但一个简化的版本是:
var getKeys = function(obj){
var keys = [];
for(var key in obj){
keys.push(key);
}
return keys;
}
或者替换var getKeys
为Object.prototype.keys
以允许您调用.keys()
任何对象。扩展原型有一些副作用,我不建议这样做。
正如slashnick指出的那样,您可以使用“for in”构造来迭代对象的属性名称。但是,您将迭代对象原型链中的所有属性名称。如果你想迭代只是在对象自己的属性,你可以利用的对象#hasOwnProperty()方法。从而有以下。
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
/* useful code here */
}
}
正如 Sam Dutton 所回答的那样,ECMAScript 5th Edition 中引入了一种用于此目的的新方法。 Object.keys()
会做你想做的,并且在Firefox 4 , Chrome 6, Safari 5 和IE 9 中得到支持。
您也可以很容易地在不支持它的浏览器中实现该方法。但是,有些实现与 Internet Explorer 并不完全兼容。这是一个更兼容的解决方案:
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;
};
})();
请注意,当前接受的答案不包括对hasOwnProperty()的检查,并将返回通过原型链继承的属性。它还没有解释 Internet Explorer 中著名的 DontEnum 错误,其中原型链上的不可枚举属性导致本地声明的同名属性继承了它们的 DontEnum 属性。
实施Object.keys()将为您提供更强大的解决方案。
编辑:在最近与Prototype的著名贡献者kangax进行讨论之后,我根据此处Object.forIn()
找到的函数代码实现了 DontEnum 错误的解决方法。
请注意,Firefox 4、Chrome 6、Safari 5、IE 9 及更高版本支持 Object.keys 和其他 ECMAScript 5 方法。
例如:
var o = {"foo": 1, "bar": 2};
alert(Object.keys(o));
ECMAScript 5 兼容性表:http : //kangax.github.com/es5-compat-table/
新方法说明:http : //markcaudill.com/index.php/2009/04/javascript-new-features-ecma5/
Object.getOwnPropertyNames(obj)
除了由 显示的属性外,此函数还显示不可枚举的属性Object.keys(obj)
。
在 JS 中,每个属性都有一些属性,包括一个 boolean enumerable
。
一般而言,不可枚举的属性更“内在”且不常使用,但有时查看它们以了解真正发生的事情是很有见地的。
例子:
var o = Object.create({base:0})
Object.defineProperty(o, 'yes', {enumerable: true})
Object.defineProperty(o, 'not', {enumerable: false})
console.log(Object.getOwnPropertyNames(o))
// [ 'yes', 'not' ]
console.log(Object.keys(o))
// [ 'yes' ]
for (var x in o)
console.log(x)
// yes, base
还要注意如何:
Object.getOwnPropertyNames
并且Object.keys
不要上原型链去寻找base
for in
做更多关于原型链的信息:https : //stackoverflow.com/a/23877420/895245