Verificarea NaN („nu un număr”) este la fel de simplă ca verificarea egalității de sine în JavaScript.
În JavaScript, valoarea specială
NaN
(adică„ nu un număr ”) este utilizată pentru a reprezenta rezultatul unui calcul matematic care nu poate fi reprezentat ca un număr semnificativ. – Joshua Clanton pe A Drip of JavaScript
Valoarea specială NaN
apare în JavaScript când Math
funcțiile eșuează (Math.sqrt(-37)
) sau când o funcție care încearcă să analizeze un număr eșuează (parseInt("No integers here")
).
NaN
apoi otrăvește toate celelalte funcții matematice, ducând la toate celelalte operații matematice rezultând NaN
.
Rețineți că în JavaScript, împărțirea la 0 returnează Infinity
, nu NaN
:
Acest rezultat se datorează modului în care floating-poi nt este definit, mai general decât Javascript. De ce? Aproximativ, deoarece 1/0 este limita de 1 / x pe măsură ce x se apropie de zero. Și 0/0 nu are deloc o interpretare rezonabilă, prin urmare NaN
.
Ce este oricum NaN?
NaN este o proprietate a obiectului global. Valoarea inițială a NaN este Not-A-Number – aceeași cu valoarea Number.NaN. – Documente MDN
Verificarea NaN este mai dificilă decât pare
Din păcate, există două probleme la încercarea de a verifica NaN
:
-
typeof NaN
este” număr „ -
NaN
este inegal cu orice altă valoare din JavaScript
Consultați acest exemplu de cod:
Deci, cum putem verifica dacă avem o valoare NaN
care va otrăvi matematica?
Verificați dacă există NaN cu egalitate de sine
” NaN și numai NaN se vor compara inegal cu el însuși. ” – Documente MDN
În JavaScript, cel mai bun mod de a verifica NaN
este verificarea egalității de sine utilizând oricare dintre operatorii de egalitate încorporați, ==
sau ===
.
Deoarece NaN
nu este egal cu el însuși, NaN != NaN
va reveni întotdeauna true
.
Desigur, un astfel de NaN
test în codul dvs. nu este întotdeauna lizibil, deci este o idee bună să utilizați un comentariu sau să creați o funcție de împachetare:
Nu face nicio diferență dacă utilizați !=
sau !==
pentru a verifica dacă există NaN
.
Căutați NaN cu Object.is ()
”
Object.is()
determină dacă două valori sunt aceeași valoare.”- MDN Docs
Spre deosebire de operatorii de egalitate stricți și slabi, metoda de ajutor ES6 Object.is()
nu ia în considerare NaN
să fie egal cu el însuși:
Deci, dacă schimbați ===
cu Object.is()
, nu trebuie să vă faceți griji niciodată despre verificarea NaN
în orice mod special. Problemă rezolvată!
Am scris despre cum să folosesc Object.is()
în JavaScript într-un alt articol:
O notă despre terminologie – Object.is()
este o funcție din clasa globală Object
, nu o numesc „operator de egalitate” precum ==
sau ===
.
De exemplu, în testele Jest, metoda .toBe()
care utilizează este diferit de metoda .toEqual()
care folosește Object.is()
.
Pentru a încheia aici, ar trebui să menționez că un JavaScript ES6 Set
, care este utilizat pentru găsirea unor valori unice, va păstra o singură copie a unui NaN
valoare.
Un cuvânt despre Number .isNan ()
JavaScript modern are deja o implementare pentru a verifica NaN
numit Number.isNan()
care funcționează cum credeți ar fi. De exemplu:
Rețineți că Number.isNan()
este diferit de funcția globală isNan()
, care este o implementare mai veche al cărei scop real este de a verifica dacă o valoare nu poate fi constrânsă la o număr.
Iată diferența, pentru completare:
-
isNaN()
va returnatrue
dacă valoarea este în prezentNaN
sau dacă va fiNaN
după ce va fi constrânsă la un număr. Cu alte cuvinte, dacă primește o valoare care poate fi constrânsă la un număr, isNaN () va returna false. -
Number.isNaN()
va returnatrue
numai dacă valoarea este în prezentNaN
.
Deci, dacă acceptați browsere vechi (în special Internet Explorer) care nu acceptă Number.isNan()
, atunci cel mai bine este să verificați egalitatea de sine.