Slik sjekker du for NaN i JavaScript

Det er like enkelt å se etter NaN («ikke et tall») som å sjekke om det er likeverd i JavaScript.

Dr. Derek Austin 🥳

Følg

15. sep 2019 · 4 min les

Foto av Rattap på Unsplash

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.

Foto av Chris Barbalis på Unsplash

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

Foto av Andrew Buchanan på Unsplash

Det er vanskeligere å sjekke for NaN

Dessverre er det to problemer med å prøve å se etter NaN:

  1. typeof NaN er» nummer «
  2. 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?

Foto av Wolfgang Rottmann på Unsplash

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.

Foto av Erik Mclean på Unsplash

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.

Foto av Tony Hand på Unsplash

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 returnere true hvis verdien for øyeblikket er NaN, eller hvis den kommer til å bli NaN 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 returnere true bare hvis verdien for øyeblikket er NaN.

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.

Foto av Nick Hillier på Avslutt

Leave a Reply

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *