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

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

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

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

当前回答

在ES6及后续版本(ECMAScript 2015)中,你可以获得所有属性,如下所示:

let keys = Object.keys(myObject);

如果你想列出所有的值

let values = Object.keys(myObject).map(key => myObject[key]);

其他回答

在现代浏览器(IE9+, FF4+, Chrome5+, Opera12+, Safari5+)中,您可以使用内置的Object。键的方法:

var keys = Object.keys(myObject);

上面有一个完整的填充,但一个简化的版本是:

var getKeys = function(obj){
   var keys = [];
   for(var key in obj){
      keys.push(key);
   }
   return keys;
}

或者将var getKeys替换为object. prototype.keys,以允许你在任何对象上调用.keys()。扩展原型有一些副作用,我不建议这么做。

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

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

例如:

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

ECMAScript 5兼容性表

新方法描述

使用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()]

Mozilla有完整的实现细节,关于如何在不支持它的浏览器中实现它,如果这有帮助的话:

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;
    };
  })();
}

你可以把它包括在你喜欢的任何地方,但可能是在脚本堆栈顶部的某种extensions.js文件中。