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

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');

其他回答

这对数组和对象都有效

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

以下是三种方法的一些性能测试;

https://jsperf.com/get-the-number-of-keys-in-an-object

对象.keys().length

每秒20735次操作

它非常简单和兼容,运行速度快但成本高昂,因为它创建了一个新的密钥数组,然后将其丢弃。

return Object.keys(objectToRead).length;

循环键

每秒15734次操作

let size=0;
for(let k in objectToRead) {
  size++
}
return size;

它稍微慢一点,但与内存使用量相差甚远,因此如果您对移动或其他小型机器的优化感兴趣,它可能会更好。

使用贴图而不是对象

每秒953839338次操作

return mapToRead.size;

基本上,Map跟踪自己的大小,所以我们只返回一个数字字段。它比任何其他方法都快得多。如果可以控制对象,请将其转换为贴图。

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;

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

$(Object.Item).length