Implementasi Objek standar ( ES5.1 Objek Properti dan Metode Internal ) tidak memerlukan Object
untuk melacak jumlah kunci / properti, sehingga tidak boleh ada cara standar untuk menentukan ukuran Object
tanpa berulang-ulang atau tersirat secara implisit atas kunci-kuncinya.
Jadi di sini adalah alternatif yang paling umum digunakan:
1. ECMAScript's Object.keys ()
Object.keys(obj).length;
Bekerja dengan pengulangan internal atas kunci untuk menghitung array sementara dan mengembalikan panjangnya.
- Pro - Sintaks yang mudah dibaca dan bersih. Tidak perlu pustaka atau kode khusus kecuali shim jika dukungan asli tidak tersedia
- Kontra - Memori overhead karena penciptaan array.
2. Solusi berbasis perpustakaan
Banyak contoh berbasis perpustakaan di tempat lain dalam topik ini adalah idiom yang berguna dalam konteks perpustakaan mereka. Dari sudut pandang kinerja, bagaimanapun, tidak ada untungnya dibandingkan dengan kode tanpa pustaka yang sempurna karena semua metode pustaka tersebut benar-benar merangkum for-loop atau ES5 Object.keys
(asli atau shimmed).
3. Mengoptimalkan for-loop
Bagian paling lambat dari for-loop umumnya adalah .hasOwnProperty()
panggilan, karena fungsi panggilan overhead. Jadi ketika saya hanya ingin jumlah entri objek JSON, saya hanya melewatkan .hasOwnProperty()
panggilan jika saya tahu bahwa tidak ada kode yang juga tidak akan diperpanjang Object.prototype
.
Kalau tidak, kode Anda bisa sangat sedikit dioptimalkan dengan membuat k
local ( var k
) dan dengan menggunakan pre-increment operator ( ++count
) alih-alih postfix.
var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
Gagasan lain bergantung pada caching hasOwnProperty
metode:
var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;
Apakah ini lebih cepat atau tidak pada lingkungan tertentu adalah masalah pembandingan. Bagaimanapun juga, perolehan kinerja yang sangat terbatas dapat diharapkan.