Primeiro, os fatos:
if (booleanValue)
Satisfará a if
declaração para qualquer valor verdadeiro de booleanValue
inclusão true
, qualquer número diferente de zero, qualquer valor de string não vazio, qualquer referência a objeto ou matriz, etc ...
Por outro lado:
if (booleanValue === true)
Isso só satisfará a if
condição se booleanValue
for exatamente igual a true
. Nenhum outro valor verdadeiro o satisfará.
Por outro lado, se você fizer isso:
if (someVar == true)
Em seguida, o que o Javascript fará é digitar coerce true
para corresponder ao tipo de someVar
e comparar as duas variáveis. Existem muitas situações em que isso provavelmente não é o que se pretenderia. Por isso, na maioria dos casos, você deseja evitar, ==
porque há um conjunto de regras bastante longo sobre como o Javascript digitar coagirá duas coisas para serem do mesmo tipo e, a menos que você entenda todas essas regras e possa antecipar tudo o que o interpretador JS pode fazer quando dados dois tipos diferentes (que a maioria dos desenvolvedores de JS não pode), você provavelmente deseja evitar ==
completamente.
Como um exemplo de quão confuso pode ser:
var x;
x = 0;
console.log(x == true); // false, as expected
console.log(x == false); // true as expected
x = 1;
console.log(x == true); // true, as expected
console.log(x == false); // false as expected
x = 2;
console.log(x == true); // false, ??
console.log(x == false); // false
Para o valor 2
, você pensaria que 2
é um valor verdadeiro para que ele se comparasse favoravelmente com true
, mas não é assim que a coerção de tipos funciona. Ele está convertendo o valor da mão direita para coincidir com o tipo do valor da mão esquerda e, portanto, está convertendo true
para o número, 1
para comparar, o 2 == 1
que certamente não é o que você provavelmente pretendia.
Então, cuidado com o comprador. Provavelmente, é melhor evitar isso ==
em quase todos os casos, a menos que você saiba explicitamente os tipos que irá comparar e saiba como todos os algoritmos de coerção de tipos possíveis funcionam.
Portanto, depende realmente dos valores esperados booleanValue
e de como você deseja que o código funcione. Se você sabe de antemão que isso só terá um valor true
ou false
, compare-o explicitamente com
if (booleanValue === true)
é apenas código extra e desnecessário e
if (booleanValue)
é mais compacto e sem dúvida mais limpo / melhor.
Se, por outro lado, você não sabe o que booleanValue
pode ser e deseja testar se está realmente definido como true
sem outras conversões de tipo automáticas permitidas,
if (booleanValue === true)
não é apenas uma boa ideia, mas necessária.
Por exemplo, se você observar a implementação .on()
no jQuery, ele terá um valor de retorno opcional. Se o retorno de chamada retornar false
, o jQuery interromperá automaticamente a propagação do evento. Nesse caso específico, como o jQuery deseja interromper a propagação SOMENTE se false
for retornado, eles verificam a explicitação do valor de retorno === false
porque não querem undefined
ou 0
ou""
ou qualquer outra coisa que automaticamente converta o tipo em falso para também satisfazer a comparação.
Por exemplo, aqui está o código de retorno de chamada de manipulação de evento jQuery:
ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );
if ( ret !== undefined ) {
event.result = ret;
if ( ret === false ) {
event.preventDefault();
event.stopPropagation();
}
}
Você pode ver que o jQuery está procurando explicitamente ret === false
.
Porém, também existem muitos outros lugares no código jQuery em que uma verificação mais simples é apropriada, dado o desejo do código. Por exemplo:
// The DOM ready check for Internet Explorer
function doScrollCheck() {
if ( jQuery.isReady ) {
return;
}
...