czy istnieje preferowana metoda określania, czy element ma przypisaną klasę, z punktu widzenia wydajności?
$('#foo').hasClass('bar');
lub
$('#foo').is('.bar');
czy istnieje preferowana metoda określania, czy element ma przypisaną klasę, z punktu widzenia wydajności?
$('#foo').hasClass('bar');
lub
$('#foo').is('.bar');
Odpowiedzi:
Popełniłem test po komentarzu i czterech pozytywnych głosach za bardzo komentarz. Okazuje się, że to, co powiedziałem, jest poprawną odpowiedzią. Oto wynik:

http://jsperf.com/hasclass-vs-is-so
isJest wielofunkcyjny, można na przykład zrobić is('.class'), is(':checked')itp, które środki isma więcej do zrobienia , gdzie jest hasClassograniczona, który sprawdza tylko bytem zestaw klasy, czy nie.
Dlatego hasClasspowinno być szybsze, jeśli priorytetem jest wydajność na jakimkolwiek poziomie.
hasClass jest dużo szybszy.
Ponieważ isjest bardziej ogólny niż hasClassi używa filterdo przetwarzania podanego wyrażenia, wydaje się prawdopodobne, że hasClassjest szybszy.
Uruchomiłem następujący kod z konsoli Firebug:
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();
Mam:
Nie jest to duża różnica, ale może być istotna, jeśli wykonujesz dużo testów.
EDYTUJ, kiedy mówię `` nie jest to wielka różnica, chodzi mi o to, że musisz zrobić 10000 cykli, aby zobaczyć 0,8 sekundy różnicy. Zdziwiłbym się, widząc aplikację internetową, w której przełączenie się z na isdo hasClassspowodowałoby znaczną poprawę ogólnej wydajności. Jednak przyznaję, że jest to 35% poprawa szybkości.
Oba powinny być dość zbliżone pod względem wydajności, ale $('#foo').hasClass('bar');wydają mi się bardziej czytelne i poprawne semantycznie.