Vergleich von NaN-Werten auf Gleichheit in Javascript
Lesezeit: 5 Minuten
Ich muss zwei numerische Werte auf Gleichheit in Javascript vergleichen. Die Werte können sein NaN auch. Ich habe mir diesen Code ausgedacht:
if (val1 == val2 || isNaN(val1) && isNaN(val2)) ...
Das funktioniert gut, aber es sieht für mich aufgebläht aus. Ich würde es gerne prägnanter machen. Irgendwelche Ideen?
Mischen || und && ohne einige Klammern ist extrem hässlich und verwirrend.
– Meister der Diebe
22. Januar 2012 um 22:42 Uhr
NaN und NaN sollen aus einem bestimmten Grund ungleich sein, weil z. 0/0 und parseInt("not a number!")während sie beide bewerten NaNsollten nicht als gleich angesehen werden.
– Peter Olsen
22. Januar 2012 um 22:44 Uhr
@Peter manchmal ist dieser Unterschied für den Algorithmus irrelevant. Ich denke, das ist beim OP der Fall.
– drigoangelo
28. Februar 2014 um 13:11 Uhr
if(val1 == val2 || (isNaN(val1) && isNaN(val2)))
Nichts zu verbessern. Fügen Sie einfach die Klammern hinzu, um es allen klar zu machen.
Ich würde es mit einem Kommentar verbessern, der erklärt, warum sollte NaN === NaN Rückgabe wahr.
– Esailija
22. Januar 2012 um 22:50 Uhr
Davidkammern
Vermeiden isNaN. Sein Verhalten ist irreführend:
isNaN(undefined) // true
_.isNaN (aus Unterstrich.js) ist eine elegante Funktion, die sich wie erwartet verhält:
// Is the given value `NaN`?
//
// `NaN` is the only value for which `===` is not reflexive.
_.isNaN = function(obj) {
return obj !== obj;
};
_.isNaN(undefined) // false
_.isNaN(0/0) // true
Was ist falsch mit isNaN(undefined) Sein true? undefinedist keine Zahl. Was scheint hier für Sie so irreführend zu sein?
– trejder
18. Juli 2013 um 7:39 Uhr
@trejder: NaN und undefined sind unterschiedliche Werte. Anderer Wert Typeneben.
– Davidkammern
22. Juli 2013 um 17:25 Uhr
@davidchambers: Stimmt. Was nichts an der Tatsache ändert, dass undefinedist nicht eine Zahl. Was uns zu einer Schlussfolgerung führt, dass isNaN(undefined)sollte Rückkehr true. Die Tatsache, dass NaN und undefined sind unterschiedliche Werte und unterschiedliche Werttypen, ändert nichts an meinem Zustand. Da dies eine ganz andere Geschichte ist. Oder weisen Sie mich darauf hin, wo ich falsch liege.
– trejder
23. Juli 2013 um 8:05 Uhr
@trejder: Wir haben unterschiedliche Vorstellungen, welche Frage isNaN beantworten soll. Sie glauben isNaN(x) sollte gleichwertig sein !isNumber(x), während ich vorschlage, dass es uns sagen sollte, ob der Wert von x genau NaN ist. Will man wissen, ob ein Wert keine Zahl ist, Object.prototype.toString.call(x) !== '[object Number]' ist vorzuziehen, da es keine konkurrierenden Interpretationen zulässt.
– Davidkammern
30. Juli 2013 um 18:19 Uhr
@drigoangelo: Wenn du gerne schreibst if (x !== x) und vertrauen Sie darauf, dass alle aktuellen und zukünftigen Mitglieder Ihres Teams verstehen werden, was das bewirkt, großartig. Wenn nicht, wäre es schön, eine Funktion zu haben, die die Frage beantwortet: Ist dieser Wert NaN? Leider ist das eingebaute isNaN nicht diese Funktion.
– Davidkammern
28. Februar 2014 um 18:10 Uhr
Eine Ameise
Versuchen Sie es mit Object.is(), bestimmt es, ob zwei Werte derselbe Wert sind. Zwei Werte sind gleich, wenn einer der folgenden Punkte zutrifft:
beide undefined
beide null
beide true oder beides false
beide Zeichenfolgen der gleichen Länge mit den gleichen Zeichen in der gleichen Reihenfolge
beide das gleiche Objekt
beide Zahlen und
beide +0
beide -0
beide NaN
oder beide ungleich Null und beide nicht NaN und beide haben den gleichen Wert
Gute Antwort für modernes Javascript. Pass einfach auf, weil 0 === -0 kehrt zurück true aber Object.is(0, -0) kehrt zurück false. Für den Anwendungsfall des Fragestellers müssen Sie möglicherweise Folgendes tun val1 === val2 || Object.is(val1, val2).
– Michael Kropat
1. Oktober 2018 um 19:33 Uhr
wusste nie von diesem +1. Vielen Dank
– Pariola
29. Dezember 2018 um 23:20 Uhr
if ( val1 === val2 )
Wenn einer oder beide sind NaN es wird als falsch ausgewertet.
Ebenfalls, NaN !== NaN
Solange Sie wissen, dass diese beiden Variablen numerisch sind, können Sie Folgendes versuchen:
if (val1 + '' == val2 + '')
Es wandelt die beiden Werte in Strings um. Eine lustige Antwort, aber es sollte funktionieren. 🙂
Es wird nicht immer ein identisches Ergebnis mit dem ursprünglichen Code liefern, aber in den Fällen, in denen es variieren würde, kann es ein bevorzugtes Verhalten sein. Zum Beispiel " " == 0;welches ist truewird aber sein false mit deinem Code. Dies kann als Verbesserung angesehen werden.
– Benutzer1106925
22. Januar 2012 um 23:22 Uhr
NaN ist unabhängig von der Vergleichsmethode nie gleich sich selbst, daher wäre die einzige prägnantere Lösung für Ihr Problem, die mir einfällt, das Erstellen eines Funktionsaufrufs mit einem beschreibenden Namen für diesen ziemlich speziellen Vergleich und die Verwendung dieser Vergleichsfunktion in Ihrem stattdessen codieren.
Das hätte auch den Vorteil, dass Änderungen am Algorithmus an dem Tag lokalisiert werden, an dem Sie entscheiden, dass undefiniert auch gleich undefiniert sein sollte.
Es wird nicht immer ein identisches Ergebnis mit dem ursprünglichen Code liefern, aber in den Fällen, in denen es variieren würde, kann es ein bevorzugtes Verhalten sein. Zum Beispiel " " == 0;welches ist truewird aber sein false mit deinem Code. Dies kann als Verbesserung angesehen werden.
– Benutzer1106925
22. Januar 2012 um 23:22 Uhr
Und was ist mit der Funktion Zahl.istNaN() ? Ich glaube, dass dies verwendet werden muss, wann immer es möglich ist.
> NaN === NaN
false
> Number.isNaN
ƒ isNaN() { [native code] }
> Number.isNaN() === Number.isNaN()
true
Mischen
||
und&&
ohne einige Klammern ist extrem hässlich und verwirrend.– Meister der Diebe
22. Januar 2012 um 22:42 Uhr
NaN
undNaN
sollen aus einem bestimmten Grund ungleich sein, weil z.0/0
undparseInt("not a number!")
während sie beide bewertenNaN
sollten nicht als gleich angesehen werden.– Peter Olsen
22. Januar 2012 um 22:44 Uhr
@Peter manchmal ist dieser Unterschied für den Algorithmus irrelevant. Ich denke, das ist beim OP der Fall.
– drigoangelo
28. Februar 2014 um 13:11 Uhr