Nur aus Neugier.
Es scheint nicht sehr logisch, dass dies typeof NaN
eine Zahl ist. Übrigens genau wie NaN === NaN
oder NaN == NaN
falsch zurückgegeben. Ist dies eine der Besonderheiten von Javascript oder gibt es einen Grund dafür?
Edit: danke für deine antworten. Es ist jedoch nicht einfach, sich zurechtzufinden. Antworten lesen und das Wiki habe ich besser verstanden, aber trotzdem einen Satz wie
Ein Vergleich mit einem NaN liefert auch beim Vergleich mit sich selbst immer ein ungeordnetes Ergebnis. Die Vergleichsprädikate sind entweder signalisierend oder nicht signalisierend, die Signalisierungsversionen signalisieren eine ungültige Ausnahme für solche Vergleiche. Die Gleichheits- und Ungleichheitsprädikate sind nicht signalisierend, sodass x = x, das false zurückgibt, verwendet werden kann, um zu testen, ob x ein ruhiges NaN ist.
hält nur meinen Kopf in Bewegung. Wenn jemand dies in eine lesbare Sprache übersetzen kann (im Gegensatz beispielsweise zu einem Mathematiker), wäre ich dankbar.
quelle
isNumeric
vor, den Typ zu überprüfen:$.isNumeric(NaN);
gibt false zurück, wobei as$.type(NaN);
die Zahl zurückgibt. api.jquery.com/jQuery.isNumericAntworten:
Es bedeutet keine Zahl. Es ist keine Besonderheit von Javascript, sondern ein allgemeines Informatikprinzip.
Von http://en.wikipedia.org/wiki/NaN :
Alle diese Werte sind möglicherweise nicht gleich. Ein einfacher Test für ein NaN ist zu testen,
value == value
ist falsch.quelle
isNaN(value)
isNaN(undefined)
kehrt zurücktrue
, ist aberundefined == undefined
auch wahr. Gleiches gilt für alle anderen Nicht-Nummern-Typen außernull
.value !== value
ist wahrscheinlich der kürzeste Weg, um zu testen, obvalue
es wirklich istNaN
.Nun,
NaN
ist immer noch ein numerischer Typ , obwohl er eigentlich für Not-A-Number steht :-)NaN
bedeutet nur, dass der spezifische Wert nicht innerhalb der Grenzen des numerischen Typs dargestellt werden kann (obwohl dies für alle Zahlen gesagt werden könnte, die gerundet werden müssen, um zu passen, ist aberNaN
ein Sonderfall).Ein bestimmter Wert
NaN
wird nicht als gleichwertig angesehen,NaN
da es sich möglicherweise um unterschiedliche Werte handelt. Es handelt sich jedochNaN
immer noch um einen Zahlentyp, genau wie bei 2718 oder 31415.Zu Ihrer aktualisierten Frage, die in Laienbegriffen zu erklären ist:
Alles was dies bedeutet ist (in Teile zerlegt):
Grundsätzlich ist a
NaN
nicht gleich einer anderen Zahl, einschließlich einer anderenNaN
und sogar einschließlich sich selbst .Der Versuch, Vergleichsoperationen (kleiner als, größer als usw.) zwischen einer
NaN
und einer anderen Zahl durchzuführen, kann entweder dazu führen, dass eine Ausnahme ausgelöst wird (Signalisierung) oder als Ergebnis nur falsch wird (Nicht-Signalisierung oder leise).Tests auf Gleichheit (gleich, nicht gleich) signalisieren niemals, so dass ihre Verwendung keine Ausnahme verursacht. Wenn Sie eine reguläre Nummer haben
x
, ist diesx == x
immer der Fall. Wenn ax
istNaN
, dann istx == x
es immer falsch. Es gibt Ihnen eine Möglichkeit,NaN
leicht (leise) zu erkennen .quelle
typeof a === 'number'
bedeutet "a wird intern als IEEE 754-Float gespeichert"Infinity === Infinity
zurückgegeben,true
wenn einInfinity
mit unterschiedlichen Werten erzeugt werden kann: 1,0 / 0,0 oder 2,0 / 0,0?1/0
und2/0
liegen in der gleichen Klasse und (2) gibt es nur eine Klasse der Unendlichkeit in IEEE754 (außer+/-
natürlich).0/0
sind in keiner sinnvollen Weise definiert, außer zu sagen, dass ihr "Wert" die gesamte Menge ist von Zahlen. Und selbst wenn sie definiert wurden,Math.log(-1) == Math.log(-1)
wertet sie trotzdem ausfalse
. Es gibt also nicht nur keine "tatsächlichen Zahlen" außer,NaN
aber selbst wenn dies der Fall wäre, wurden sie nicht zum Vergleich herangezogen.Der ECMAScript (JavaScript) -Standard gibt an, dass
Numbers
es sich um IEEE 754- Floats handelt, dieNaN
einen möglichen Wert enthalten.quelle
typeof NaN
gibt zurück,'number'
weil:Laut ECMAScript-Spezifikation enthält der Nummerntyp NaN:
Also
typeof
kehrt entsprechend zurück:Dieses Verhalten entspricht dem IEEE-Standard für Gleitkomma-Arithmetik (IEEE 754) :
quelle
NaN ist ein gültiger Gleitkommawert ( http://en.wikipedia.org/wiki/NaN )
und NaN === NaN ist falsch, weil sie nicht unbedingt dieselbe Nichtzahl sind
quelle
Infinity
irgendwie identisch? Irgendwelche Gedanken?NaN != NaN
weil sie nicht notwendig sind, die gleiche Nicht-Nummer. Daher macht es sehr viel Sinn ... Auch warum Floats sowohl +0.00 als auch -0.00 haben, die nicht gleich sind. Rundungen können dazu führen, dass sie tatsächlich nicht Null sind.Der Typ hängt von der Sprache ab. Und die meisten Sprachen werden sagen, dass NaN ein Float, Double oder Number ist, je nachdem, wie sie es klassifizieren ... Ich kenne keine Sprachen, die sagen, dass dies ein unbekannter Typ oder Null ist.
quelle
number
,NaN
ist primitiv und somit eindeutig durch seinen Wert bestimmt.NaN
steht für Not a Number . Es ist ein Wert von numerischen Datentypen (normalerweise Gleitkommatypen, aber nicht immer), der das Ergebnis einer ungültigen Operation wie dem Teilen durch Null darstellt.Obwohl der Name besagt, dass es sich nicht um eine Zahl handelt, handelt es sich bei dem Datentyp, der verwendet wird, um einen numerischen Typ. Wenn Sie in JavaScript nach dem Datentyp von fragen,
NaN
wird dies zurückgegebennumber
(wiealert(typeof(NaN))
deutlich gezeigt wird).quelle
Infinity
nichtNaN
Javascript verwendet NaN, um alles darzustellen, auf das es stößt, und das durch seine Spezifikationen nicht anders dargestellt werden kann. Es bedeutet nicht, dass es keine Zahl ist. Es ist nur der einfachste Weg, die Begegnung zu beschreiben. NaN bedeutet, dass es oder ein Objekt, das sich darauf bezieht, nicht anders durch Javascript dargestellt werden kann. Für alle praktischen Zwecke ist es "unbekannt". Da es "unbekannt" ist, kann es Ihnen weder sagen, was es ist, noch ob es selbst ist. Es ist nicht einmal das Objekt, dem es zugewiesen ist. Es kann Ihnen nur sagen, was es nicht ist, und Nichts oder Nichts kann nur mathematisch in einer Programmiersprache beschrieben werden. Da es in der Mathematik um Zahlen geht, repräsentiert Javascript das Nichts als NaN. Das heißt nicht, dass es keine Zahl ist. Es bedeutet, dass wir es nicht anders lesen können, was Sinn macht. Deshalb kann es ' t gleich sich selbst gleich. Weil es nicht so ist.
quelle
Ein besserer Name für
NaN
eine genauere und weniger verwirrende Beschreibung seiner Bedeutung wäre eine numerische Ausnahme . Es ist wirklich eine andere Art von Ausnahmeobjekt, das als primitiver Typ getarnt ist (durch das Sprachdesign), wobei es gleichzeitig in seinem falschen Selbstvergleich nicht als primitiv behandelt wird. Woher die Verwirrung. Und solange sich die Sprache "nicht dazu entschließt", zwischen dem richtigen Ausnahmeobjekt und der primitiven Ziffer zu wählen , bleibt die Verwirrung bestehen.Die berüchtigte Ungleichheit von
NaN
sich selbst, beides==
und===
eine Manifestation des verwirrenden Entwurfs, der dieses Ausnahmeobjekt dazu zwingt, ein primitiver Typ zu sein. Dies bricht das Grundprinzip, dass ein Primitiv eindeutig durch seinen Wert bestimmt wird . WennNaN
es bevorzugt wird, als Ausnahme angesehen zu werden (von der es verschiedene Arten geben kann), sollte es nicht als primitiv "verkauft" werden. Und wenn es primitiv sein soll, muss dieses Prinzip gelten. Solange es kaputt ist, wie wir es in JavaScript getan haben und wir uns nicht wirklich zwischen beiden entscheiden können, bleibt die Verwirrung bestehen, die zu einer unnötigen kognitiven Belastung für alle Beteiligten führt. Was jedoch sehr einfach zu beheben ist, indem Sie einfach die Wahl zwischen beiden treffen:NaN
ein spezielles Ausnahmeobjekt, das nützliche Informationen darüber enthält, wie die Ausnahme aufgetreten ist, anstatt diese Informationen als derzeit implementiert wegzuwerfen, was zu einem schwieriger zu debuggenden Code führt.NaN
eine Entität vom primitiven Typnumber
(die weniger verwirrend als "numerisch" bezeichnet werden könnte), in welchem Fall sie sich selbst gleich sein sollte und keine anderen Informationen enthalten kann; Letzteres ist eindeutig eine schlechtere Wahl.Der einzig denkbare Vorteil zwingt
NaN
innumber
Art ist in der Lage , sie in jeden numerischen Ausdruck zurück zu werfen. Dies macht es jedoch zu einer spröden Wahl, da das Ergebnis eines numerischen AusdrucksNaN
entwederNaN
unvorhersehbare Ergebnisse enthält oder zu unvorhersehbaren Ergebnissen führt, z. B.NaN < 0
Auswertung zufalse
, dh Rückkehrboolean
statt Beibehaltung der Ausnahme.Und selbst wenn "die Dinge so sind, wie sie sind", hindert uns nichts daran, diese klare Unterscheidung für uns selbst zu treffen, um unseren Code vorhersehbarer und leichter debuggbar zu machen. In der Praxis bedeutet dies, diese Ausnahmen zu identifizieren und als Ausnahmen zu behandeln. Was leider mehr Code bedeutet, aber hoffentlich durch Tools wie TypeScript von Flowtype gemildert wird.
Und dann haben wir die Unterscheidung zwischen chaotisch leise und laut, auch bekannt als Signalisierung
NaN
. Dabei geht es wirklich darum, wie Ausnahmen behandelt werden, nicht um die Ausnahmen selbst und nichts anderes als andere Ausnahmen.In ähnlicher Weise sind
Infinity
und+Infinity
Elemente des numerischen Typs, die in der Verlängerung der reellen Linie auftreten, aber keine reellen Zahlen sind. Mathematisch können sie durch Folgen von reellen Zahlen dargestellt werden, die entweder zu+
oder konvergieren-Infinity
.quelle
Dies liegt einfach daran, dass
NaN
es sich um eine Eigenschaft des Number-Objekts in JS handelt. Es hat nichts damit zu tun, dass es sich um eine Zahl handelt.quelle
Number.fu = "bar"; alert(typeof Number.fu);
NaN
ist nicht der Wert, in dem gespeichert istNumber.NaN
, was auch immer es sein mag.NaN
ist ein primitiver Wert vom Typ Zahl. Und zusätzlich der WertNumber.NaN
istNaN
, aber das ist in keinem Zusammenhang.Der beste Weg, um an NAN zu denken, ist, dass es keine bekannte Zahl ist. Deshalb NAN! = NAN, weil jeder NAN-Wert eine eindeutige unbekannte Zahl darstellt. NANs sind erforderlich, da Gleitkommazahlen einen begrenzten Wertebereich haben. In einigen Fällen tritt eine Rundung auf, wenn die unteren Bits verloren gehen, was zu einem Unsinn wie 1.0 / 11 * 11! = 1.0 führt. Wirklich große Werte, die größer sind, sind NANs, wobei Unendlich ein perfektes Beispiel ist.
Da wir nur zehn Finger haben, ist jeder Versuch, Werte größer als 10 anzuzeigen, unmöglich. Dies bedeutet, dass solche Werte NANs sein müssen, da wir den wahren Wert dieses Werts größer als 10 verloren haben. Gleiches gilt für Gleitkommawerte, bei denen der Wert die Grenzen dessen überschreitet, was in einem Gleitkommawert gehalten werden kann.
quelle
Weil NaN ein numerischer Datentyp ist.
quelle
NaN
ist eine Zahl aus Sicht des Typs, aber keine normale Zahl wie 1, 2 oder 329131. Der Name "Not A Number" bezieht sich auf die Tatsache, dass der dargestellte Wert speziell ist und sich auf die IEEE- Formatspezifikationsdomäne bezieht, nicht Javascript-Sprachdomäne.quelle
Wenn Sie jQuery verwenden, ziehe ich es
isNumeric
vor, den Typ zu überprüfen:http://api.jquery.com/jQuery.isNumeric/
quelle
isNumber
demutil
Paket von Typescript. Gut, dass wir immer nochjQuery
in unserem Projekt verwenden, also haben Sie stattdessen Ihren Vorschlag verwendet.isNumber
fromutil
of typescript auchtrue
für zurückNaN
.Javascript hat nur einen numerischen Datentyp, nämlich den 64-Bit-Float mit doppelter Genauigkeit. Alles ist doppelt. NaN ist ein spezieller Wert von double, aber es ist trotzdem ein double.
Alles
parseInt
, was Sie tun müssen, ist, Ihre Zeichenfolge in einen numerischen Datentyp "umzuwandeln". Das Ergebnis ist also immer "Zahl". Nur wenn die ursprüngliche Zeichenfolge nicht analysierbar war, lautet ihr Wert NaN.quelle
NaN ist immer noch ein numerischer Typ, stellt jedoch einen Wert dar, der keine gültige Zahl darstellen kann.
quelle
Wir könnten argumentieren, dass NaN ein Sonderfallobjekt ist. In diesem Fall stellt das NaN-Objekt eine Zahl dar, die keinen mathematischen Sinn ergibt. Es gibt einige andere Sonderfallobjekte in der Mathematik wie INFINITE und so weiter.
Sie können noch einige Berechnungen damit durchführen, aber das führt zu seltsamen Verhaltensweisen.
Weitere Informationen hier: http://www.concentric.net/~ttwang/tech/javafloat.htm (Java-basiert, nicht Javascript)
quelle
Du musst Javascript lieben. Es hat einige interessante kleine Macken.
http://wtfjs.com/page/13
Die meisten dieser Macken können erklärt werden, wenn Sie aufhören, sie logisch zu erarbeiten, oder wenn Sie etwas über die Zahlentheorie wissen, aber sie können Sie trotzdem auffangen, wenn Sie nichts über sie wissen.
Übrigens empfehle ich, den Rest von http://wtfjs.com/ zu lesen - es gibt viel interessantere Macken als diese!
quelle
Der Wert NaN ist wirklich die Zahl.NaN. Wenn Sie also fragen, ob es sich um eine Zahl handelt, wird Ja angezeigt. Sie haben mit dem Aufruf isNaN () das Richtige getan.
Zur Information kann NaN auch durch Operationen an Zahlen zurückgegeben werden, die nicht wie Divisionen durch Null oder Quadratwurzel einer negativen Zahl definiert sind.
quelle
NaN == Number.NaN
bewertet zufalse
!NaN==NaN
Wesen vergessenfalse
, es muss ein Sadist gewesen sein, der das erfunden hat, um alle leiden zu lassen.Ein Beispiel
Stellen Sie sich vor, wir konvertieren eine Zeichenfolge in eine Zahl:
Wir haben den Datentyp in number geändert, aber sein Wert ist keine Zahl!
quelle
NaN
ist vom Nummerntyp . Die Frage ist warum.Es ist ein spezieller Wert vom Typ Zahl als POSITIVE_INFINITY
Warum? Von Entwurf
quelle