Die in JavaScript integrierte isNaN- Funktion ist - wie standardmäßig zu erwarten - ein "Dynamic Type Operator". Daher alle Werte, die (während des DTC-Prozesses) ein einfaches true | ergeben können falsch wie "", " ", " 000"
, kann nicht NaN sein.
Dies bedeutet, dass das angegebene Argument zunächst wie folgt konvertiert wird :
function isNaNDemo(arg){
var x = new Number(arg).valueOf();
return x != x;
}
Erläuterung:
In der obersten Zeile des Funktionskörpers versuchen wir (zuerst), das Argument erfolgreich in ein Zahlenobjekt umzuwandeln. Und (zweitens) mit dem Punktoperator entfernen wir - zu unserer eigenen Bequemlichkeit - sofort den primitiven Wert des erstellten Objekts.
In der zweiten Zeile nehmen wir den im vorherigen Schritt erhaltenen Wert und den Vorteil der Tatsache, dass NaN mit nichts im Universum gleich ist, nicht einmal mit sich selbst, z. B.: NaN == NaN >> false
Um es endgültig (wegen Ungleichheit) mit sich selbst zu vergleichen .
Auf diese Weise liefert die Funktionsrückgabe nur dann true , wenn und nur wenn die angegebene Argumentrückgabe ein fehlgeschlagener Konvertierungsversuch in ein Zahlenobjekt ist, dh eine Zahl ohne Zahl; zB NaN.
isNaNstatic ()
Für einen Operator vom statischen Typ können wir jedoch - falls erforderlich und bei Bedarf - eine weitaus einfachere Funktion schreiben, z.
function isNaNstatic(x){
return x != x;
}
Vermeiden Sie den DTC insgesamt, damit das Argument false zurückgibt, wenn es nicht explizit eine NaN-Nummer ist. Testen Sie daher gegen Folgendes:
isNaNStatic(" x"); // will return false
weil es immer noch eine Schnur ist.
Allerdings:
isNaNStatic(1/"x"); // will of course return true.
wie zum Beispiel isNaNStatic(NaN); >> true
.
Aber im Gegensatz dazu isNaN
ist das, isNaNStatic("NaN"); >> false
weil es (das Argument) eine gewöhnliche Zeichenfolge ist.
ps: Die statische Version von isNaN kann in modernen Codierungsszenarien sehr nützlich sein. Und es kann sehr wohl einer der Hauptgründe sein, warum ich mir die Zeit genommen habe, dies zu veröffentlichen.
Grüße.