Przejdź do głównej zawartości

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

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js