javascript - De ce typeof NaN returnează 'number'?


Doar din curiozitate.

Nu pare foarte logic că typeof NaN este number. La fel cum NaN === NaN sau NaN == NaN returnează false, apropo. Este aceasta una dintre particularitățile JavaScript, sau ar exista un motiv pentru asta?

Editare: mulțumesc pentru răspunsurile voastre. Nu este totuși un lucru ușor de înțeles. Citind răspunsurile și wiki-ul am înțeles mai multe, dar totuși, o propoziție de genul

O comparație cu un NaN returnează întotdeauna un rezultat neordonat chiar și atunci când se compară cu sine. Predicații de comparație sunt fie cu semnalizare, fie fără semnalizare, versiunile cu semnalizare semnalează o excepție invalidă pentru astfel de comparații. Predicațiile de egalitate și inegalitate sunt fără semnalizare, deci x=x returnând fals poate fi folosit pentru a testa dacă x este un NaN liniștit.

doar îmi face capul să se învârtească. Dacă cineva poate să traducă asta într-o limbă umană (spre deosebire de, să zicem, limbajul matematicianului) ușor de citit, aș fi recunoscător.

[addendum 2023/06] Am creat un mic modul pentru verificarea tipului oricărui lucru în ES. Poate fi util, verifică-l pe @GitHub

Răspuns #1

Ei bine, poate părea puțin ciudat că ceva numit „nu este un număr” este considerat un număr, dar NaN este totuși un tip numeric, în ciuda acestui fapt :-)

NaN înseamnă doar că valoarea specifică nu poate fi reprezentată în limitele tipului numeric (deși acest lucru s-ar putea spune pentru toate numerele care trebuie rotunjite pentru a se potrivi, dar NaN este un caz special).

Un NaN specific nu este considerat egal cu un alt NaN deoarece ele pot fi valori diferite. Cu toate acestea, NaN este încă un tip numeric, la fel ca 2718 sau 31415.


În ceea ce privește întrebarea dumneavoastră actualizată de a explica în termeni simpli:

O comparație cu un NaN întotdeauna returnează un rezultat neordonat chiar și atunci când se compară cu el însuși. Predicatele de comparație sunt fie semnalizante, fie ne-semnanalizante; versiunile semnalizante semnalează o excepție invalidă pentru astfel de comparații. Predicatele de egalitate și inegalitate sunt ne-semnanalizante, astfel încât x=x returnând fals poate fi folosit pentru a testa dacă x este un NaN liniștit.

Toate acestea înseamnă (descompus pe părți):

O comparație cu un NaN returnează întotdeauna un rezultat neordonat chiar și atunci când se compară cu el însuși.

Practic, un NaN nu este egal cu niciun alt număr, inclusiv cu alt NaN, și chiar inclusiv cu el însuși.

Predicatele de comparație sunt fie semnalizatoare, fie nesemnalizatoare, versiunile semnalizatoare indică o excepție invalidă pentru astfel de comparații.

Încercarea de a efectua operații de comparație (<, > și așa mai departe) între un NaN și un alt număr poate rezulta fie într-aruncarea unei excepții (semnalizare), fie obținerea pur și simplu a valorii false ca rezultat (non-semnalizare sau liniștit).

Predicatele de egalitate și inegalitate nu transmit semnale, așa că x=x care returnează fals poate fi folosit pentru a verifica dacă x este un NaN liniștit.

Testele de egalitate (egal cu, diferit de) nu generează niciodată semnale, așa că utilizarea lor nu va cauza o excepție. Dacă aveți un număr obișnuit x, atunci x == x va fi întotdeauna adevărat. Dacă x este un NaN, atunci x == x va fi întotdeauna fals. Aceasta îți oferă o modalitate de a detecta NaN ușor (în tăcere).

Răspunsul #2

Înseamnă Nu este un Număr. Nu este o particularitate a JavaScript, ci un principiu comun al informaticii.

De la http://en.wikipedia.org/wiki/NaN:

Există trei tipuri de operații care returnează NaN:

Operații cu un NaN ca cel puțin un operand

Forme nedeterminate

  • Împărțirile 0/0, ∞/∞, ∞/−∞, −∞/∞ și −∞/−∞
  • Înmulțirile 0×∞ și 0×−∞
  • Puterea 1^∞
  • Adunările ∞ + (−∞), (−∞) + ∞ și scăderile echivalente.

Operațiuni reale cu rezultate complexe:

  • Rădăcina pătrată a unui număr negativ
  • Logaritmul unui număr negativ
  • Tangenta unui multiplu impar de 90 de grade (sau π/2 radiani)
  • Sineul invers sau cosinusul unui număr care este mai mic decât −1 sau mai mare decât +1.

Toate aceste valori s-ar putea să nu fie la fel. Un test simplu pentru un NaN este să verifici dacă value == value este fals.

Răspunsul #3

Standardul ECMAScript (JavaScript) specifică faptul că Numbers sunt float-uri IEEE 754, care includ NaN ca valoare posibilă.

ECMA 262 5e Secțiunea 4.3.19: Valoare numerică

valoare primitivă corespunzătoare unei valori în format binar pe 64 de biți cu precizie dublă IEEE 754.

ECMA 262 5e Secțiunea 4.3.23: NaN

Valoare numerică care este o valoare IEEE 754 „Not-a-Number”.

IEEE 754 pe Wikipedia

Standardul IEEE pentru aritmetica în virgulă mobilă este un standard tehnic stabilit de Institutul Inginerilor în Electricitate și Electronică și cel mai utilizat standard pentru calculul în virgulă mobilă [...]

Standardul definește

  • formate aritmetice: seturi de date în virgulă mobilă binare și zecimale, care constau în numere finite (inclusiv zerouri cu semn și numere subnormale), infinituri și valori speciale „nu este un număr” (NaN)

[...]