Kontrola NaN („není číslo“) je stejně jednoduchá jako kontrola vlastní rovnosti v JavaScriptu.
V JavaScriptu se speciální hodnota
NaN
(což znamená“ ne číslo „) používá k vyjádření výsledku matematického výpočtu, který nelze vyjádřit jako smysluplné číslo. – Joshua Clanton on A Drip of JavaScript
Speciální hodnota NaN
se zobrazí v JavaScriptu, když Math
funkce selžou (Math.sqrt(-37)
) nebo selže funkce, která se pokouší analyzovat číslo (parseInt("No integers here")
).
NaN
poté otráví všechny ostatní matematické funkce, což povede ke všem ostatním matematickým operacím, jejichž výsledkem bude NaN
.
Upozorňujeme, že v JavaScriptu vrátí dělení 0 Infinity
, ne NaN
:
Tento výsledek je způsoben tím, jak plovoucí poi nt je definováno obecněji než jen Javascript. Proč? Zhruba proto, že 1/0 je limit 1 / x, protože x se blíží nule. A 0/0 nemá vůbec žádný rozumný výklad, proto NaN
.
Co je vlastně NaN?
NaN je vlastnost globálního objektu. Počáteční hodnota NaN je Not-A-Number – stejná jako hodnota Number.NaN. – MDN Docs
Kontrola NaN je těžší, než se zdá
Bohužel při pokusu o kontrolu :
-
typeof NaN
je“ číslo „ -
NaN
se nerovná všem ostatním hodnotám v JavaScriptu
Podívejte se na tento příklad kódu:
Jak tedy zkontrolujeme, zda máme NaN
hodnotu, která otráví matematiku?
Zkontrolovat NaN pomocí sebe-rovnosti
“ NaN a pouze NaN bude srovnávat nerovné. “ – Dokumenty MDN
V JavaScriptu je nejlepším způsobem kontroly NaN
kontrola rovnosti pomocí některého z předdefinovaných operátorů rovnosti ==
nebo ===
.
Protože se nerovná sám sobě, NaN != NaN
vždy vrátí true
.
Samozřejmě, takový NaN
test ve vašem kódu není vždy čitelný, takže je dobré použít komentář nebo vytvořit funkci wrapper:
Pokud použijete nebo !==
ke kontrole NaN
.
Zkontrolovat NaN pomocí Object.is ()
“ The
Object.is()
určuje, zda jsou dvě hodnoty stejné hodnoty.”- MDN Docs
Na rozdíl od operátorů přísné a volné rovnosti pomocná metoda ES6 Object.is()
nezohledňuje NaN
aby se mu rovnal:
Takže pokud vyměníte ===
za Object.is()
, nikdy se nemusíte bát o kontrole NaN
nějakým zvláštním způsobem. Problém vyřešen!
O tom, jak používat Object.is()
v JavaScriptu, jsem psal v jiném článku:
Jedna poznámka k terminologii – Object.is()
je funkce globální Object
třídy, nenazývám ji „operátorem rovnosti“ jako ==
nebo ===
.
Například v testech Jest metoda .toBe()
, která používá ===
se liší od metody .toEqual()
, která používá Object.is()
.
Sbalit zde bych měl zmínit, že JavaScript ES6 Set
, který se používá k hledání jedinečných hodnot, si ponechá pouze jednu kopii NaN
hodnota.
Slovo o čísle .isNan ()
Moderní JavaScript již má implementaci pro kontrolu NaN
s názvem Number.isNan()
, která funguje tak, jak si myslíte to by. Například:
Pamatujte, že Number.isNan()
se liší od globální isNan()
funkce, což je starší implementace, jejímž skutečným účelem je zkontrolovat, zda hodnotu nelze vynutit na číslo.
Pro úplnost je zde rozdíl:
-
isNaN()
vrátítrue
pokud je hodnota aktuálněNaN
, nebo pokud budeNaN
poté, co bude vynucována na číslo. Jinými slovy, pokud obdrží hodnotu, kterou lze vynutit na číslo, vrátí isNaN () hodnotu false. -
Number.isNaN()
vrátítrue
pouze v případě, že hodnota je aktuálněNaN
.
Pokud tedy podporujete staré prohlížeče (zejména Internet Explorer), které nepodporují Number.isNan()
, pak je nejlepší zkontrolovat sebe-rovnost.