如何有效地计算JavaScript中对象的键/属性数?

时间:2020-03-06 14:38:59  来源:igfitidea点击:

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

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

(Firefox确实提供了一个神奇的__count__属性,但是此属性已在版本4的某个位置删除。)

解决方案

我认为这是不可能的(至少在不使用某些内部组件的情况下是不可能的)。而且我认为通过优化它不会带来任何好处。

如果我们实际上遇到了性能问题,建议我们使用一个函数来包装向对象添加属性或者从对象中删除属性的调用,该函数还要增加/减少适当命名的(size?)属性。

我们只需要计算一次属性的初始数量,然后从那里继续前进。如果没有实际的性能问题,请不要打扰。只需将这段代码包装在函数getNumberOfProperties(object)中并完成它即可。

我不知道有什么方法可以这样做,但是为了将迭代次数降到最低,我们可以尝试检查__count__的存在,如果不存在(例如Firefox),可以在对象并定义它以供以后使用,例如:

if (myobj.__count__ === undefined) {
  myobj.__count__ = ...
}

这样,任何支持__count__的浏览器都将使用它,并且只会对那些不支持________的浏览器执行迭代。如果计数发生变化而我们不能执行此操作,则可以始终使它成为一个函数:

if (myobj.__count__ === undefined) {
  myobj.__count__ = function() { return ... }
  myobj.__count__.toString = function() { return this(); }
}

这样,无论何时引用myobj。count`函数都会触发并重新计算。