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 NaNeste” număr „ -
NaNeste 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 returnatruedacă valoarea este în prezentNaNsau dacă va fiNaNdupă 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 returnatruenumai 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.