Bug #058
🪲 Znajdź buga
console.log(null == 0)
console.log(null > 0)
console.log(null >= 0)
Co zostanie zalogowane do konsoli w powyższym przykładzie?
🧪 Rozwiązanie
console.log(null == 0) // false
console.log(null > 0) // false
console.log(null >= 0) // true
Polegając na dedukcji w języku JavaScript, można wpaść w pułapkę.
Logicznym wydaje się, że jeśli null
nie jest równy 0
i nie jest też większy >
od 0
, to nie powinien być większy lub równy 0
, a jednak jest.
Powodem jest niespójność działania algorytmów porównania.
Algorytm porównania ==
, jeśli napotka na operand null
lub undefined
to aby zwrócić prawdę z takiego porównania, wymaga aby drugi operand również był null
albo undefined
.
null
może być równy tylko wartości null
. Ten sam algorytm porównania ==
wprowadza jednak konwersję innych typów danych np. wartości logicznych true
i false
, sprowadzając je do wartości liczbowych 1
i 0
.
Algorytm stojący za porównaniem większy niż >
działa inaczej.
Najpierw podmienia on miejscami operandy i stosuje algorytm porównanie mniejszy niż <
(co nie ma tutaj żadnego znaczenia).
Później natomiast, UWAGA, konwertuje wartości logiczne true
/false
na 1
/0
, ale TAKŻE wartość null
na 0
.
Wartość undefined
konwertuje natomiast na NaN
.
Operator większy lub równy >=
robi z null
to samo, więc finalnie wyrażenie zostaje zamienione na 0 >= 0
, co staje się prawdą.
🎢 Plac zabaw
Otwórz edytor w nowym oknie📑 Linki
- Equality (==) - JavaScript | MDN
- Greater than (>) - JavaScript | MDN
- Greater than or equal (>=) - JavaScript | MDN
- Less than (<) - JavaScript | MDN
❤️ Podobają Ci się bugi JS?
Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js