jQuery .hasClass () ve .is ()


96

Performans açısından bir öğeye bir sınıf atanıp atanmadığını belirlemenin tercih edilen bir yöntemi var mı?

$('#foo').hasClass('bar');

veya

$('#foo').is('.bar');

6
Bu sitede ve birden çok tarayıcıda performansı her zaman doğrulayabilirsiniz: jsperf.com ... Bunlar, göz atabileceğiniz
iwasrobbed

Yanıtlar:


164

Güncelleme:

Bir yorumu ve dört yoruma oy verdikten sonra bir test yaptım. Söylediğim şeyin doğru cevap olduğu ortaya çıktı. İşte sonuç:

görüntü açıklamasını buraya girin

http://jsperf.com/hasclass-vs-is-so


Bu is, çok amaçlıdır, örneğin yapabilirsiniz is('.class'), is(':checked')vb. Bu , sınırlı olduğu yerde yapılacak daha çokis şeyin olduğu anlamına gelir ;hasClass

Bu nedenle, hasClassherhangi bir düzeyde performans önceliğinizse daha hızlı olmalıdır.


7
Daha hızlı olduğuna dair kanıtınız var mı? Bir işlevin daha az işleve sahip olması, otomatik olarak daha hızlı olduğu anlamına gelmez.
Kris

15
@Kris: Evet yaparım: jsperf.com/hasclass-vs-is-so . Dediğim gibi hasClass , çok daha hızlı.
Sarfraz

4
'çok daha hızlı' => 'çok daha hızlı'
Kirk Strobeck

@SgtPooki, sadece kanıt istiyordum; eğer doğruysa nedenini bilmek istedim. Ben böyle meraklıyım :). Kolayca daha fazla işleve sahip olabilir ve daha hızlı olmasını sağlayabilirsiniz; her zaman uygulamaya bağlıdır. % 99'unuz kapsamlı bir genellemedir ve yazılım geliştirmenin gerçek durumu olması gerekmez. "JQuery, düz JavaScript kadar hızlı olacak mı? Hayır dışında bir yanıt yanlıştır." iyi bir soru değil; jQuery, veriler önbelleğe alındığında DOM öğelerine daha hızlı erişim sağlayacak pek çok optimizasyona sahiptir; bu gerçekten sizin özel kullanımınıza bağlıdır.
Kris

1
@SgtPooki, cızırtılı seçme motoruna daha hızlı bir şekilde bakın; bahsetmeye devam ettiğim için, uygulamaya bağlıdır ve sorguları yerel olarak desteklemeyen eski tarayıcılarda, yerel sürüm olmadığı için jQuery'nin uygulanmasıyla büyük olasılıkla daha hızlı olacaktır (varsayılan olarak kazan). Ayrıca, tarayıcıya ve sürüme bağlı olarak aynı DOM öğelerini geri çağırmaya devam ediyorsanız, jQuery'nin daha hızlı erişim için bu öğeyi önbelleğe alabilmesi daha fazla zaman alabilir. Tipik olarak yerel JavaScript işlevleri daha hızlı olacaktır; ancak tarayıcı desteğine ve uygulanmasına bağlıdır.
Kris

13

Yana isdaha geneldir hasClassve kullanımları filtersağlanan ifadesini işlemek için, gibi görünmektedir hasClasshızlıdır.

Firebug konsolundan aşağıdaki kodu çalıştırdım:

function usingIs() {
for (var i=0; i<10000;i++) {
 $('div#example-0').is('.test');
}
}

function usingHas(){
for (var i=0; i<10000;i++) {
 $('div#example-0').hasClass('test');
}
}

usingIs();
usingHas();

Bende var:

  • usingIs: 3191.663 ms
  • kullanmaHas: 2362.523ms

Çok büyük bir fark değil, ancak çok sayıda test yapıyorsanız alakalı olabilir .

DÜZENLEME 'çok büyük bir fark değil, benim açımdan, 0,8 saniyelik bir fark görmek için 10000 döngü yapmanız gerektiğidir. Ben geçiş öyle ki bir web uygulaması görmeye şaşıracaksınız isiçin hasClasstüm performans üzerinde önemli bir gelişme görecekti. Ancak, bunun hızda% 35'lik bir gelişme olduğunu kabul ediyorum.


9

Her ikisi de performans açısından oldukça yakın olmalı ama $('#foo').hasClass('bar');bana daha okunaklı ve anlamsal olarak doğru görünüyor.


7

.hasClassçok daha hızlıdır .is Sen onu test edebilirsiniz burada . Test durumunu kendinize göre değiştirin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.