Przejdź do głównej zawartości

Bug #062

🪲 Znajdź buga

console.log(true + 1)
console.log(false + 1)
console.log(null + 1)
console.log(undefined + 1)
console.log([] + 1)
console.log({} + 1)

Jakie wartości zostaną zalogowane do konsoli w powyższych przykładach?

🧪 Rozwiązanie

console.log(true + 1) // 2
console.log(false + 1) // 1
console.log(null + 1) // 1
console.log(undefined + 1) // NaN
console.log([] + 1) // "1"
console.log({} + 1) // [object Object]1

Operator + jest przeładowany tzn. obsługuje zarówno dodawanie jak i łączenie ciągów znaków.

Opis algorytmu operatora + mówi, że jeśli jeden z operandów jest ciągiem znaków, to drugi jest również konwertowany do ciągu znaków i oba ciągi znaków są ze sobą łączone.

W innym przypadku obie strony powinny zostać skonwertowane do wartości liczbowej, a potem dodane do siebie.

true jest konwertowane do wartości liczbowej 1.\ 1 + 1 daje 2.

false jest konwertowane do wartości liczbowej 0.\ 0 + 1 daje 1.

null jest konwertowany do wartości liczbowej 0.\ 0 + 1 daje 1.

undefined jest już jednak konwertowany do wartości NaN.\ NaN + 1 daje NaN.

Jeśli typy danych nie są prymitywne, to algorytm sprowadza je do takich.

Obiekty (w tym tablice) nie są danymi typu prymitywnego. Dziedziczą z prototypu Object metodę valueOf(), która w pierwszej kolejności jest sprawdzana pod kątem konwersji do typu prymitywnego przez operację dodawania.

valueOf zwraca jednak obiekt, więc wartość jest ignorowana (nie jest prymitywna) i algorytm przechodzi do sprawdzenia drugiej metody toString(), która zwraca ciąg znaków.

Pusta tablica [] nie zostaje więc zamieniona na wartość liczbową 0, a na pusty ciąg znaków, który następnie jest łączony z wartością 1, również skonwertowaną na ciąg znaków.

Podobnie jest z obiektem {}. Jest on konwertowany do ciągu znaków [object Object], a następnie łączony z wartością 1, również skonwertowaną do ciągu znaków.

🎢 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