Tuve que escribir una rutina que incremente el valor de una variable en 1 si su tipo es numbery asigna 0 a la variable si no, donde la variable está inicialmente nullo undefined.
La primera implementación fue v >= 0 ? v += 1 : v = 0porque 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 >= 0se evalúa como verdadera. Luego aprendí nullcomportamientos como 0 y las siguientes expresiones se evalúan como verdaderas.
null >= 0 && null <= 0!(null < 0 || null > 0)null + 1 === 11 / null === InfinityMath.pow(42, null) === 1
Por supuesto, nullno null == 0es 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 nullcomo 0, aunque en realidad no es 0?
javascript
null
comparison
equality
C. Lee
fuente
fuente

nulloundefined:c = -~c // Results in 1 for null/undefined; increments if already a numberundefinedes 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.nullno 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.nulles 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,
ToNumberse llama a ambos. Esto es lo mismo que agregar un+frente, que para coacciones nulas0.Comparación de igualdad: solo invoca
ToNumbercadenas, 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"" >= 0tambié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 ):
PreferredTypeno se aprobó, deje quehintsea "predeterminado".PreferredTypeeshintString, dejahintser "string".PreferredTypeeshintNúmero, seamoshint"número".exoticToPrimseaGetMethod(input, @@toPrimitive).ReturnIfAbrupt(exoticToPrim).exoticToPrimno 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.
hintes "predeterminado",hintsea "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
nullconvierte 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 >= 0estruey (1)null > 0esfalse.Por otro lado, la verificación de igualdad
==paraundefinedynullse 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 == 0esfalse.fuente