Primeiro, os fatos:
if (booleanValue)
Satisfará a ifdeclaração para qualquer valor verdadeiro de booleanValueinclusã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 ifcondição se booleanValuefor 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 truepara corresponder ao tipo de someVare 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 truepara o número, 1para comparar, o 2 == 1que 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 booleanValuee de como você deseja que o código funcione. Se você sabe de antemão que isso só terá um valor trueou 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 booleanValuepode ser e deseja testar se está realmente definido como truesem 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 falsefor retornado, eles verificam a explicitação do valor de retorno === falseporque não querem undefinedou 0ou"" 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;
}
...