Przejdź do głównej zawartości

Bug #034

🪲 Znajdź buga

console.log(NaN == NaN)
console.log(NaN === NaN)

console.log(Number.NaN == Number.NaN)
console.log(Number.NaN === Number.NaN)

console.log(isNaN(NaN))
console.log(Number.isNaN(NaN))

console.log(isNaN("123"))
console.log(Number.isNaN("123"))

console.log(isNaN("abc"))
console.log(Number.isNaN("abc"))

const valueIsNaN = (val) => val !== val

console.log(valueIsNaN("123"))
console.log(valueIsNaN("abc"))

console.log(valueIsNaN(NaN))
console.log(valueIsNaN(Number.NaN))

Jakie wartości logiczne zostaną zalogowane do konsoli?

Czy metoda isNaN() działa tak samo jak metoda Number.isNaN()?

Czy funkcja valueIsNaN() spełni zadanie sprawdzania wartości NaN?

🧪 Rozwiązanie

console.log(NaN == NaN) // false
console.log(NaN === NaN) // false

console.log(Number.NaN == Number.NaN) // false
console.log(Number.NaN === Number.NaN) // false

console.log(isNaN(NaN)) // true
console.log(Number.isNaN(NaN)) // true

console.log(isNaN("123")) // false
console.log(Number.isNaN("123")) // false

console.log(isNaN("abc")) // true (!)
console.log(Number.isNaN("abc")) // false

const valueIsNaN = (val) => val !== val

console.log(valueIsNaN("123")) // false
console.log(valueIsNaN("abc")) // false

console.log(valueIsNaN(NaN)) // true
console.log(valueIsNaN(Number.NaN)) // true

NaN jest wyjątkową wartością w JavaScript. Jako jedyna porównana sama ze sobą zwraca fałsz. Nie ma znaczenia, czy użyjemy ścisłego (===) czy luźnego (==) porównania.

Jedyną opcją na sprawdzenie, czy wartością jest NaN jest użycie dostępnej w globalnym kontekście metody isNaN() lub Number.isNaN.

Alternatywnie, możemy stworzyć własną funkcję, która porówna ścisłą nierówność (!==) przekazanej wartości. Prawda zwrócona zostanie tylko wtedy, gdy jako argument funkcji przekażemy NaN.

Na bardzo mocną uwagę zasługuje isNaN("abc").

"abc" === NaN w żaden sposób nie jest prawdziwe.

"abc" nie jest wartością NaN, dlaczego więc dostajemy z tej metody odpowiedź true?

Bo w JavaScript, metoda isNaN() działa inaczej niż Number.isNaN().

isNaN() zwraca true jeśli argument jest wartością NaN, lub jeśli będzie wartością NaN po jego konwersji na wartość liczbową 🤯.

🎢 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