Seit den frühesten Versionen der Funktionsspezifikation isNaN
ist das Verhalten für nicht numerische Argumente verwirrend. Wenn das Argument für die Funktion isNaN
nicht vom Typ Number ist, wird der Wert zuerst zu einer Number gezwungen. Der resultierende Wert wird dann getestet, um festzustellen, ob es sich um NaN
handelt. Für Nicht-Zahlen, die beim Erzwingen eines numerischen Typs zu einem gültigen nicht-NaN-numerischen Wert führen (insbesondere die leere Zeichenfolge und die booleschen Grundelemente, die beim Erzwingen numerische Werte null oder eins ergeben), kann der „falsche“ zurückgegebene Wert unerwartet sein. Die leere Zeichenfolge zum Beispiel ist sicherlich „keine Zahl“. Die Verwirrung ergibt sich aus der Tatsache, dass der Begriff „keine Zahl“ eine spezifische Bedeutung für Zahlen hat, die als IEEE-754-Gleitkommawerte dargestellt werden. Die Funktion sollte so interpretiert werden, dass sie die Frage beantwortet: „Ist dieser Wert, wenn er zu einem numerischen Wert gezwungen wird, ein IEEE-754-Wert“ Not A Number „?“
ECMAScript 2015 enthält die Number.isNaN()
-Funktion. Number.isNaN(x)
ist eine zuverlässige Methode, um zu testen, ob x
NaN
ist oder nicht. Selbst mit Number.isNaN
bleibt die Bedeutung von NaN
die genaue numerische Bedeutung und nicht „keine Zahl“. In Abwesenheit von Number.isNaN
ist der Ausdruck (x != x)
eine zuverlässigere Methode, um zu testen, ob die Variable x
ist NaN
oder nicht, da das Ergebnis nicht den Fehlalarmen unterliegt, die isNaN
unzuverlässig machen.
Eine Polyfüllung für isNaN
wäre (die Polyfüllung nutzt die eindeutige Eigenschaft von NaN
):