Musiałem napisać procedurę, która zwiększa wartość zmiennej o 1, jeśli jej typ to numberi przypisuje 0 do zmiennej, jeśli nie, gdzie zmienna jest początkowo nulllub undefined.
Pierwsza implementacja była v >= 0 ? v += 1 : v = 0taka, ponieważ myślałem, że cokolwiek, co nie jest liczbą, spowoduje, że wyrażenie arytmetyczne będzie fałszywe, ale było błędne, ponieważ null >= 0jest oceniane jako prawda. Potem dowiedziałem nullsię, że zachowuje się jak 0 i wszystkie poniższe wyrażenia są oceniane jako prawdziwe.
null >= 0 && null <= 0!(null < 0 || null > 0)null + 1 === 11 / null === InfinityMath.pow(42, null) === 1
Oczywiście nullnie null == 0jest 0 jest oceniane jako fałsz. To sprawia, że pozornie tautologiczne wyrażenie jest (v >= 0 && v <= 0) === (v == 0)fałszywe.
Dlaczego jest nulljak 0, chociaż w rzeczywistości nie jest to 0?
nullalbo undefined:c = -~c // Results in 1 for null/undefined; increments if already a number
undefinedjest wartością zmiennej dla zmiennych, które nie zostały zainicjowane. nullz drugiej strony jest pustą wartością obiektu i nie należy jej mieszać z liczbami. nullnie powinno być łączone z liczbami, więc null nie powinno zachowywać się jak liczby.