Så här söker du efter NaN i JavaScript

Det är lika enkelt att söka efter NaN (”inte ett nummer”) som att kontrollera om självjämlikhet är i JavaScript.

Dr. Derek Austin 🥳

Följ

15 sep 2019 · 4 min läsning

Foto av Rattap på Unsplash

I JavaScript används specialvärdet NaN (vilket betyder” inte ett tal ”) för att representera resultatet av en matematisk beräkning som inte kan representeras som ett meningsfullt nummer. – Joshua Clanton på A Drip of JavaScript

Det speciella värdet NaN visas i JavaScript när Math -funktioner misslyckas (Math.sqrt(-37)) eller när en funktion som försöker att analysera ett nummer misslyckas (parseInt("No integers here")).

NaN förgiftar sedan alla andra matematiska funktioner, vilket leder till alla andra matematiska operationer som resulterar i NaN.

Foto av Chris Barbalis på Unsplash

Observera att i JavaScript kommer division med 0 att returnera Infinity, inte NaN:

Detta resultat beror på hur flytande poi nt definieras mer generellt än bara Javascript. Varför? Ungefär, eftersom 1/0 är gränsen på 1 / x när x närmar sig noll. Och 0/0 har ingen rimlig tolkning alls, därav NaN.

Vad är NaN i alla fall?

NaN är en egenskap för det globala objektet. Det ursprungliga värdet av NaN är Not-A-Number – samma som värdet för Number.NaN. – MDN Docs

Foto av Andrew Buchanan på Unsplash

Kontroll av NaN är svårare än det verkar

Tyvärr finns det två problem med att försöka söka efter NaN:

  1. typeof NaN är” nummer ”
  2. NaN är ojämlikt med alla andra värden i JavaScript

Kolla in detta kodexempel:

Så hur kontrollerar vi om vi har ett NaN -värde som kommer att förgifta matematik?

Foto av Wolfgang Rottmann på Unsplash

Sök efter NaN med självjämlikhet

” NaN, och bara NaN, kommer att jämföra sig med sig själv. ” – MDN Docs

I JavaScript är det bästa sättet att söka efter NaN genom att kontrollera självjämlikhet använder någon av de inbyggda jämställdhetsoperatorerna, == eller ===.

Eftersom NaN är inte lika med sig själv, NaN != NaN returnerar alltid true.

Naturligtvis ett sådant NaN test i din kod är inte alltid läsbart, så det är en bra idé att använda en kommentar eller skapa en omslagningsfunktion:

Det gör ingen skillnad om du använder != eller !== för att söka efter NaN.

Foto av Erik Mclean på Unsplash

Sök efter NaN med Object.is ()

Object.is() -metoden avgör om två värden är samma värde.”- MDN Docs

Till skillnad från de strikta och lösa likhetsoperatorerna anser ES6-hjälparmetoden Object.is() inte NaN för att vara lika med sig själv:

Så om du byter ut === mot Object.is() behöver du aldrig oroa dig om att söka efter NaN något speciellt sätt. Problem löst!

Jag skrev om hur man använder Object.is() i JavaScript i en annan artikel:

En anmärkning om terminologi – Object.is() är en funktion i den globala Object -klassen, jag kallar det inte för en ”jämställdhetsoperator” som == eller ===.

Till exempel, i Jest-tester, metoden .toBe() som använder === skiljer sig från metoden .toEqual() som använder Object.is().

För att avsluta här bör jag nämna att en JavaScript ES6 Set, som används för att hitta unika värden, bara kommer att behålla en kopia av en NaN värde.

Foto av Tony Hand på Unsplash

Ett ord om Number .isNan ()

Modern JavaScript har redan en implementering att söka efter NaN kallad Number.isNan() som fungerar hur du tycker det skulle. Till exempel:

Observera att Number.isNan() skiljer sig från den globala isNan() -funktionen, vilket är en äldre implementering vars verkliga syfte är att kontrollera om ett värde inte kan tvingas till en nummer.

Här är skillnaden för fullständighet:

  • isNaN() kommer att returnera true om värdet för närvarande är NaN, eller om det kommer att vara NaN efter att det tvingats till ett tal. Med andra ord, om den får ett värde som kan tvingas till ett tal, kommer isNaN () att returnera falskt.
  • Number.isNaN() returnerar true endast om värdet för närvarande är NaN.

Så om du stöder gamla webbläsare (särskilt Internet Explorer) som inte stöder Number.isNan(), då är det bäst att kontrollera självjämlikhet.

Foto av Nick Hillier på Unsplash

Leave a Reply

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *