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 NaNje“ číslo „ -
NaNse 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ítruepokud je hodnota aktuálněNaN, nebo pokud budeNaNpoté, 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ítruepouze 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.