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

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

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


当前回答

来自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之前的浏览器中不起作用。

其他回答

如Avi Flax所述,

Object.keys(obj).length

将对对象上的所有可枚举财产执行此操作,但要同时包含非可枚举财产,您可以改用object.getOwnPropertyNames。区别如下:

var myObject = new Object();

Object.defineProperty(myObject, "nonEnumerableProp", {
  enumerable: false
});
Object.defineProperty(myObject, "enumerableProp", {
  enumerable: true
});

console.log(Object.getOwnPropertyNames(myObject).length); //outputs 2
console.log(Object.keys(myObject).length); //outputs 1

console.log(myObject.hasOwnProperty("nonEnumerableProp")); //outputs true
console.log(myObject.hasOwnProperty("enumerableProp")); //outputs true

console.log("nonEnumerableProp" in myObject); //outputs true
console.log("enumerableProp" in myObject); //outputs true

如这里所述,这与Object.keys具有相同的浏览器支持。

然而,在大多数情况下,您可能不希望在这些类型的操作中包含非数值,但了解它们的区别总是很好的;)

如果前面答案中的jQuery不起作用,请尝试

$(Object.Item).length

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

Ext.Object.getSize(myobj);

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

这对数组和对象都有效

//count objects/arrays
function count(obj){
        return Object.keys(obj).length
     }

使用循环计数对象/数组

function count(obj){
        var x=0;
        for(k in obj){
          x++;
         }
      return x;
     }

计数对象/数组以及字符串的长度

function count(obj){
        if (typeof (obj) === 'string' || obj instanceof String)
        {
          return obj.toString().length;   
        }
        return Object.keys(obj).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