Стандартная реализация объекта ( ES5.1 «Внутренние свойства и методы объекта» ) не требует Object
отслеживания количества ключей / свойств, поэтому не должно быть стандартного способа определения размера Object
без явной или неявной итерации его ключей.
Итак, вот наиболее часто используемые альтернативы:
1. ECMAScript Object.keys ()
Object.keys(obj).length;
Работает путем внутренней перебора ключей для вычисления временного массива и возвращает его длину.
- Плюсы - Читаемый и чистый синтаксис. Не требуется никакой библиотеки или пользовательского кода, кроме прокладки, если встроенная поддержка недоступна
- Минусы - накладные расходы памяти из-за создания массива.
2. Библиотечные решения
Многие основанные на библиотеках примеры в других разделах этой темы являются полезными идиомами в контексте их библиотеки. Однако с точки зрения производительности выиграть нечего по сравнению с идеальным кодом без библиотеки, поскольку все эти библиотечные методы на самом деле инкапсулируют либо цикл for, либо ES5 Object.keys
(нативный или отстраненный).
3. Оптимизация цикла for
Самая медленная часть такого цикла for - это обычно .hasOwnProperty()
вызов из-за накладных расходов на вызов функции. Поэтому, когда мне просто нужно количество записей в объекте JSON, я просто пропускаю .hasOwnProperty()
вызов, если знаю, что ни один код не расширялся и не будет расширяться Object.prototype
.
В противном случае ваш код можно было бы немного оптимизировать, сделав k
local ( 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;
Является ли это быстрее или нет в данной среде - это вопрос сравнительного анализа. В любом случае можно ожидать очень ограниченного прироста производительности.