Eu tive que escrever uma rotina que incrementa o valor de uma variável em 1 se seu tipo é numbere atribui 0 à variável, se não, onde a variável é inicialmente nullou undefined.
A primeira implementação foi v >= 0 ? v += 1 : v = 0porque pensei que qualquer coisa que não fosse um número tornaria uma expressão aritmética falsa, mas estava errada, pois null >= 0é avaliada como verdadeira. Aprendi então que nullse comporta como 0 e as seguintes expressões são avaliadas como verdadeiras.
null >= 0 && null <= 0!(null < 0 || null > 0)null + 1 === 11 / null === InfinityMath.pow(42, null) === 1
Obviamente, nullnão null == 0é 0. é avaliado como falso. Isso torna a expressão aparentemente tautológica (v >= 0 && v <= 0) === (v == 0)falsa.
Por que é nullcomo 0, embora não seja realmente 0?
nullou undefined:c = -~c // Results in 1 for null/undefined; increments if already a number
undefinedé um valor variável, para variáveis que não foram inicializadas. null, por outro lado, é um valor de objeto vazio e não deve ser misturado com números. nullnão deve ser combinado com números; portanto, nulo não deve ter que se comportar como números.