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

Benutzer-Avatar
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? undefined ist 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 undefined ist 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

Benutzer-Avatar
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

z.B Object.is(NaN, NaN) => true

Beziehen auf https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is

  • 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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN

  • Number.isNaN(NaN) === Number.isNaN(undefined) wird zu false aufgelöst

    – Mario Ruiz

    8. November 2019 um 18:02 Uhr

1055570cookie-checkVergleich von NaN-Werten auf Gleichheit in Javascript

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy