Musiałem napisać procedurę, która zwiększa wartość zmiennej o 1, jeśli jej typ to number
i przypisuje 0 do zmiennej, jeśli nie, gdzie zmienna jest początkowo null
lub undefined
.
Pierwsza implementacja była v >= 0 ? v += 1 : v = 0
taka, 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 >= 0
jest oceniane jako prawda. Potem dowiedziałem null
się, ż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 === 1
1 / null === Infinity
Math.pow(42, null) === 1
Oczywiście null
nie null == 0
jest 0 jest oceniane jako fałsz. To sprawia, że pozornie tautologiczne wyrażenie jest (v >= 0 && v <= 0) === (v == 0)
fałszywe.
Dlaczego jest null
jak 0, chociaż w rzeczywistości nie jest to 0?
null
albo undefined
:c = -~c // Results in 1 for null/undefined; increments if already a number
undefined
jest wartością zmiennej dla zmiennych, które nie zostały zainicjowane. null
z drugiej strony jest pustą wartością obiektu i nie należy jej mieszać z liczbami. null
nie powinno być łączone z liczbami, więc null nie powinno zachowywać się jak liczby.