Det er like enkelt å se etter NaN («ikke et tall») som å sjekke om det er likeverd i JavaScript.
I JavaScript brukes den spesielle verdien
NaN
(som betyr» ikke et tall «) for å representere resultatet av en matematisk beregning som ikke kan representeres som et meningsfylt tall. – Joshua Clanton on A Drip of JavaScript
Spesialverdien NaN
vises i JavaScript når Math
funksjoner mislykkes (Math.sqrt(-37)
) eller når en funksjon som prøver å parsere et nummer mislykkes (parseInt("No integers here")
).
NaN
forgifter deretter alle andre matematiske funksjoner, noe som fører til alle andre matematiske operasjoner som resulterer i NaN
.
Merk at divisjon med 0 i JavaScript returnerer Infinity
, ikke NaN
:
Dette resultatet er på grunn av hvor flytende poi nt er definert, mer generelt enn bare Javascript. Hvorfor? Omtrent, fordi 1/0 er grensen på 1 / x når x nærmer seg null. Og 0/0 har ingen rimelig tolkning i det hele tatt, derav NaN
.
Hva er NaN uansett?
NaN er en egenskap for det globale objektet. Den opprinnelige verdien av NaN er Not-A-Number – den samme som verdien for Number.NaN. – MDN Docs
Det er vanskeligere å sjekke for NaN
Dessverre er det to problemer med å prøve å se etter NaN
:
-
typeof NaN
er» nummer « -
NaN
er ulik alle andre verdier i JavaScript
Sjekk dette kodeeksemplet:
Så hvordan sjekker vi om vi har en NaN
-verdi som vil forgifte matematikk?
Sjekk for NaN med selvtillit
» NaN, og bare NaN, vil sammenligne ulikt med seg selv. » – MDN Docs
I JavaScript er den beste måten å sjekke for NaN
ved å sjekke om det er likeverdighet bruker en av de innebygde likhetsoperatorene, ==
eller ===
.
Fordi NaN
er ikke lik seg selv, NaN != NaN
vil alltid returnere true
.
Selvfølgelig en slik NaN
test i koden din er ikke alltid lesbar, så det er lurt å bruke en kommentar eller lage en wrapper-funksjon:
Det gjør ingen forskjell hvis du bruker !=
eller !==
for å se etter NaN
.
Se etter NaN med Object.is ()
»
Object.is()
metoden avgjør om to verdier er den samme verdien.”- MDN Docs
I motsetning til de strenge og løse likhetsoperatørene, vurderer ikke ES6-hjelpemetoden Object.is()
NaN
for å være lik seg selv:
Så hvis du bytter ut ===
for Object.is()
, trenger du aldri å bekymre deg om å se etter NaN
noen spesiell måte. Problem løst!
Jeg skrev om hvordan du bruker Object.is()
i JavaScript i en annen artikkel:
Ett notat om terminologi – Object.is()
er en funksjon på den globale Object
klassen, jeg kaller det ikke en «likhetsoperator» som ==
eller ===
.
For eksempel, i Jest-tester, metoden .toBe()
som bruker ===
er forskjellig fra metoden .toEqual()
som bruker Object.is()
.
For å avslutte her bør jeg nevne at en JavaScript ES6 Set
, som brukes til å finne unike verdier, bare vil beholde en kopi av en NaN
verdi.
Et ord om nummer .isNan ()
Moderne JavaScript har allerede en implementering å se etter NaN
kalt Number.isNan()
som fungerer slik du tenker det ville. For eksempel:
Merk at Number.isNan()
er forskjellig fra den globale isNan()
-funksjonen, som er en eldre implementering hvis faktiske formål er å sjekke om en verdi ikke kan tvinges til en nummer.
Her er forskjellen for fullstendighet:
-
isNaN()
vil returneretrue
hvis verdien for øyeblikket erNaN
, eller hvis den kommer til å bliNaN
etter at den er tvunget til et tall. Med andre ord, hvis den mottar en verdi som kan tvinges til et tall, vil isNaN () returnere false. -
Number.isNaN()
vil returneretrue
bare hvis verdien for øyeblikket erNaN
.
Så hvis du støtter gamle nettlesere (spesielt Internet Explorer) som ikke støtter Number.isNan()
, så er det best å sjekke om det er likeverd.