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?
null
o undefined
: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.