Sådan kontrolleres der for NaN i JavaScript

Det er lige så simpelt at kontrollere for NaN (“ikke et tal”) som at kontrollere for selvstændighed i JavaScript.

Dr. Derek Austin 🥳

Følg

15. sep 2019 · 4 min læsning

Foto af Rattap på Unsplash

I JavaScript bruges den specielle værdi NaN (hvilket betyder” ikke et tal “) til at repræsentere resultatet af en matematisk beregning, der ikke kan repræsenteres som et meningsfuldt tal. – Joshua Clanton on A Drip of JavaScript

Den specielle værdi NaN vises i JavaScript, når Math -funktioner mislykkes (Math.sqrt(-37)), eller når en funktion, der forsøger at parse et nummer mislykkes (parseInt("No integers here")).

NaN forgifter derefter alle andre matematiske funktioner, hvilket fører til alle andre matematiske operationer, hvilket resulterer i NaN.

Foto af Chris Barbalis på Unsplash

Bemærk at i JavaScript returnerer division med 0 Infinity, ikke NaN:

Dette resultat skyldes, at flydende poi nt er defineret mere generelt end bare Javascript. Hvorfor? Groft, fordi 1/0 er grænsen på 1 / x, når x nærmer sig nul. Og 0/0 har overhovedet ingen rimelig fortolkning, derfor NaN.

Hvad er NaN alligevel?

NaN er en egenskab for det globale objekt. Den oprindelige værdi af NaN er ikke-A-nummer – det samme som værdien for Number.NaN. – MDN Docs

Foto af Andrew Buchanan på Unsplash

Det er sværere at kontrollere NaN end det ser ud

Desværre er der to problemer med at forsøge at kontrollere NaN:

  1. typeof NaN er” nummer “
  2. NaN er ulige alle andre værdier i JavaScript

Tjek dette kodeeksempel:

Så hvordan kontrollerer vi, om vi har en NaN -værdi, der vil forgifte matematik?

Foto af Wolfgang Rottmann på Unsplash

Kontroller for NaN med selvligestilling

” NaN, og kun NaN, sammenlignes ulige med sig selv. ” – MDN Docs

I JavaScript er den bedste måde at tjekke for NaN ved at kontrollere for selvligestilling ved hjælp af en af de indbyggede lighedsoperatorer == eller ===.

Fordi NaN er ikke lig med sig selv, NaN != NaN returnerer altid true.

Selvfølgelig sådan en NaN test i din kode er ikke altid læsbar, så det er en god idé at bruge en kommentar eller oprette en wrapper-funktion:

Det betyder ikke nogen forskel, hvis du bruger != eller !== for at kontrollere NaN.

Foto af Erik Mclean på Unsplash

Kontroller for NaN med Object.is ()

Object.is() metode bestemmer, om to værdier er den samme værdi.”- MDN Docs

I modsætning til de strenge og løse ligestillingsoperatører overvejer ES6-hjælpemetoden Object.is() ikke NaN for at være lig med sig selv:

Så hvis du bytter === til Object.is(), behøver du aldrig bekymre dig om at kontrollere for NaN på en hvilken som helst særlig måde. Problem løst!

Jeg skrev om, hvordan man bruger Object.is() i JavaScript i en anden artikel:

En note om terminologi – Object.is() er en funktion på den globale Object klasse, jeg kalder det ikke en “ligestillingsoperator” som == eller ===.

For eksempel i metoden Jest er metoden .toBe(), der bruger === adskiller sig fra metoden .toEqual(), der bruger Object.is().

For at afslutte her skal jeg nævne, at en JavaScript ES6 Set, som bruges til at finde unikke værdier, kun nogensinde vil beholde en kopi af en NaN værdi.

Foto af Tony Hand på Unsplash

Et ord om nummer .isNan ()

Moderne JavaScript har allerede en implementering, der skal kontrolleres for NaN kaldet Number.isNan(), der fungerer, hvordan du tænker det ville. For eksempel:

Bemærk, at Number.isNan() er forskellig fra den globale isNan() funktion, som er en ældre implementering, hvis egentlige formål er at kontrollere, om en værdi ikke kan tvinges til en nummer.

Her er forskellen for fuldstændighed:

  • isNaN() returnerer true hvis værdien i øjeblikket er NaN, eller hvis den vil være NaN, efter at den er tvunget til et tal. Med andre ord, hvis den modtager en værdi, der kan tvinges til et tal, returnerer isNaN () falsk.
  • Number.isNaN() returnerer true kun, hvis værdien i øjeblikket er NaN.

Så hvis du understøtter gamle browsere (især Internet Explorer), der ikke understøtter Number.isNan(), så er det bedst at kontrollere selvligestilling.

Foto af Nick Hillier på Afbrydelse

Leave a Reply

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *