En primer lugar, los hechos:
if (booleanValue)
Satisfacerá la if
declaración para cualquier valor verdadero de booleanValue
incluir true
, cualquier número que no sea cero, cualquier valor de cadena no vacío, cualquier referencia de objeto o matriz, etc.
Por otra parte:
if (booleanValue === true)
Esto solo satisfará la if
condición si booleanValue
es exactamente igual a true
. Ningún otro valor de verdad lo satisfará.
Por otro lado, si haces esto:
if (someVar == true)
Entonces, lo que hará Javascript es escribir coacción true
para que coincida con el tipo de someVar
y luego comparar las dos variables. Hay muchas situaciones en las que esto probablemente no sea lo que uno pretendería. Debido a esto, en la mayoría de los casos desea evitarlo ==
porque hay un conjunto bastante largo de reglas sobre cómo JavaScript escribirá para obligar a dos cosas a ser del mismo tipo y, a menos que comprenda todas esas reglas y pueda anticipar todo lo que el intérprete de JS podría hacer cuando dados dos tipos diferentes (que la mayoría de los desarrolladores de JS no pueden), probablemente desee evitar por ==
completo.
Como ejemplo de lo confuso que puede 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
Por el valor 2
, pensaría que 2
es un valor verdadero, por lo que se compararía favorablemente true
, pero no es así como funciona la coerción de tipo. Está convirtiendo el valor de la mano derecha para que coincida con el tipo del valor de la mano izquierda, por lo que su conversióntrue
en el número 1
para que esté comparando, lo 2 == 1
que ciertamente no es lo que probablemente pretendía.
Entonces, comprador tenga cuidado. Es probable que sea mejor evitar==
en casi todos los casos, a menos que conozca explícitamente los tipos que comparará y sepa cómo funcionan todos los algoritmos de coerción de tipos posibles.
Por lo tanto, realmente depende de los valores esperados booleanValue
y de cómo desea que funcione el código. Si sabe de antemano que solo tendrá una true
ofalse
valor , entonces compárelo explícitamente con
if (booleanValue === true)
es solo código extra e innecesario y
if (booleanValue)
es más compacto y posiblemente más limpio / mejor.
Si, por otro lado, no sabe qué booleanValue
podría ser y desea probar si realmente está configurado true
sin otras conversiones de tipo automáticas permitidas, entonces
if (booleanValue === true)
No solo es una buena idea, sino que se requiere.
Por ejemplo, si observa la implementación de .on()
jQuery, tiene un valor de retorno opcional. Si vuelve la devolución de llamada false
, jQuery detendrá automáticamente la propagación del evento. En este caso específico, ya que jQuery quiere propagación parada sólo si false
fue devuelto, comprueban el valor de retorno para explícitamente === false
porque no quieren undefined
o 0
o ""
o cualquier otra cosa que se escriba automáticamente-convertir en false para satisfacer también la comparación.
Por ejemplo, aquí está el código de devolución de llamada de manejo de eventos jQuery:
ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );
if ( ret !== undefined ) {
event.result = ret;
if ( ret === false ) {
event.preventDefault();
event.stopPropagation();
}
}
Puedes ver que jQuery está buscando explícitamente ret === false
.
Pero, también hay muchos otros lugares en el código jQuery donde una verificación más simple es apropiada dado el deseo del código. Por ejemplo:
// The DOM ready check for Internet Explorer
function doScrollCheck() {
if ( jQuery.isReady ) {
return;
}
...