Przejdź do głównej zawartości

Bug #084

🪲 Znajdź buga

console.log(4 < 5)

console.log("4" < "5")
console.log("34" < "5")
console.log("347" < "5")
console.log("347" < "50")

console.log("a" < "b")
console.log("b" < "bz")
console.log("bxz" < "bz")
console.log("bar" < "baz")

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

console.log(4 < 5) // true

console.log("4" < "5") // true
console.log("34" < "5") // true
console.log("347" < "5") // true
console.log("347" < "50") // true

console.log("a" < "b") // true
console.log("b" < "bz") // true
console.log("bxz" < "bz") // true
console.log("bar" < "baz") // true

Wszystkie porównania zwrócą wartość true.

Nie są to jednak wartości, których intuicyjnie moglibyśmy się spodziewać po użyciu operatora <.

Porównanie mniej niż oraz analogicznie przeciwstawne więcej niż działa intuicyjnie poprawnie dla wartości liczbowych.

Dla porównania ciągów znaków intuicja mija się jednak z algorytmem, który odpowiada za faktyczne porównania.

Jeśli operandami są ciągi znaków, porównywane są wartości liczbowe przypisane do znaków w kodowaniu Unicode.

Znak "a" w kodowaniu Unicode to liczba 97.

Znak "b", odpowiada liczbie 98.

97 < 98 jest więc twierdzeniem prawdziwym.

Gdy ciągi znaków składają się z większej ilości znaków są one porównywane ze sobą kolejno, znak po znaku.

"b" < "b" zwróciłoby fałsz, bo fałszywe jest stwierdzenie 98 < 98.

"b" < "bz" zwraca prawdę, bo kolejny znak, "z" jest większy niż brak znaku po lewej stronie porównania.

"bxz" < "bz" zwraca prawdę bo "x" w kodowaniu Unicode ma niższą wartość (kod 120) niż "z" (kod 122), innymi słowy występuje wcześniej w alfabecie. Trzecie z zostaje pominięte.

Gdy zamiast liter użyjemy liczb, ale będą one zapisane w postaci ciągu znaków, to sytuacja będzie wyglądała tak samo.

"34" < "5" jest prawdziwe, bo "3" (kod 51) jest mniejsze niż "5" (kod 53). "4" zostaje znakiem pominiętym w porównaniu.

Nie ma znaczenia ile kolejnych znaków dodamy oraz jakie to będą znaki, "3499999999" < "5".

Zwróci tak samo prawdę, ponieważ Unicode "3" (51) jest mniejszy niż Unicode "5" (53).

🎢 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