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

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

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


当前回答

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

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

其他回答

您可以使用以下代码:

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

然后,您也可以在较旧的浏览器中使用此功能:

var len = Object.keys(obj).length;

如果您真的遇到了性能问题,我建议使用一个函数包装在对象中添加/删除财产的调用,该函数还可以增加/减少适当命名的(size?)属性。

您只需计算一次财产的初始数量,然后再继续。如果没有实际的性能问题,就不用麻烦了。只需将这段代码包装在getNumberOfProperties(对象)函数中,然后使用它即可。

您可以使用:

Object.keys(objectName).length; 

and

Object.values(objectName).length;

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

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

来自Object.defineProperty():

Object.defineProperty(obj、prop、描述符)

您可以将其添加到所有对象:

Object.defineProperty(Object.prototype, "length", {
    enumerable: false,
    get: function() {
        return Object.keys(this).length;
    }
});

或单个对象:

var myObj = {};
Object.defineProperty(myObj, "length", {
    enumerable: false,
    get: function() {
        return Object.keys(this).length;
    }
});

例子:

var myObj = {};
myObj.name  = "John Doe";
myObj.email = "leaked@example.com";
myObj.length; // Output: 2

通过这种方式添加,它不会在中显示。。在循环中:

for(var i in myObj) {
    console.log(i + ": " + myObj[i]);
}

输出:

name: John Doe
email: leaked@example.com

注意:它在Internet Explorer 9之前的浏览器中不起作用。