existe um método preferido para determinar se um elemento é atribuído a uma classe, do ponto de vista de desempenho?
$('#foo').hasClass('bar');
ou
$('#foo').is('.bar');
existe um método preferido para determinar se um elemento é atribuído a uma classe, do ponto de vista de desempenho?
$('#foo').hasClass('bar');
ou
$('#foo').is('.bar');
Respostas:
Eu cometi um teste após um comentário e quatro votos positivos para o próprio comentário. Acontece que o que eu disse é a resposta correta. Aqui está o resultado:
http://jsperf.com/hasclass-vs-is-so
O is
é multiuso, você pode, por exemplo is('.class')
, fazer is(':checked')
, etc, o que significa que is
tem mais a fazer onde estáhasClass
é limitado, que só verifica se uma classe está definida ou não.
Portanto, hasClass
deve ser mais rápido se o desempenho em qualquer nível for sua prioridade.
hasClass
é bem mais rápido.
Uma vez que is
é mais genérico do que hasClass
e usa filter
para processar a expressão fornecida, parece provável quehasClass
seja mais rápido.
Executei o seguinte código no console do 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();
Eu tenho:
Não é uma grande diferença, mas pode ser relevante se você estiver fazendo muito testes.
EDIT quando eu digo 'não é uma grande diferença, meu ponto é que você precisa fazer 10.000 ciclos para ver 0,8s de diferença. Eu ficaria surpreso em ver um aplicativo da web em que mudar de is
para hasClass
veria uma melhoria significativa no desempenho geral. No entanto, admito que se trata de uma melhoria de 35% na velocidade.
Ambos devem ser muito próximos em termos de desempenho, mas $('#foo').hasClass('bar');
parecem mais legíveis e semanticamente corretos para mim.