jQuery .hasClass () проти .is ()


96

чи є кращий метод визначення того, чи елементу присвоєно клас, з точки зору продуктивності?

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

або

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

6
Ви завжди можете перевірити ефективність на цьому сайті, а також у кількох браузерах: jsperf.com ... Ось кілька тестових випадків для перегляду: jsperf.com/browse
iwasrobbed

Відповіді:


164

Оновлення:

Я провів тест після коментаря та чотирьох голосів за дуже коментар. Виявляється, що сказане мною - правильна відповідь. Ось результат:

введіть тут опис зображення

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


Він isє багатоцільовим, ви можете, наприклад, робити is('.class'), is(':checked')тощо, що означає, isщо потрібно робити більше, де hasClassобмежено, що перевіряє лише встановлений клас чи ні.

Отже, це hasClassмає бути швидше, якщо продуктивність на будь-якому рівні є вашим пріоритетом.


7
Чи є у вас доказ, що це швидше? Те, що функція має меншу функціональність, НЕ означає, що вона автоматично швидша.
Kris

15
@Kris: Так, я роблю: jsperf.com/hasclass-vs-is-so . Як я вже сказав, hasClass це набагато швидше.
Сарфраз

4
'набагато швидше' => 'набагато швидше'
Кірк Штробек,

@SgtPooki, я просто просив доказ; якщо це правда, я хотів би знати, чому. Я такий допитливий :). Ви можете легко мати більше функціональних можливостей і зробити це швидшим; це завжди залежить від реалізації. Ваші 99% - це широке узагальнення і не обов’язково справжній стан розробки програмного забезпечення. Ваше запитання "Чи буде jQuery коли-небудь швидким, як прямий JavaScript? Відповідь, яка не є, не є помилковою". не є гарним питанням; jQuery насправді має багато оптимізацій, за допомогою яких забезпечується швидший доступ до елементів DOM після кешування даних; це насправді залежить від вашого конкретного використання.
Kris

1
@SgtPooki, наскільки швидше, погляньте на двигун вибору шиплячі; оскільки я продовжую згадувати, це залежить від реалізації, а в старих браузерах, які не підтримують запити, швидше за все, це буде швидше завдяки реалізації jQuery, оскільки немає власної версії (виграти за замовчуванням). Крім того, якщо ви продовжуєте згадувати ті самі елементи DOM, залежно від браузера та версії, може знадобитися додатковий час, коли як jQuery може кешувати цей елемент для швидшого пошуку. Зазвичай власні функції JavaScript будуть швидшими; але це залежить від підтримки та реалізації браузера.
Kris

13

Оскільки isє більш загальним, ніж hasClassвикористовується filterдля обробки наданого виразу, мабуть, hasClassце швидше.

Я запустив такий код із консолі 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();

Я отримав:

  • usingIs: 3191.663ms
  • usingHas: 2362.523ms

Не величезна різниця, але може бути доречною, якщо ви проводите багато тестів.

EDIT, коли я кажу `` не величезна різниця, я хочу сказати, що вам потрібно зробити 10000 циклів, щоб побачити 0,8 с різниці. Я був би здивований, побачивши веб-додаток такий, що при переході з isна hasClassсистему значно покращиться ефективність роботи. Однак я погоджуюсь, що це на 35% покращення швидкості.


9

І те й $('#foo').hasClass('bar');інше повинно бути досить близьким з точки зору продуктивності, але здається мені більш зрозумілим і семантично правильним.


7

.hasClassнабагато швидше, ніж .is Ви можете протестувати звідси . Змініть тестовий випадок відповідно до вас.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.