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] === true
evalúa como falso.=== true
cuando necesite asegurarse de que la condición sea exactamente igual atrue
.Respuestas:
En primer lugar, los hechos:
Satisfacerá la
if
declaración para cualquier valor verdadero debooleanValue
incluirtrue
, 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
if
condición sibooleanValue
es 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
true
para que coincida con el tipo desomeVar
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:
Por el valor
2
, pensaría que2
es 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óntrue
en el número1
para que esté comparando, lo2 == 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á unatrue
ofalse
valor , 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é
booleanValue
podría ser y desea probar si realmente está configuradotrue
sin 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 sifalse
fue devuelto, comprueban el valor de retorno para explícitamente=== false
porque no quierenundefined
o0
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:
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
NaN
y-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á sibooleanValue
es Truthy - que no sea nada0
,false
,''
,NaN
,null
, yundefined
.if (booleanValue === true)
solo se ejecutará sibooleanValue
es 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ándobooleanValue
es2
. Esas dos declaraciones no te dan el mismo resultado.Dado que el valor marcado es
Boolean
preferible usarlo directamente para menos codificación y en absoluto hizo lo mismo==true
fuente
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
true
de1
o"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:undefined
onull
valor. 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
,null
o 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ínormalized
seráundefined
sisomeString
no 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
null
oundefined
valores, 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 == TRUE
pueda 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