Ich bin auf ein Codebeispiel gestoßen, das diesen Vergleich verwendete:
var someVar = 0;
Object.is(false, someVar); //Returns false
Ich weiß , false == 0
wird sein , true
dass der Grund , warum wir haben===
.
Wie Object.is
unterscheidet sich von ===
?
quelle
.x
für eine Zeichenfolge in einString
Objekt (und nicht für einen primitiven Zeichenfolgenwert) einfügen und der Vergleich zwischen einem Objekt und einer Zeichenfolge erfolgen würde - das ist sehr subtil und eine Falle - Statik vermeidet diese Probleme, statische Methoden sind einfacher und benutzerfreundlicher.document.createElement('div').isEqualNode(document.createElement('div')) === true
Object.is
verwendet den SameValue-Algorithmus der Spezifikation , während===
der Strict Equality-Algorithmus verwendet wird . Ein Hinweis zum Strict Equality Algorithm macht den Unterschied deutlich:Beachten Sie, dass:
NaN === NaN
ist falsch, aberObject.is(NaN, NaN)
wahr+0 === -0
ist wahr, aberObject.is(+0, -0)
falsch-0 === +0
ist wahr, aberObject.is(-0, +0)
falschJavaScript hat mindestens vier Arten von "Gleichheit":
==
), wo die Operanden gezwungen werden, zu versuchen, sie zusammenzubringen. Die Regeln sind klar festgelegt , aber nicht offensichtlich. ("" == 0
isttrue
;"true" == true
istfalse
, ...).===
), wobei Operanden unterschiedlicher Typen nicht erzwungen werden (und nicht gleich sind), siehe jedoch den obigen Hinweis zuNaN
und positive und negative Null.Object.is
).SameValue
außer+0
und-0
sind gleich statt verschieden (wird vonMap
für Schlüssel und von verwendetArray.prototype.includes
).Es gibt auch Objektäquivalenz , die nicht von der Sprache oder der Laufzeit selbst bereitgestellt wird, sondern normalerweise ausgedrückt wird als: Die Objekte haben denselben Prototyp, dieselben Eigenschaften und ihre Eigenschaftswerte sind dieselben (nach einer vernünftigen Definition von "gleich"). ).
SameValue-Algorithmus :
... wo SameValueNonNumber ist:
Strenger Gleichstellungsalgorithmus :
quelle
Das Obige ist die Polyfill-Funktion, die zeigt, wie es
Object.is
funktioniert, für alle Interessierten. Ein Verweis auf You-Don't-Know-JSquelle
Zusammenfassung:
Die
Object.is()
Funktion verwendet 2 Werte als Argumente und gibt true zurück, wenn die 2 angegebenen Werte exakt gleich sind. Andernfalls wird false zurückgegeben.Warum brauchen wir das?
Sie könnten denken, wir haben bereits eine strikte Gleichheitsprüfung (prüft Typ + Wert) in Javascript mit dem
===
Operator. Warum brauchen wir diese Funktion? Nun, strenge Gleichheit ist in einigen Fällen nicht ausreichend und sie sind die folgenden:Object.is()
hilft uns, indem wir diese Werte vergleichen können, um festzustellen, ob sie ähnlich sind, was der strenge Gleichheitsoperator nicht kann.quelle
Kurz gesagt, sie sind ähnlich, aber
Object.is
intelligenter und genauer ...Schauen wir uns das an ...
Aber das ist nicht ganz richtig, da es ignoriert
-
und+
vorher ...Jetzt verwenden wir:
Wie Sie sehen, ist dies genauer zu vergleichen.
Auch in diesem Fall
NaN
funktioniert das eher wie richtig, wie man es auch betrachtetNaN
.quelle