假设我这样创建一个对象:

var myObject =
        {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

检索属性名列表的最佳方法是什么?例如,我想以一些变量“键”结束,这样:

keys == ["ircEvent", "method", "regex"]

当前回答

使用Reflect.ownKeys ()

var obj = {a: 1, b: 2, c: 3};
Reflect.ownKeys(obj) // ["a", "b", "c"]

对象。键和对象。getOwnPropertyNames不能获得不可枚举的属性。它甚至适用于不可枚举的属性。

var obj = {a: 1, b: 2, c: 3};
obj[Symbol()] = 4;
Reflect.ownKeys(obj) // ["a", "b", "c", Symbol()]

其他回答

如果你只是想获取元素,而不是函数,那么这段代码可以帮助你

this.getKeys = function() {

    var keys = new Array();
    for(var key in this) {

        if( typeof this[key] !== 'function') {

            keys.push(key);
        }
    }
    return keys;
}

这是我的HashMap实现的一部分,我只想要键,“this”是包含键的HashMap对象

正如Sam Dutton回答的那样,ECMAScript第5版引入了一种新的方法。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错误的解决方案。

Object.getOwnPropertyNames (obj)

除了Object.keys(obj)所显示的属性外,该函数还显示不可枚举的属性。

在JS中,每个属性都有几个属性,包括一个布尔枚举。

一般来说,不可枚举的属性更“内在化”,使用也更少,但有时深入研究它们以了解真正发生的事情是很有见地的。

例子:

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(种(o)) // ['yes'] For (var x in o) console.log (x) //是的,base

还要注意如何:

对象。getOwnPropertyNames和Object。钥匙不是沿着原型链往上找底座的 For in

更多关于原型链的信息,请访问:https://stackoverflow.com/a/23877420/895245

因为我几乎在每个项目中都使用了underscore.js,所以我会使用keys函数:

var obj = {name: 'gach', hello: 'world'};
console.log(_.keys(obj));

它的输出将是:

['name', 'hello']

注意Object。Firefox 4、Chrome 6、Safari 5、IE 9及以上版本均支持key和其他ECMAScript 5方法。

例如:

var o = {"foo": 1, "bar": 2}; 
alert(Object.keys(o));

ECMAScript 5兼容性表

新方法描述