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