Eu tive que escrever uma rotina que incrementa o valor de uma variável em 1 se seu tipo é number
e atribui 0 à variável, se não, onde a variável é inicialmente null
ou undefined
.
A primeira implementação foi v >= 0 ? v += 1 : v = 0
porque 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 null
se comporta como 0 e as seguintes expressões são avaliadas como verdadeiras.
null >= 0 && null <= 0
!(null < 0 || null > 0)
null + 1 === 1
1 / null === Infinity
Math.pow(42, null) === 1
Obviamente, null
não null == 0
é 0. é avaliado como falso. Isso torna a expressão aparentemente tautológica (v >= 0 && v <= 0) === (v == 0)
falsa.
Por que é null
como 0, embora não seja realmente 0?
null
ou 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. null
não deve ser combinado com números; portanto, nulo não deve ter que se comportar como números.