Стандартная реализация объекта ( ES5.1. Внутренние свойства и методы объекта ) не требует Object
для отслеживания количества ключей / свойств, поэтому не должно быть стандартного способа определения размера. Object
без явного или неявного перебора его ключей.
Итак, вот наиболее часто используемые альтернативы:
1. Object.keys ()
ECMAScript
Object.keys(obj).length;
Работает внутренне перебирает ключи для вычисления временного массива и возвращает его длину.
- Плюсы - Читаемый и понятный синтаксис. Библиотека или пользовательский код не требуются, за исключением прокладки, если встроенная поддержка недоступна
- Минусы - Переполнение памяти из-за создания массива.
2. Библиотечные решения
Многие библиотечные примеры в других разделах этой темы являются полезными идиомами в контексте их библиотеки. С точки зрения производительности, однако, выиграть нечего по сравнению с идеальным кодом без библиотеки, поскольку все эти библиотечные методы на самом деле инкапсулируют либо цикл for, либо ES5 Object.keys
(собственный или с шиммированием).
3. Оптимизация цикла for
Самая медленная часть такого цикла for обычно является вызовом .hasOwnProperty()
из-за накладных расходов на вызов функции. Поэтому, когда мне просто нужно количество записей в объекте JSON, я просто пропускаю вызов .hasOwnProperty()
, если знаю, что ни один код не выполнял и не будет расширять Object.prototype
.
В противном случае ваш код можно было бы немного оптимизировать, сделав k
локальным (var k
) и используя вместо префикса оператор увеличения префикса (++count
).
var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
Другая идея заключается в кэшировании метода hasOwnProperty
:
var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;
Является ли это быстрее или нет в данной среде - это вопрос сравнительного анализа. В любом случае можно ожидать очень ограниченного прироста производительности.