Controleren op NaN (“geen getal”) is net zo eenvoudig als controleren op zelfgelijkheid in JavaScript.
In JavaScript wordt de speciale waarde
NaN
(wat” geen getal “betekent) gebruikt om het resultaat weer te geven van een wiskundige berekening die niet kan worden weergegeven als een betekenisvol nummer. – Joshua Clanton over A Drip of JavaScript
De speciale waarde NaN
verschijnt in JavaScript wanneer Math
functies mislukken (Math.sqrt(-37)
) of wanneer een functie die probeert een nummer te parseren mislukt (parseInt("No integers here")
).
NaN
vergiftigt vervolgens alle andere wiskundige functies, wat leidt tot alle andere wiskundige bewerkingen resulterend in NaN
.
Merk op dat in JavaScript, delen door 0 retourneert Infinity
, niet NaN
:
Dit resultaat is vanwege hoe zwevende poi nt is gedefinieerd, meer in het algemeen dan alleen Javascript. Waarom? Ongeveer omdat 1/0 de limiet is van 1 / x als x nul nadert. En 0/0 heeft helemaal geen redelijke interpretatie, vandaar NaN
.
Wat is NaN eigenlijk?
NaN is een eigenschap van het globale object. De beginwaarde van NaN is Not-A-Number – hetzelfde als de waarde van Number.NaN. – MDN Docs
Controleren op NaN is moeilijker dan het lijkt
Helaas zijn er twee problemen bij het zoeken naar NaN
:
- De
typeof NaN
is” nummer “ -
NaN
is ongelijk aan elke andere waarde in JavaScript
Bekijk dit codevoorbeeld:
Dus hoe controleren we of we een NaN
waarde hebben die wiskunde vergiftigt?
Controleer op NaN met zelfgelijkheid
” NaN, en alleen NaN, zal ongelijk aan zichzelf vergelijken. ” – MDN Docs
In JavaScript is de beste manier om te controleren op NaN
door te controleren op zelfgelijkheid met behulp van een van de ingebouwde gelijkheidsoperatoren, ==
of ===
.
Omdat NaN
is niet gelijk aan zichzelf, NaN != NaN
retourneert altijd true
.
Natuurlijk, zo’n NaN
test in je code is niet altijd leesbaar, dus het is een goed idee om een opmerking te gebruiken of een wrapper-functie te maken:
Het maakt niet uit of je !=
of !==
om te controleren op NaN
.
Controleer op NaN met Object.is ()
” De
Object.is()
methode bepaalt of twee waarden dezelfde waarde hebben.”- MDN Docs
In tegenstelling tot de strikte en losse gelijkheidsoperatoren, houdt de ES6-helper-methode Object.is()
geen rekening met NaN
gelijk zijn aan zichzelf:
Dus als u ===
vervangt door Object.is()
, hoeft u zich geen zorgen te maken over het controleren op NaN
op een speciale manier. Probleem opgelost!
Ik schreef over het gebruik van Object.is()
in JavaScript in een ander artikel:
Een opmerking over terminologie – Object.is()
is een functie van de globale Object
klasse, ik noem het geen “gelijkheidsoperator” zoals ==
of ===
.
Bijvoorbeeld, in Jest-tests, de methode .toBe()
die ===
verschilt van de methode .toEqual()
die Object.is()
gebruikt.
Om af te ronden hier moet ik vermelden dat een JavaScript ES6 Set
, die wordt gebruikt om unieke waarden te vinden, slechts één kopie van een NaN
waarde.
Een woord over Getal .isNan ()
Modern JavaScript heeft al een implementatie om te controleren op NaN
genaamd Number.isNan()
die werkt zoals jij denkt het zou. Bijvoorbeeld:
Merk op dat Number.isNan()
verschilt van de globale isNan()
-functie, een oudere implementatie waarvan het werkelijke doel is om te controleren of een waarde niet kan worden afgedwongen tot een nummer.
Hier is het verschil, voor de volledigheid:
-
isNaN()
retourneerttrue
als de waarde momenteelNaN
is, of als hetNaN
wordt nadat het naar een getal is gedwongen. Met andere woorden, als het een waarde ontvangt die kan worden afgedwongen tot een getal, retourneert isNaN () false. -
Number.isNaN()
retourneerttrue
alleen als de waarde momenteelNaN
is.
Dus als u oude browsers ondersteunt (vooral Internet Explorer) die , dan is het het beste om te controleren op zelfgelijkheid.