Przejdź do głównej zawartości

Bug #042

🪲 Znajdź buga

console.log(1 < 2 < 3)
console.log(0 < 1 < 2)

console.log(3 > 2 > 1)
console.log(2 > 1 > 0)

Co zalogują do konsoli poszczególne ciągi porównań?

🧪 Rozwiązanie

console.log(1 < 2 < 3) // true
console.log(0 < 1 < 2) // true

console.log(3 > 2 > 1) // false
console.log(2 > 1 > 0) // true

Wszystkie przykłady oprócz 3 > 2 > 1 zalogują wartość true.

Dlaczego 3 > 2 > 1 zaloguje false? Przeanalizujmy to krok po kroku.

Operatory > (więcej niż) oraz < (mniej niż) porównują ze sobą dwa operandy, zwracając wartość logiczną z takiego porównania.

Gdy używamy ciągu kilku porównań, sytuacja wygląda analogicznie, jak w przypadku używania ciągu innych operatorów np. dodawania, mnożenia, porównania, koniunkcji itp.

Kolejność oraz kierunek wykonywania operacji wykonywanych przez operatory definiuje tabela pierwszeństwa operatorów (operator precedence).

Operatory > i < wykonują porównania po kolei, od lewej do prawej.

Dla 3 > 2 > 1 w pierwszej kolejności wykonane zostanie porównanie 3 > 2 i zwróci ono wartość true.

Ciąg porównań zostanie zredukowany i będzie w kolejnym kroku porównywał true > 1.

W przypadku gdy porównywane wartości nie są wartościami liczbowymi, zostają one sprowadzone do wartości liczbowej za pomocą algorytmu funkcji Number().

Wartość Number(true) zwraca wartość 1.

W językach programowania, wartości logiczne true/false są z reguły reprezentowane przez wartości liczbowe 1/0.

Finalnie true > 1 zostanie więc skonwertowane do 1 > 1. Wynikiem takiego porównania będzie rzecz jasna wartość false.

W pozostałych przykładach porównań zachodzi analogiczny proces.

Z początkowych porównań zwracana jest wartość logiczna. Następnie kolejne porównania konwertują wartości logiczne na wartości liczbowe i dokonują kolejnych porównań.

true < 3 to prawda, true < 2 to prawda i true > 0 to też prawda.

🎢 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