Hoy recibí un comentario sobre el código considerando la forma en que verifico si una variable es verdadera o falsa en una tarea escolar.
El código que había escrito era algo como esto:
var booleanValue = true;
function someFunction(){
    if(booleanValue === true){
        return "something";
    }
}Dijeron que era mejor / más ordenado escribirlo así:
var booleanValue = true;
function someFunction(){
    if(booleanValue){
        return "something";
    }
}La observación que obtuve sobre la parte "=== verdadero" fue que no era necesaria y podía crear confusión.
Sin embargo, mi idea es que es mejor verificar si la variable es booleana o no, especialmente porque Javascript es un lenguaje poco definido.
En el segundo ejemplo, una cadena también devolvería "algo";
Entonces mi pregunta; ¿Es mejor perder la parte "=== verdadero" en el futuro, o también es una buena práctica verificar el tipo de variable.
Editar: en mi código "real", el booleano representa si una imagen se ha eliminado o no, por lo que los únicos valores que boolValue debería tener es verdadero o falso.
0 y 1, por ejemplo, no deberían estar en esa variable.
fuente

=== true. ¡Evita la confusión![0] === trueevalúa como falso.=== truecuando necesite asegurarse de que la condición sea exactamente igual atrue.Respuestas:
En primer lugar, los hechos:
Satisfacerá la
ifdeclaración para cualquier valor verdadero debooleanValueincluirtrue, cualquier número que no sea cero, cualquier valor de cadena no vacío, cualquier referencia de objeto o matriz, etc.Por otra parte:
Esto solo satisfará la
ifcondición sibooleanValuees exactamente igual atrue. Ningún otro valor de verdad lo satisfará.Por otro lado, si haces esto:
Entonces, lo que hará Javascript es escribir coacción
truepara que coincida con el tipo desomeVary 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:
Por el valor
2, pensaría que2es un valor verdadero, por lo que se compararía favorablementetrue, 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óntrueen el número1para que esté comparando, lo2 == 1que 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
booleanValuey de cómo desea que funcione el código. Si sabe de antemano que solo tendrá unatrueofalsevalor , entonces compárelo explícitamente cones solo código extra e innecesario y
es más compacto y posiblemente más limpio / mejor.
Si, por otro lado, no sabe qué
booleanValuepodría ser y desea probar si realmente está configuradotruesin otras conversiones de tipo automáticas permitidas, entoncesNo 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 llamadafalse, jQuery detendrá automáticamente la propagación del evento. En este caso específico, ya que jQuery quiere propagación parada sólo sifalsefue devuelto, comprueban el valor de retorno para explícitamente=== falseporque no quierenundefinedo0o""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:
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:
fuente
Si escribe:,
if(x === true)será verdadero solo para x = verdaderoSi escribe:,
if(x)será verdadero para cualquier x que no sea: '' (cadena vacía), falso, nulo, indefinido, 0, NaN.fuente
NaNy-0.En el simple "if", la variable se convertirá en un Boolean y usará toBoolean en el objeto: -
Pero la comparación con === no tiene ningún tipo de coerción, por lo que deben ser iguales sin coerción.
Si está diciendo que el objeto puede no ser un booleano, entonces puede que tenga que considerar algo más que verdadero / falso.
fuente
Depende de su caso de uso. Puede tener sentido verificar el tipo también, pero si es solo una bandera, no lo hace.
fuente
===comparación no realiza coerción de tipo. Por lo tanto, el código del OP efectivamente prueba el tipo de bandera. Solo tiene éxito si el valor es booleano y es verdadero.En general, es más limpio y sencillo omitir el
=== true.Sin embargo, en Javascript, esas declaraciones son diferentes.
if (booleanValue)ejecutará sibooleanValuees Truthy - que no sea nada0,false,'',NaN,null, yundefined.if (booleanValue === true)solo se ejecutará sibooleanValuees exactamente igual atrue.fuente
''.El
(===)operador de identidad se comporta de manera idéntica al(==)operador de igualdad , excepto que no se realiza la conversión de tipo, y los tipos deben ser iguales para ser considerados iguales.fuente
if (booleanValue)yif (booleanValue==true)cuándobooleanValuees2. Esas dos declaraciones no te dan el mismo resultado.Dado que el valor marcado es
Booleanpreferible usarlo directamente para menos codificación y en absoluto hizo lo mismo==truefuente
Dado que ya se inicializó claramente como bool, creo
===que no se requiere operador.fuente
Si la variable solo puede tomar valores booleanos, entonces es razonable usar la sintaxis más corta.
Si potencialmente se le pueden asignar otros tipos, y necesita distinguir
truede1o"foo", entonces debe usar=== true.fuente
Creo que tu razonamiento es sólido. Pero en la práctica he descubierto que es mucho más común omitir la
===comparación. Creo que hay tres razones para eso:undefinedonullvalor. A menudo solo desea que su prueba falle en tales casos. (Aunque trato de equilibrar esta vista con el lema "falla rápido").Considere este ejemplo:
Creo que este tipo de código no es infrecuente. Se ocupa de los casos en los
getInput()rendimientosundefined,nullo una cadena vacía. Debido a las dos evaluaciones booleanas,submitInput()solo se llama si la entrada dada es una cadena que contiene caracteres que no son espacios en blanco.En JavaScript
&&devuelve su primer argumento si es falso o su segundo argumento si el primer argumento es verdadero; asínormalizedseráundefinedsisomeStringno estaba definido y así sucesivamente. Eso significa que ninguna de las entradas a las expresiones booleanas anteriores son en realidad valores booleanos.Sé que muchos programadores que están acostumbrados a una fuerte verificación de tipos se avergüenzan al ver un código como este. Pero tenga en cuenta que la aplicación de una tipificación fuerte probablemente requeriría verificaciones explícitas
nulloundefinedvalores, lo que saturaría el código. En JavaScript eso no es necesario.fuente
Esto depende Si le preocupa que su variable pueda terminar como algo que se resuelve como VERDADERO. Entonces la comprobación dura es imprescindible. De lo contrario, depende de usted. Sin embargo, dudo que la sintaxis
whatever == TRUEpueda confundir a alguien que supiera lo que estaban haciendo.fuente
En Javascript, la idea de booleano es bastante ambigua. Considera esto:
Por lo tanto, cuando está utilizando una instrucción if (o cualquier otra instrucción de control), no es necesario utilizar un tipo "booleano" var. Por lo tanto, en mi opinión, la parte "=== verdadero" de su declaración es innecesaria si sabe que es booleana, pero absolutamente necesaria si su valor es una var "verdadera" ambigua. Puede encontrar más sobre booleanos en javscript aquí .
fuente
Revisa https://www.w3schools.com/js/js_comparisons.asp
ejemplo:
=== significa el mismo tipo y el mismo valor == solo el mismo valor
fuente
También se puede probar con un objeto booleano, si necesita probar un objeto
error={Boolean(errors.email)}fuente