Digamos que tengo el siguiente código javascript:
const test = null if ( test >= 0 ){ console.log("Hello World") }
Este código imprimirá Hello World
... En mi opinión, debería funcionar solo si test === null
. Pero todas las veces que uso la test >= 0
, el código cae sobre ella. ¿Hay alguna razón por la que sucede? Lo veo como un problema en algunas situaciones... Por ejemplo, en el siguiente código:
const test = null if ( test >= 0 ){ console.log("1") } else if ( test === null ){ console.log("Hello World") }
En este caso, el código no está haciendo lo que aparentemente debería estar haciendo. La solución para que funcione sería tener el hábito de poner siempre la condición === null
al principio en if/else o switch/cases. ¿Es así como se supone que debo trabajar con Javascript? ¿O hay una mejor manera de hacerlo?
¿Hay alguna razón por la que sucede?
Cualquier valor que se compare con un número será coaccionado a un número 1 . Number(null)
es 0
, y 0 >= 0
es true
. Si hubiera usado undefined
por otro lado, habría obtenido NaN >= 0
, que es false
.
1: De hecho, la única comparación relacional no numérica es entre dos cadenas (o dos objetos que se convierten en cadenas).
La solución para que funcione sería tener la costumbre de poner siempre la condición
=== null
al principio.
Sí, así es como se manejan las variables que pueden tener el valor null
.
¿O hay una mejor manera de hacerlo?
Es posible que desee evitar tener el valor null
en su variable. Dependiendo de la aplicación, cualquiera que sea el valor que represente, ¿también podría expresarse como 0
o -1
, tal vez? Puede que no sean mucho más limpios, pero al menos tendrían un comportamiento predecible en >= 0
.
Pensé que era una pregunta simple pero me equivoqué. Fui a comprobar ECMAScript Language Specification, que especificaba cómo funciona "a>=b".
Resultó que no está haciendo "a>b || a==b", sino que está devolviendo la respuesta opuesta de "a<b". Creo que es por eso que (null>= 0) devuelve verdadero, porque (null <0) devuelve falso.
11.8.4 El operador mayor que o igual ( >= ) La producción RelationalExpression : RelationalExpression >= ShiftExpression se evalúa de la siguiente manera:
- Evaluar ExpresiónRelacional.
- Llame a GetValue (Resultado (1)).
- Evalúe ShiftExpression.
- Llame a GetValue (Resultado (3)).
- Realice la comparación Result(2) < Result(4) . (ver 11.8.5).**
- Si Result(5) es verdadero o indefinido, devuelve falso. De lo contrario, devuelve verdadero.
Y encontré otra referencia que traza los operadores relacionales y de igualdad de algunos casos especiales.
si convierte nulo en bool, obtiene 0.
if ( test >= 0 ){
Aquí se usa un operador más grande o igual para la comparación, por lo que está obteniendo resultados correctos.
Por ejemplo
Boolean(null); // false
Para obtener más información, consulte https://javascript.info/ifelse#boolean-conversion