2015-05-19 14 views
7
// hasOwnProperty approach 
for (key in obj) { 
    if (obj.hasOwnProperty(key)) { 
    value = obj[key]; 
    } 
} 

// Object.keys approach 
keys = Object.keys(obj); 
for (i = 0, l = keys.length; i < l; i++) { 
    value = obj[keys[i]]; 
} 

50% + Neden bu http://jsperf.com/object-keys-vs-hasownproperty/45Object.keys neden hasOwnProperty'den daha hızlıdır? jsperf Object.keys yaklaşıma göre

olduğunu hızlıdır?

+0

Testiniz beklediğiniz gibi olmayabilir, basit bir optimizasyon yapar: 'keys = Object.keys (obj); değer = obj [keys [keys.length - 1]]; 'döngüleri atlayarak. İlk testte, her döngüde bir kontrol yapar, ikincisi sadece – Hacketo

+0

değeri ile bir değişken doldurmaktır. Belli ki 'in' dizisi 'Object.keys'den daha fazlasını yapmalı ve ek olarak hasOwnProperty için filtrelemelidir. 'daha fazla iş var. – Bergi

+1

Belki 'Object.keys' yalnızca bir kez çağrılırken, 'hasOwnProperty' adlı defalarca çağrılır (bir kez her sayılabilir özellik için bir kez ve her bir sayısız özelliği için bir kez). Daha fazla işlev çağrısı daha yavaş kod anlamına gelir. Ayrıca, 'Object.keys' yerel bir işlevdir. Bu nedenle, her olasılıkta, aynı bir JavaScript şemasından daha hızlıdır. –

cevap

34
  • Object.keys tüm kendi, enumerable özelliklerinin arar (oh ve diziler hızlıdır).
  • for in ayrıca kalıtsal enumerable özelliklerinin, sadece kendi olanlar
  • for in + hasOwnProperty ayrıca hepsi kendi özellikleri olup olmadığını özelliklerini baktı testleri
  • arar.

Kalıtsal sayısız özellik bulunmasa bile, yapmamak için daha fazla iş vardır.

+2

Cevabınız temiz ve anlaşılması kolay. –

1

Bu iş parçacığı sınamalarının çoğunun, Object.keys()'dan daha hızlı olması için hasownproperty gösterilmektedir. Ancak, bu testler için, devir yapılacak özelliklerin miktarı küçüktür (< 20 özellikleri).

Nesne özelliklerinin sayısı büyükse (tam sayı yok,> 100 tuşuyla yapılan sınamalar net bir kazanan olarak Object.keys() gösterdi), Object.keys() bunu atıyor.

Bkz. https://jsperf.com/object-keys-vs-hasownproperty/55. Tüm revizyonları test etmek için sayfanın altına gidebilirsiniz.

+0

Anlaşmanın ne olduğunu bilmiyorum ama 47 numaralı revizyonla başlayarak 'hasOwnProperty' in en hızlı olduğunu gösteriyor. 9,809,798 vs 3,712,304. – blissfool

İlgili konular