Diskussion Strikte Gleichheit per 'x === y' und Object.is(x, y): Unterschiedliche Ergebnisse?

Mat

Aktives Mitglied
Hab gerade eben erfahren, dass Object.is(NaN, NaN) == true ist (anders als bei NaN === NaN).
Ist das eine Eigenart die nur das Number-Objekt betrifft oder gibt's noch mehr Unterschiede?

=== lässt sich angenehmer schreiben aber Object.is() tut eher das, was ich von einem strikten Vergleich erwarte.

Kann man Object.is() wie das equals in Java überschreiben, um eigene Kriterien für den Vergleich festzulegen?
 
NaN ist per IEEE754 so definiert (https://en.wikipedia.org/wiki/NaN#Comparison_with_NaN).
Das hat erstmal nichts mit JavaScript per se zu tun. Selbes Verhalten findest du in allen Programmiersprachen wieder, die Kommazahlen per IEEE754 implementieren (C, C++, Java, JavaScript, PHP ...).
Object.is() stellt dir eine Möglichkeit bereit diesen Quirks zu umgehen.
 
Ich benutze dazu folge Eselsbrücke. Ich meine, das hab ich irgendwo mal gelesen, erinner mich aber nicht mehr im Detail.

Ich sehe NaN als number-Repräsentation von nicht-number-Werten. Z. B. können "hallo", [1, 2, 3] und { foo: 'bar' } in NaN resultieren. (aber: Number([2]) === 2 und Number(true) === 1).

Daher wäre es seltsam, wenn folgender Vergleich in true resultieren würde:

Javascript:
Number({ name: 'Max' }) === Number([1, 2, 3]);

Wenn das nicht nach false schreit, weiß ich auch nicht :D Ich kann mir halt gut vorstellen, dass das der Grund für diese Entscheidung ist.
 
Daher wäre es seltsam, wenn folgender Vergleich in true resultieren würde:

Javascript:
Number({ name: 'Max' }) === Number([1, 2, 3]);
Wenn das nicht nach false schreit, weiß ich auch nicht :D Ich kann mir halt gut vorstellen, dass das der Grund für diese Entscheidung ist.

Kann man so und so sehen. ^^

Für mich sieht das aus, wie der Vergleich zweier Outputs:

Javascript:
const a = (blubb) => 1;
const b = (blubb) => 1;
a({ name: 'Max' }) === b([5, 9, 8]); // true

Allerdings habe ich fälschlicherweise NaN als eine Art Konstante betrachtet, obwohl sie eher, wie du schreibst, eine Repräsentation sein soll.
 
Ja, ich denke, das Problem ist, dass es wie ein Funktionsaufruf aussieht. Ist im Endeffekt aber eine Art type cast, vergleichbar mit folgendem Pseudocode:

Code:
({ name: 'Max' } as number) === ([1, 2, 3] as number)
 
Zurück
Oben Unten