计算对象的键/财产数的最快方法是什么?是否可以在不迭代对象的情况下执行此操作?即,不做:

var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) ++count;

(Firefox确实提供了一个神奇的__count__属性,但在版本4左右,这个属性被删除了。)


当前回答

要在任何ES5兼容环境中执行此操作,如Node.js、Chrome、Internet Explorer 9+、Firefox 4+或Safari 5+:

Object.keys(obj).length

浏览器兼容性Object.keys文档(包括可以添加到非ES5浏览器的方法)

其他回答

要在任何ES5兼容环境中执行此操作,如Node.js、Chrome、Internet Explorer 9+、Firefox 4+或Safari 5+:

Object.keys(obj).length

浏览器兼容性Object.keys文档(包括可以添加到非ES5浏览器的方法)

我尝试让它对所有对象都可用,如下所示:

Object.defineProperty(Object.prototype,
                      "length",
                      {
                          get() {
                              if (!Object.keys) {
                                  Object.keys = function (obj) {
                                      var keys = [],k;
                                      for (k in obj) {
                                          if (Object.prototype.hasOwnProperty.call(obj, k)) {
                                              keys.push(k);
                                          }
                                      }
                                      return keys;
                                  };
                              }
                              return Object.keys(this).length;
                      },});

console.log({"Name":"Joe", "Age":26}.length) // Returns 2

如果你使用Undercore.js,你可以使用_.size(谢谢douwe):

_.size(obj)

或者,您也可以使用_.keys,这对某些人来说可能更清晰:

_.keys(obj).length

我强烈推荐Undercore.js。它是一个非常紧凑的库,可以做很多基本的事情。只要可能,它们都匹配ECMAScript 5,并遵循本机实现。

否则,我支持Avi Flax的回答。我编辑了它以添加到MDC文档的链接,其中包括可以添加到非ECMAScript 5浏览器的key()方法。

OP没有指定对象是否为nodeList。如果是,那么可以直接对其使用长度方法。例子:

buttons = document.querySelectorAll('[id=button)) {
console.log('Found ' + buttons.length + ' on the screen');

对于项目中有ExtJS 4的用户,您可以执行以下操作:

Ext.Object.getSize(myobj);

这样做的优点是它可以在所有兼容ExtJS的浏览器上工作(包括InternetExplorer6和InternetExplorer8)。然而,我认为运行时间并不比O(n)好,正如其他建议的解决方案一样。