Zunächst möchte ich erwähnen, dass ich weiß wie isNaN()
und Number.isNaN()
arbeite. Ich lese The Definite Guide von David Flanagan und er gibt ein Beispiel dafür, wie man überprüft, ob der Wert ist NaN
:
x !== x
Dies führt true
genau dann zu, wenn dies der Fall x
ist NaN
.
Aber jetzt habe ich eine Frage: Warum verwendet er einen strengen Vergleich? Weil es so scheint
x != x
verhält sich genauso. Ist es sicher, beide Versionen zu verwenden, oder fehlen mir einige Werte in JavaScript, die true
für x !== x
und false
für zurückgegeben werden x != x
?
javascript
nan
Giorgi Nakeuri
quelle
quelle
!==
Schecks gegenüber!=
Schecks bevorzugt . Soweit mir bekannt ist, gibt es keinen anderen Wert, wox != x
. Es gibt jedoch zwei unterschiedliche Gruppen von JavaScript-Entwicklern: diejenigen, die es vorziehen,!=
und diejenigen, die es bevorzugen!==
, sei es aus Gründen der Geschwindigkeit, Klarheit, Ausdruckskraft usw.NaN
ist kein eindeutiger Typ, es ist eine Zahl. Es ist ein einzigartiger Wert , der sich selbst nicht entspricht.===
mit NaN durch , um darauf hinzuweisen, dass NaN nicht gleich sich selbst ist. Er ist nicht "falsch", er macht es als Unterrichtsübung und zeigt, dass es nicht funktioniert.Antworten:
Lassen Sie mich zunächst darauf hinweisen, dass dies
NaN
ein ganz besonderer Wert ist: Per Definition ist er nicht gleich sich selbst. Das kommt vom IEEE-754-Standard, auf den sich JavaScript-Zahlen stützen. Der Wert "keine Zahl" ist niemals gleich sich selbst, selbst wenn die Bits genau übereinstimmen. (Was in IEEE-754 nicht unbedingt der Fall ist, ermöglicht es mehrere unterschiedliche "keine Zahl" -Werte.) Aus diesem Grund wird dies sogar angezeigt. Alle anderen Werte in JavaScript sind gleich,NaN
ist nur etwas Besonderes.Nein, du bist nicht. Der einzige Unterschied zwischen
!==
und!=
besteht darin, dass letztere bei Bedarf Typzwang ausüben, um die Typen der Operanden gleich zu machen. Inx != x
sind die Typen der Operanden die gleichen und daher genau die gleichen wiex !== x
.Dies ist vom Beginn der Definition der abstrakten Gleichheitsoperation an klar :
Die ersten beiden Schritte sind grundlegende Sanitärinstallationen. In der Tat besteht der allererste Schritt
==
darin, zu prüfen, ob die Typen gleich sind, und wenn ja, dies===
stattdessen zu tun .!=
und!==
sind nur negierte Versionen davon.Wenn Flanagan also richtig ist, dass nur
NaN
wahr geben wirdx !== x
, können wir sicher sein, dass es auch wahr ist, dass nurNaN
wahr geben wirdx != x
.Viele JavaScript-Programmierer verwenden
===
und!==
vermeiden standardmäßig einige Fallstricke im Zusammenhang mit dem Typenzwang, den die losen Operatoren ausüben, aber in diesem Fall gibt es nichts zu lesen, was Flanagan mit dem strengen oder losen Operator zu tun hat.quelle
4.9.1 - Equality and Inequality Operators
Abschnitt noch einmal gelesen und dies scheint die Antwort zu sein. Der entscheidende===
Vergleichspunkt ist :If the two values have the same type, test them for strict equality as described above. If they are strictly equal, they are equal. If they are not strictly equal, they are not equal
.a
es sich tatsächlich um eine Funktion handelt und der nicht zweimal denselben Wert zurückgibt? Das ist nicht dasselbe wie ein Wert, für den!==
es wahr wäre, worum das OP gebeten hat. Es ist nur eine Funktion, die unterschiedliche Werte zurückgibt.foo() !== foo()
ist auch nicht unbedingt wahr, dafoo
bei jedem Aufruf möglicherweise andere Werte zurückgegeben werden.Für NaN-Zwecke
!=
und!==
machen Sie dasselbe.Viele Programmierer vermeiden jedoch
==
oder!=
in JavaScript. Zum Beispiel betrachtet Douglas Crockford sie als die " schlechten Teile " der JavaScript-Sprache, weil sie sich auf unerwartete und verwirrende Weise verhalten:quelle
Lassen Sie mich Ihnen zum Spaß ein künstliches Beispiel zeigen, bei dem
x
sichNaN
die Bediener ohnehin nicht anders verhalten. Definieren Sie zuerst:Dann haben wir
aber
quelle
foo() != foo()
hier gibt foo effektiv 1 und dann 2 zurück. ZB sind die Werte nicht gleich, es werden nur verschiedene Werte verglichen.Ich möchte nur darauf hinweisen, dass dies
NaN
nicht das einzige ist, wasx !== x
ohne Verwendung des globalen Objekts produziert wird. Es gibt viele clevere Möglichkeiten, dieses Verhalten auszulösen. Hier ist einer, der Getter verwendet:Wie andere Antworten zeigen,
==
führt die Typumwandlung durch, aber in wie in anderen Sprachen und gemäß dem Standard - NaN zeigt einen Rechenfehler an und ist aus guten Gründen nicht gleich sich selbst.Aus irgendeinem Grund, den ich nicht kenne, ist dies ein Problem mit JS, aber die meisten Sprachen mit Doppelbildern (nämlich C, Java, C ++, C #, Python und andere) weisen genau dieses Verhalten auf, und die Leute sind damit einverstanden.
quelle
Da Bilder manchmal besser sind als Wörter, überprüfen Sie diese Tabelle (was für mich der Grund ist, dies zu einer Antwort zu machen, stattdessen ist ein Kommentar, weil es eine bessere Sichtbarkeit erhält).
Dort können Sie sehen, dass ein strikter Gleichheitsvergleich (===) nur dann true zurückgibt, wenn Typ und Inhalt übereinstimmen
Während der abstrakte Gleichheitsvergleich (==) nur den Inhalt * überprüft, indem er Typen konvertiert und sie dann streng vergleicht:
Obwohl es ohne Rücksprache mit ECMA nicht klar ist , was JavaScript beim Vergleich berücksichtigt, wird der folgende Code als wahr ausgewertet.
quelle