Стандартна реалізація об'єкта ( ES5.1 Object Internal Properties and Methods ) не вимагає Object
відстежувати його кількість ключів / властивостей, тому не повинно бути стандартного способу визначення розміру Object
без чітко або неявно ітерації над його ключами.
Ось ось найчастіше використовувані альтернативи:
1. Object.keys ECMAScript ()
Object.keys(obj).length;
Працює шляхом внутрішньої ітерації ключів для обчислення тимчасового масиву та повертає його довжину.
- Плюси - читаний і чистий синтаксис. Ніяка бібліотека чи спеціальний код не потрібен, за винятком shim, якщо нативна підтримка не доступна
- Мінуси - накладні витрати на пам'ять за рахунок створення масиву.
2. Бібліотечні рішення
Багато прикладів, заснованих на бібліотеці в інших місцях цієї теми, є корисними ідіомами в контексті їх бібліотеки. З точки зору продуктивності, однак, нічого виграти в порівнянні з ідеальним кодом без бібліотеки, оскільки всі ці методи бібліотеки насправді інкапсулюють або цикл for-циклу, або ES5 Object.keys
(рідний або прошитий).
3. Оптимізація циклу 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;
Це швидше чи ні в даному середовищі - це питання бенчмаркінгу. У будь-якому випадку можна очікувати дуже обмеженого підвищення продуктивності.