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?
nullo undefined:c = -~c // Results in 1 for null/undefined; increments if already a number
undefinedes 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.