J'ai dû écrire une routine qui incrémente la valeur d'une variable de 1 si son type est numberet affecte 0 à la variable sinon, où la variable est initialement nullou undefined.
La première implémentation était v >= 0 ? v += 1 : v = 0parce 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 >= 0est évalué à vrai. Ensuite, j'ai appris qu'il nullse comporte comme 0 et les expressions suivantes sont toutes évaluées à vrai.
null >= 0 && null <= 0!(null < 0 || null > 0)null + 1 === 11 / null === InfinityMath.pow(42, null) === 1
Bien sûr, nulln'est pas 0. null == 0est évalué à faux. Cela rend l'expression apparemment tautologique (v >= 0 && v <= 0) === (v == 0)fausse.
Pourquoi est nullcomme 0, bien que ce ne soit pas réellement 0?
nullsoit undefined:c = -~c // Results in 1 for null/undefined; increments if already a number
undefinedest 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. nullne doit pas être combiné avec des nombres, donc null ne devrait pas avoir à se comporter comme des nombres.