Det er lige så simpelt at kontrollere for NaN (“ikke et tal”) som at kontrollere for selvstændighed i JavaScript.
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
.
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
Det er sværere at kontrollere NaN end det ser ud
Desværre er der to problemer med at forsøge at kontrollere NaN
:
-
typeof NaN
er” nummer “ -
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?
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
.
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.
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()
returnerertrue
hvis værdien i øjeblikket erNaN
, eller hvis den vil væreNaN
, 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()
returnerertrue
kun, hvis værdien i øjeblikket erNaN
.
Så hvis du understøtter gamle browsere (især Internet Explorer), der ikke understøtter Number.isNan()
, så er det bedst at kontrollere selvligestilling.