Tuve que escribir una rutina que incremente el valor de una variable en 1 si su tipo es number
y asigna 0 a la variable si no, donde la variable está inicialmente null
o undefined
.
La primera implementación fue v >= 0 ? v += 1 : v = 0
porque pensé que cualquier cosa que no fuera un número haría que una expresión aritmética fuera falsa, pero estaba mal ya que null >= 0
se evalúa como verdadera. Luego aprendí null
comportamientos como 0 y las siguientes expresiones se evalúan como verdaderas.
null >= 0 && null <= 0
!(null < 0 || null > 0)
null + 1 === 1
1 / null === Infinity
Math.pow(42, null) === 1
Por supuesto, null
no null == 0
es 0. se evalúa como falso. Esto hace que la expresión aparentemente tautológica sea (v >= 0 && v <= 0) === (v == 0)
falsa.
¿Por qué es null
como 0, aunque en realidad no es 0?
javascript
null
comparison
equality
C. Lee
fuente
fuente
null
oundefined
:c = -~c // Results in 1 for null/undefined; increments if already a number
undefined
es un valor variable, para variables que no se han inicializado.null
, por otro lado, es un valor de objeto vacío y no debe mezclarse con números.null
no debe combinarse con números, por lo que null no debería tener que comportarse como números.Respuestas:
Su verdadera pregunta parece ser:
Por qué:
Pero:
Lo que realmente sucede es que el Operador Mayor-o-igual (
>=
), realiza la coerción de tipo (ToPrimitive
), con un tipo de sugerencia deNumber
, en realidad todos los operadores relacionales tienen este comportamiento.null
es tratado de manera especial por el operador Equals (==
). En resumen, solo obliga aundefined
:Valor tales como
false
,''
,'0'
, y[]
están sujetos a la coerción de tipo numérico, todos ellos coaccionar a cero.Puede ver los detalles internos de este proceso en El algoritmo de comparación de igualdad abstracta y el Algoritmo de comparación relacional abstracta .
En resumen:
Comparación relacional: si ambos valores no son de tipo String,
ToNumber
se llama a ambos. Esto es lo mismo que agregar un+
frente, que para coacciones nulas0
.Comparación de igualdad: solo invoca
ToNumber
cadenas, números y booleanos.fuente
null is treated in a special way by the Equals Operator (==). In a brief, it only coerces to undefined:
¿y qué? ¿Puedes explicar por quénull >= 0
? :)+
frente, que para coacciones nulas0
. Igualdad solo llama a ToNumber en cadenas, números y booleanos.Me gustaría extender la pregunta para mejorar aún más la visibilidad del problema:
Simplemente no tiene sentido. Al igual que los idiomas humanos, estas cosas deben aprenderse de memoria.
fuente
JavaScript tiene comparaciones estrictas y de conversión de tipos
null >= 0;
es cierto pero(null==0)||(null>0)
es falsonull <= 0;
es cierto pero(null==0)||(null<0)
es falso"" >= 0
también es ciertoPara las comparaciones abstractas relacionales (<=,> =), los operandos se convierten primero en primitivos, luego en el mismo tipo, antes de la comparación.
typeof null returns "object"
Cuando type es object, JavaScript intenta stringificar el objeto (es decir, nulo), se siguen los siguientes pasos ( ECMAScript 2015 ):
PreferredType
no se aprobó, deje quehint
sea "predeterminado".PreferredType
eshint
String, dejahint
ser "string".PreferredType
eshint
Número, seamoshint
"número".exoticToPrim
seaGetMethod(input, @@toPrimitive)
.ReturnIfAbrupt(exoticToPrim)
.exoticToPrim
no está indefinido, entoncesa) Sea el resultado
Call(exoticToPrim, input, «hint»)
.b)
ReturnIfAbrupt(result)
.c) Si
Type(result)
no es Objeto, devuelve el resultado.d) Lanzar una excepción TypeError.
hint
es "predeterminado",hint
sea "número".OrdinaryToPrimitive(input,hint)
.Los valores permitidos para la sugerencia son "predeterminado", "número" y "cadena". Los objetos de fecha son únicos entre los objetos ECMAScript integrados en que tratan "predeterminado" como equivalente a "cadena". Todos los demás objetos ECMAScript integrados tratan "predeterminado" como equivalente a "número" . ( ECMAScript 20.3.4.45 )
Entonces creo que se
null
convierte a 0.fuente
Yo tuve el mismo problema !!. Actualmente mi única solución es separarme.
fuente
if (a!=null && a>=0)
. Esto aclara la razón de no hacerlo simplemente>=
por sí mismo: "a podría ser nulo (o indefinido, que también es '== nulo')".Matemáticamente, eso es extraño. El último resultado establece que "nulo es mayor o igual que cero", por lo que en una de las comparaciones anteriores debe ser cierto, pero ambos son falsos.
La razón es que un control de igualdad
==
y comparaciones> < >= <=
funcionan de manera diferente. Las comparaciones convierten nulo en un número, tratándolo como0
. Es por eso que (3)null >= 0
estrue
y (1)null > 0
esfalse
.Por otro lado, la verificación de igualdad
==
paraundefined
ynull
se define de tal manera que, sin ninguna conversión, se igualen entre sí y no igualen nada más. Es por eso que (2)null == 0
esfalse
.fuente