J'ai dû écrire une routine qui incrémente la valeur d'une variable de 1 si son type est number
et affecte 0 à la variable sinon, où la variable est initialement null
ou undefined
.
La première implémentation était v >= 0 ? v += 1 : v = 0
parce que je pensais que tout ce qui n'est pas un nombre rendrait une expression arithmétique fausse, mais c'était faux car il null >= 0
est évalué à vrai. Ensuite, j'ai appris qu'il null
se comporte comme 0 et les expressions suivantes sont toutes évaluées à vrai.
null >= 0 && null <= 0
!(null < 0 || null > 0)
null + 1 === 1
1 / null === Infinity
Math.pow(42, null) === 1
Bien sûr, null
n'est pas 0. null == 0
est évalué à faux. Cela rend l'expression apparemment tautologique (v >= 0 && v <= 0) === (v == 0)
fausse.
Pourquoi est null
comme 0, bien que ce ne soit pas réellement 0?
null
soit undefined
:c = -~c // Results in 1 for null/undefined; increments if already a number
undefined
est une valeur de variable, pour les variables qui n'ont pas été initialisées. null
, d'autre part, est une valeur d'objet vide et ne doit pas être mélangée avec des nombres. null
ne doit pas être combiné avec des nombres, donc null ne devrait pas avoir à se comporter comme des nombres.