Standardowa implementacja obiektu ( ES5.1 Object Internal Properties and Methods ) nie wymaga Object
śledzenia liczby kluczy / właściwości, dlatego nie powinno być standardowego sposobu określania wielkości Object
bez jawnego lub niejawnego iterowania kluczy.
Oto najczęściej stosowane alternatywy:
1. Object.keys () w ECMAScript
Object.keys(obj).length;
Działa poprzez wewnętrzne iterowanie po klawiszach w celu obliczenia tablicy tymczasowej i zwraca jej długość.
- Plusy - czytelna i czysta składnia. Nie wymaga biblioteki ani niestandardowego kodu, z wyjątkiem podkładki, jeśli natywna obsługa jest niedostępna
- Wady - narzut pamięci związany z tworzeniem tablicy.
2. Rozwiązania oparte na bibliotece
Wiele przykładów opartych na bibliotece gdzie indziej w tym temacie to przydatne idiomy w kontekście ich biblioteki. Jednak z punktu widzenia wydajności nie ma nic do zyskania w porównaniu z doskonałym kodem bez biblioteki, ponieważ wszystkie te metody biblioteczne faktycznie otaczają pętlę for lub ES5 Object.keys
(natywną lub shimmed ).
3. Optymalizacja pętli for
Najwolniej część takiej dla pętli jest na ogół .hasOwnProperty()
wywołania z powodu obciążania wywołaniu funkcji. Kiedy więc chcę tylko liczby wpisów obiektu JSON, po prostu pomijam .hasOwnProperty()
wywołanie, jeśli wiem, że żaden kod nie był ani nie będzie rozszerzany Object.prototype
.
W przeciwnym razie twój kod może być bardzo nieznacznie zoptymalizowany poprzez utworzenie k
local ( var k
) i użycie operatora increment-increment ( ++count
) zamiast postfix.
var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
Kolejny pomysł polega na buforowaniu hasOwnProperty
metody:
var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;
To, czy jest to szybsze, czy nie w danym środowisku, jest kwestią testu porównawczego. W każdym razie można oczekiwać bardzo ograniczonego wzrostu wydajności.