Przejdź do głównej zawartości

Bug #076

🪲 Znajdź buga

console.log(Object.is([1], [1]))
console.log([1] === [1])

console.log(Object.is(NaN, NaN))
console.log(NaN === NaN)

console.log(Object.is(NaN, 0 / 0))
console.log(NaN === 0 / 0)

console.log(Object.is(-0, +0))
console.log(-0 === +0)

Czy porównanie wartości poprzez Object.is() działa tak samo jak porównanie poprzez operator ===?

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

console.log(Object.is([1], [1])) // false
console.log([1] === [1]) // false

console.log(Object.is(NaN, NaN)) // true
console.log(NaN === NaN) // false

console.log(Object.is(NaN, 0 / 0)) // true
console.log(NaN === 0 / 0) // false

console.log(Object.is(-0, +0)) // false
console.log(-0 === +0) // true

Object.is() mimo, że swoją nazwą sugeruje porównywanie obiektów, w rzeczywistości porównuje dwie wartości przekazane jako argumenty do metody is().

Metoda działa bardzo podobnie do porównania, które wykonuje operator ===, ale z małymi wyjątkami.

Porównanie dwóch wartości NaN za pomocą Object.is() da prawdę.

Tego samego nie możemy się jednak spodziewać po działaniu operatora ===, który jeśli napotka operand NaN, to zawsze zwraca fałsz.

Nie ma tutaj znaczenia czy NaN jest przekazany bezpośrednio jako wartość, czy jest wynikiem działania, np. dzielenia 0 / 0.

Drugim wyjątkiem i nieścisłością pomiędzy Object.is(), a operatorem === jest porównanie zera ujemnego z zerem dodatnim.

W informatyce zapis liczb w pamięci w postaci binarnej wiąże się z użyciem dodatkowego bita (sign), który określa czy liczba jest dodatnia czy ujemna.

Bit ten może być użyty również dla liczby 0, tym samym rozgraniczając ją na dwie wartości: -0 i +0.

Dla Object.is() zero ujemne będzie różniło się od zera dodatniego więc porównanie ich zwróci false.

Dla operatora === oba zera będą takie same, zwracając w efekcie ich porównania wartość true.

🎢 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