Ich verwende JSLint , um JavaScript zu durchlaufen, und es werden viele Vorschläge zurückgegeben, die ersetzt werden sollen ==
(zwei Gleichheitszeichen) durch ===
(drei Gleichheitszeichen), wenn beispielsweise Dinge idSele_UNVEHtype.value.length == 0
innerhalb einer if
Anweisung verglichen werden .
Gibt es einen Leistungsvorteil beim Ersetzen ==
durch ===
?
Jede Leistungsverbesserung wäre zu begrüßen, da viele Vergleichsoperatoren existieren.
Wenn keine Typkonvertierung stattfindet, würde sich dann ein Leistungsgewinn ergeben ==
?
=== vs ==
, aber für PHP, kann hier gelesen werden: stackoverflow.com/questions/2401478/why-is-faster-than-in-php/…===
ist viel schneller als==
. jsperf.com/comparison-of-comparisons===
over spürbar schneller machen wird==
. Tatsächlich zeigt der Benchmark bei modernen Browsern keinen großen Unterschied zwischen beiden. Persönlich benutze ich normalerweise==
überall, es sei denn, ich brauche wirklich strenge Gleichheit.===
und die==
Betreiber bespricht : youtube.com/… Wenn es nichtAntworten:
Der strikte Gleichheitsoperator (
===
) verhält sich identisch mit dem abstrakten Gleichheitsoperator (==
), außer dass keine Typkonvertierung durchgeführt wird und die Typen identisch sein müssen, um als gleich zu gelten.Referenz: Javascript Tutorial: Vergleichsoperatoren
Der
==
Operator vergleicht die Gleichheit, nachdem er alle erforderlichen Typkonvertierungen durchgeführt hat . Der===
Bediener wird nicht die Konvertierung tun, so dass , wenn zwei Werte sind nicht vom gleichen Typ===
einfach zurückfalse
. Beide sind gleich schnell.Um Douglas Crockfords exzellentes JavaScript zu zitieren : The Good Parts ,
Aktualisieren:
Ein guter Punkt wurde von @Casebash in den Kommentaren und in der Antwort von @Phillipe Laybaert zu Objekten angesprochen . Für Objekte
==
und===
konsequent miteinander handeln (außer in einem besonderen Fall).Der Sonderfall ist, wenn Sie ein Grundelement mit einem Objekt vergleichen, das aufgrund seiner Methode
toString
oder derselbenvalueOf
Methode als dasselbe Grundelement ausgewertet wird. Betrachten Sie beispielsweise den Vergleich eines Zeichenfolgenprimitivs mit einem Zeichenfolgenobjekt, das mit demString
Konstruktor erstellt wurde.Hier
==
überprüft der Operator die Werte der beiden Objekte und gibt sie zurücktrue
,===
sieht jedoch, dass sie nicht vom gleichen Typ sind und zurückkehrenfalse
. Welches ist richtig? Das hängt wirklich davon ab, was Sie vergleichen möchten. Mein Rat ist, die Frage vollständig zu umgehen und denString
Konstruktor nicht zum Erstellen von Zeichenfolgenobjekten aus Zeichenfolgenliteralen zu verwenden.Referenz
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
quelle
Verwenden des
==
Operators ( Gleichheit )Verwendung der
===
Operators ( Identität )Das liegt daran, dass die Gleichheitsoperator
==
Zwang eingibt , was bedeutet, dass der Interpreter implizit versucht, die Werte vor dem Vergleich zu konvertieren.Auf der anderen Seite führt der Identitätsoperator
===
keinen Typzwang durch und konvertiert daher die Werte beim Vergleich nicht und ist daher schneller (gemäß diesem JS-Benchmark- Test), wenn er einen Schritt überspringt.quelle
==
"abstrakte Gleichheit" und es nennt===
"strenge Gleichheit". Zugegeben,==
jede Art von "Gleichheit" zu nennen, ist meiner Meinung nach schrecklich, da es nicht transitiv ist, aber warum streiten? Ich habe jedoch mehr Probleme mit "Identität"; Ich denke, dieser Begriff ist ziemlich irreführend, obwohl er "funktioniert". Aber im Ernst, wer hat den Begriff "Identität" geprägt? Ich suche den Standard und konnte ihn nicht finden.Eine interessante bildliche Darstellung des Gleichheitsvergleichs zwischen
==
und===
.Quelle: http://dorey.github.io/JavaScript-Equality-Table/
var1 === var2
var1 == var2
quelle
x == null
zu überprüfen , obx
istnull
oderundefined
.==
vs===
. Groß- und Kleinschreibung sind ohnehin ungleich und werdenfalse
sowohl mit als auch==
mit===
Operatoren zurückgegeben. Auch Schlüsselwörtertrue
,false
,undefined
,null
,Infinity
existieren in JS nur in einem Fall und können nicht in der oberen oder gemischten Fällen verwendet werden.In den Antworten hier habe ich nichts darüber gelesen, was Gleichheit bedeutet. Einige werden sagen, das
===
bedeutet gleich und vom gleichen Typ , aber das ist nicht wirklich wahr. Dies bedeutet tatsächlich, dass beide Operanden auf dasselbe Objekt verweisen oder bei Werttypen denselben Wert haben .Nehmen wir also den folgenden Code:
Dasselbe hier:
Oder auch:
Dieses Verhalten ist nicht immer offensichtlich. Die Geschichte hat mehr zu bieten, als gleich zu sein und vom selben Typ zu sein.
Die Regel lautet:
Für Werttypen (Zahlen):
a === b
Gibt true zurück, wenna
undb
haben denselben Wert und sind vom gleichen TypFür Referenztypen:
a === b
Gibt true zurück, wenna
undb
genau dasselbe Objekt referenziert wirdFür Zeichenfolgen:
a === b
Gibt true zurück, wenna
undb
beide Zeichenfolgen sind und genau dieselben Zeichen enthaltenSaiten: der Sonderfall ...
Zeichenfolgen sind keine Werttypen, aber in Javascript verhalten sie sich wie Werttypen. Sie sind also "gleich", wenn die Zeichen in der Zeichenfolge gleich und gleich lang sind (wie in der dritten Regel erläutert).
Jetzt wird es interessant:
Aber wie wäre es damit?:
Ich dachte, Strings verhalten sich wie Werttypen? Nun, es kommt darauf an, wen Sie fragen ... In diesem Fall sind a und b nicht vom gleichen Typ.
a
ist vom TypObject
, währendb
vom Typ iststring
. Denken Sie daran, dass beim Erstellen eines Zeichenfolgenobjekts mit demString
Konstruktor etwas erstellt wird,Object
das sich die meiste Zeit als Zeichenfolge verhält .quelle
new Number() == "0"
. Ebenfalls in Firefox:(function(){}) == "function () {\n}"
new String("123") !== "123"
. Sie sind verschiedene Arten. Einfach und doch verwirrend.String
Objekte verhalten sich wie jedes andere Objekt wie Zeichenfolgen .new String
sollte niemals verwendet werden, da dies keine echten Strings erzeugt. Eine echte Zeichenfolge und kann mit Zeichenfolgenliteralen erstellt oderString
als Funktionnew
String(0); //"0", Real string, not an object
Lassen Sie mich diesen Rat hinzufügen:
Im Zweifelsfall die Spezifikation lesen !
ECMA-262 ist die Spezifikation für eine Skriptsprache, deren Dialekt JavaScript ist. In der Praxis ist es natürlich wichtiger, wie sich die wichtigsten Browser verhalten, als eine esoterische Definition, wie etwas gehandhabt werden soll. Es ist jedoch hilfreich zu verstehen, warum ein neuer String ("a")! == "a" .
Bitte lassen Sie mich erklären, wie die Spezifikation zu lesen ist, um diese Frage zu klären. Ich sehe, dass in diesem sehr alten Thema niemand eine Antwort auf den sehr seltsamen Effekt hatte. Wenn Sie also eine Spezifikation lesen können, hilft Ihnen dies in Ihrem Beruf enorm. Es ist eine erworbene Fähigkeit. Also, lass uns weitermachen.
Durch Durchsuchen der PDF-Datei nach === komme ich zu Seite 56 der Spezifikation: 11.9.4. Der Strict Equals Operator (===) und nach dem Durchblättern der Spezifikation finden ich:
Interessant ist Schritt 11. Ja, Zeichenfolgen werden als Werttypen behandelt. Dies erklärt jedoch nicht, warum ein neuer String ("a")! == "a" . Haben wir einen Browser, der nicht ECMA-262 entspricht?
Nicht so schnell!
Lassen Sie uns die Typen der Operanden überprüfen. Probieren Sie es selbst aus, indem Sie sie in typeof () einwickeln . Ich finde, dass der neue String ("a") ein Objekt ist und Schritt 1 verwendet wird: Geben Sie false zurück, wenn die Typen unterschiedlich sind.
Wenn Sie sich fragen, warum ein neuer String ("a") keinen String zurückgibt, wie wäre es dann mit einer Übung zum Lesen einer Spezifikation? Habe Spaß!
Aidiakapi schrieb dies in einem Kommentar unten:
new gibt immer ein Objekt zurück, auch für String Konstruktoren. Und leider! Die Wertesemantik für Zeichenfolgen (siehe Schritt 11) geht verloren.
Und das bedeutet schließlich: neuer String ("a")! == "a" .
quelle
new String('x')
, weil ich noch nie einen Code in freier Wildbahn gesehen habe, der primitive Wrapper-Objekte verwendet, und ich glaube nicht, dass es dafür einen guten Grund gibt, besonders nicht heutzutage. Haben Sie jemals Code gefunden, der dies tut?new String()
.new String()
ist es wahrscheinlich die geringste Ihrer Sorgen. Ich verstehe die Besorgnis in der Theorie, aber haben Sie wieder Beispiele aus der Praxis? Für mich ist es wie die alte Angst, dass jemand einenundefined
anderen Wert einstellen könnte .In PHP und JavaScript ist es ein strikter Gleichheitsoperator. Das heißt, es werden sowohl Typ als auch Werte verglichen.
quelle
var a = {}, b = {};
a == b
gibt false zurück.var a = {}, b = {};
zwar beidea
undb
zwar beide ein Objekt sind, sie aber technisch gesehen nicht den gleichen Wert haben. Sie sind verschiedene Instanzen. Beachten Sie, dass sich das Vergleichen von Instanzen anders verhält als das Vergleichen von Grundelementen. Was wahrscheinlich zu dieser Verwirrung beiträgt. Sie sehen ein ähnliches Vergleichsverhalten, wenn Sie eine Instanzversion primitiver Datentypen verwenden. ZBnew String('asdf')
odernew Number(5)
. Beispiel:new Number(5) == new Number(5)
ist falsch, obwohl sie den gleichen Wert haben.Ich habe dies in Firefox mit Firebug mit folgendem Code getestet :
und
Meine Ergebnisse (jeweils fünfmal getestet und gemittelt):
Ich würde also sagen, dass der winzige Unterschied (das sind über 100000 Iterationen, denken Sie daran) vernachlässigbar ist. Leistung ist kein Grund dazu
===
. Geben Sie Sicherheit ein (so sicher wie in JavaScript), und die Codequalität ist.quelle
==
einverstanden sind.==
Bediener gibt? Denken Sie daran, dann gibt es einen Leistungsschub.===
Übernutzung ist,==
aber Sie irren sich, dass ihre Leistung im Wesentlichen gleich ist und dass Sie denken würden, dass dieser Test beweist, dass und dass viele andere Menschen zustimmten, für mich völlig absurd ist.In JavaScript bedeutet es den gleichen Wert und Typ.
Zum Beispiel,
aber
quelle
Der Operator === wird als strenger Vergleichsoperator bezeichnet und unterscheidet sich vom Operator == .
Nehmen wir 2 Vars a und b.
Damit "a == b" als wahr ausgewertet wird, müssen a und b den gleichen Wert haben .
Im Fall von "a === b" müssen a und b den gleichen Wert und auch den gleichen Typ haben, damit sie als wahr ausgewertet werden.
Nehmen Sie das folgende Beispiel
Zusammenfassend ; Die Verwendung des Operators == kann in Situationen, in denen Sie dies nicht möchten, mit true = true auswerten Operators sicherer.
Im 90% -Nutzungsszenario spielt es keine Rolle, welches Sie verwenden, aber es ist praktisch, den Unterschied zu kennen, wenn Sie eines Tages ein unerwartetes Verhalten feststellen.
quelle
Warum
==
ist das so unvorhersehbar?Was bekommen Sie, wenn Sie eine leere Zeichenfolge
""
mit der Zahl Null vergleichen0
?true
Ja, das stimmt
==
einer leeren Zeichenfolge und die Zahl Null ist dieselbe Zeit.Und es endet nicht dort, hier ist noch eines:
Mit Arrays wird es wirklich komisch.
Dann seltsamer mit Saiten
Es wird schlimmer:
Wann ist gleich nicht gleich?
Lassen Sie mich das noch einmal sagen:
Und das ist nur das verrückte Zeug, das man mit Primitiven bekommt.
Es ist eine ganz neue Ebene der Verrücktheit, wenn Sie
==
mit Objekten verwenden.An diesem Punkt wundern Sie sich wahrscheinlich ...
Warum passiert das?
Nun, es liegt daran, dass im Gegensatz zu "Triple Equals" (
===
) nur geprüft wird, ob zwei Werte gleich sind.==
macht eine ganze Reihe anderer Sachen .Es hat eine spezielle Behandlung für Funktionen, eine spezielle Behandlung für Nullen, undefinierte Zeichenfolgen, wie Sie es nennen.
Es wird ziemlich verrückt.
Wenn Sie versuchen würden, eine Funktion zu schreiben, die das
==
tut , was sie tut, würde sie ungefähr so aussehen:Was bedeutet das?
Es bedeutet
==
ist kompliziert.Da es kompliziert ist, ist es schwer zu wissen, was passieren wird, wenn Sie es verwenden.
Was bedeutet, dass Sie mit Fehlern enden könnten.
Die Moral der Geschichte lautet also ...
Machen Sie Ihr Leben weniger kompliziert.
Verwenden Sie
===
anstelle von==
.Das Ende.
quelle
looseEqual
ist falsch.Function == Function.toString()
ist wahr, aberlooseEqual(Function, Function.toString())
falsch. Ich bin mir nicht sicher, warum Sie Funktionen am Anfang herausfiltern.typeof x === "object"
zu überprüfen, ob es sich um ein Objekt handelt, aber `typeof funktioniert nur für Nicht-Null-Grundelemente. Sie könnten an meiner Liste der richtigen Möglichkeiten(function blah() { console.log("test"); }) != {valueOf:function(){return "function blah() { console.log(\"test\"); }";}}
- Schauen Sie sich diese JS-Geige an, die alle Tests ausführt : jsfiddle.net/luisperezphd/7k6gcn6g (dort 1.225 Testpermutationen )==
der viele Dinge bewirkt, die es sehr schwierig machen, die Ergebnisse===
vorherzusehen, während es viel einfacher und vorhersehbarer ist, was einer der Hauptgründe===
für die empfohlene Wahl ist. (Ich werde der Antwort eine Notiz hinzufügen, in der Ihr Punkt erwähnt wird)===
prüft, ob die gleichen Seiten in Typ und Wert gleich sind .Beispiel:
Allgemeines Beispiel:
Ein weiteres häufiges Beispiel:
Viele Male eine nicht typisierte Check wäre praktisch , weil Sie den Wert egal , wenn entweder ist
undefined
,null
,0
oder""
quelle
'string' !== 'number'
Ablaufdiagramm für die Ausführung von Javascript für strikte Gleichheit / Vergleich '==='
Flussdiagramm der Javascript-Ausführung für nicht strikte Gleichheit / Vergleich '=='
quelle
string
Pfeil auf das große graue Kästchen zeigt. Soll das bedeuten, dass der Unterbrecher die Zeichenfolge in eine Zahl umwandelt?string
mit einem Typ verglichen werden soll.number
Der Unterbrecher prüft also, mit was der String verglichen werden soll, und wirft den String entsprechend um.ToNumber
zurückgegeben, wenn verschiedene Typen angegeben werden. Wenn also eine Zeichenfolge angegeben wird, wird nur die letzte Option ausgewählt (und in eine Zahl konvertiert).==
wirdToNumber
nur in den Fällenstring == number
oderboolean == anything
darüber (und nur auf demstring
/boolean
) verwendet. Dies bedeutet,==
dass niemals konvertiert wirdundefined
odernull
obwohl sie sich in der grauen Box befinden. (Für jede Kombination von einemundefined
odernull
beiden==
wird immer zurückgegebentrue
. Auch spielt es keine Rolle, ob sich ein Wert auf der linken oder rechten Seite befindet,==
(und===
) gibt das gleiche Ergebnis zurück.)JavaScript
===
vs==
.quelle
Dies bedeutet Gleichheit ohne Typzwang. Typzwang bedeutet, dass JavaScript keine anderen Datentypen automatisch in Zeichenfolgendatentypen konvertiert
quelle
In einem typischen Skript gibt es keinen Leistungsunterschied. Wichtiger ist möglicherweise die Tatsache, dass tausend "===" 1 KB schwerer als tausend "==" sind :) JavaScript-Profiler können Ihnen sagen, ob es in Ihrem Fall einen Leistungsunterschied gibt.
Aber persönlich würde ich tun, was JSLint vorschlägt. Diese Empfehlung gibt es nicht wegen Leistungsproblemen, sondern weil Typ Zwangsmittel
('\t\r\n' == 0)
wahr sind.quelle
Der gleiche Vergleichsoperator == ist verwirrend und sollte vermieden werden.
Wenn Sie damit leben MÜSSEN , denken Sie an die folgenden drei Dinge:
GLEICHE OPERATOR-WAHRHEITSTABELLE IN JAVASCRIPT
** STRANGE: Beachten Sie, dass zwei beliebige Werte in der ersten Spalte in diesem Sinne nicht gleich sind. **
quelle
Es ist unwahrscheinlich, dass zwischen den beiden Vorgängen in Ihrer Verwendung Leistungsunterschiede bestehen. Es ist keine Typkonvertierung durchzuführen, da beide Parameter bereits vom selben Typ sind. Beide Operationen haben einen Typvergleich, gefolgt von einem Wertevergleich.
quelle
Ja! Es ist wichtig.
===
Der Operator in Javascript überprüft sowohl den Wert als auch den Typ, wobei der==
Operator nur den Wert überprüft (führt bei Bedarf eine Typkonvertierung durch) .Sie können es leicht testen. Fügen Sie den folgenden Code in eine HTML-Datei ein und öffnen Sie ihn im Browser
Sie werden ' false ' in Alarmbereitschaft erhalten. Ändern Sie nun die
onPageLoad()
Methodealert(x == 5);
so, dass sie wahr wird .quelle
===
Der Operator überprüft die Werte sowie die Typen der Variablen auf Gleichheit.==
Der Operator überprüft nur den Wert der Variablen auf Gleichheit.quelle
Es ist ein strenger Kontrolltest.
Dies ist besonders dann gut, wenn Sie zwischen 0 und false und null prüfen.
Zum Beispiel, wenn Sie haben:
Dann:
Alles gibt true zurück und Sie möchten dies möglicherweise nicht. Angenommen, Sie haben eine Funktion, die den 0. Index eines Arrays oder bei einem Fehler false zurückgeben kann. Wenn Sie mit "==" false prüfen, erhalten Sie ein verwirrendes Ergebnis.
Also mit dem gleichen wie oben, aber einem strengen Test:
quelle
0 != null
. -1JSLint gibt Ihnen manchmal unrealistische Gründe, um Dinge zu ändern.
===
hat genau die gleiche Leistung wie==
ob die Typen bereits gleich sind.Es ist nur dann schneller, wenn die Typen nicht identisch sind. In diesem Fall wird nicht versucht, Typen zu konvertieren, sondern es wird direkt ein false zurückgegeben.
Also, IMHO, JSLint vielleicht verwendet , um neuen Code zu schreiben, aber nutzlos Überoptimierung sollte unter allen Umständen vermieden werden.
Das heißt, es gibt keinen Grund
==
,===
in einem Scheck wie zu ändernif (a == 'test')
wenn Sie wissen, dass a nur ein String sein kann.Wenn Sie so viel Code ändern, verschwenden Sie Zeit für Entwickler und Prüfer und erzielen nichts.
quelle
Einfach
==
bedeutet Vergleich zwischen Operanden mittype conversion
&
===
bedeutet Vergleich zwischen Operanden ohnetype conversion
Typkonvertierung in JavaScript bedeutet, dass JavaScript alle anderen Datentypen automatisch in Zeichenfolgendatentypen konvertiert.
Zum Beispiel:
quelle
Ein einfaches Beispiel ist
quelle
Die beiden oben genannten Antworten == bedeuten Gleichheit und === Identität. Leider ist diese Aussage falsch.
Wenn beide Operanden von == Objekte sind, werden sie verglichen, um festzustellen, ob sie dasselbe Objekt sind. Wenn beide Operanden auf dasselbe Objekt zeigen, gibt der gleiche Operator true zurück. Ansonsten sind die beiden nicht gleich.
Im obigen Code werden sowohl == als auch === falsch, da a und b nicht dieselben Objekte sind.
Das heißt: Wenn beide Operanden von == Objekte sind, verhält sich == genauso wie ===, was auch Identität bedeutet. Der wesentliche Unterschied zwischen diesen beiden Operatoren besteht in der Typkonvertierung. == hat eine Konvertierung, bevor die Gleichheit überprüft wird, === jedoch nicht.
quelle
Als Faustregel würde ich im Allgemeinen
===
anstelle von==
(und!==
anstelle von verwenden!=
) verwenden.Die Gründe werden in den obigen Antworten erläutert und auch Douglas Crockford ist ziemlich klar darüber ( JavaScript: The Good Parts ).
Es gibt jedoch eine einzige Ausnahme : Dies
== null
ist eine effiziente Methode, um zu überprüfen, ob "null oder undefiniert" ist:Zum Beispiel verwendet jQuery 1.9.1 dieses Muster 43 Mal, und der JSHint-Syntaxprüfer bietet sogar das
eqnull
aus diesem Grund entspannende Option.Aus dem jQuery-Styleguide :
quelle
Das Problem ist, dass Sie leicht in Schwierigkeiten geraten können, da JavaScript viele implizite Konvertierungen hat, was bedeutet ...
Was ziemlich bald zum Problem wird. Das beste Beispiel dafür, warum implizite Konvertierung "böse" ist, kann diesem Code in MFC / C ++ entnommen werden, der aufgrund einer impliziten Konvertierung von CString nach HANDLE, einem Zeigertyp vom Typ typedef, tatsächlich kompiliert wird.
Was offensichtlich zur Laufzeit sehr undefinierte Dinge tut ...
Google für implizite Konvertierungen in C ++ und STL , um einige der Argumente dagegen zu erhalten ...
quelle
0 == null
ist falsch.Aus der Kern-Javascript-Referenz
quelle
Gleichstellungsvergleich:
Operator
==
Gibt true zurück, wenn beide Operanden gleich sind. Die Operanden werden vor dem Vergleich in denselben Typ konvertiert.
Gleichheits- und Typvergleich:
Operator
===
Gibt true zurück, wenn beide Operanden gleich und vom gleichen Typ sind. Es ist im Allgemeinen besser und sicherer, wenn Sie dies vergleichen, da es keine Konvertierungen vom Typ hinter den Kulissen gibt.
quelle
Hier ist eine praktische Vergleichstabelle, die die Konvertierungen und die Unterschiede zwischen
==
und zeigt===
.Wie die Schlussfolgerung besagt:
http://dorey.github.io/JavaScript-Equality-Table/
quelle
null und undefiniert sind nichts, das heißt,
Hier
a
undb
haben keine Werte. Während 0, false und '' alle Werte sind. Allen gemeinsam ist, dass es sich bei allen um falsche Werte handelt, was bedeutet, dass sie alle falsche Bedingungen erfüllen .Die 0, false und '' bilden zusammen eine Untergruppe. Andererseits bilden null und undefiniert die zweite Untergruppe. Überprüfen Sie die Vergleiche im folgenden Bild. null und undefiniert wären gleich. Die anderen drei würden einander gleich sein. Sie werden jedoch alle in JavaScript als falsche Bedingungen behandelt.
Dies ist dasselbe wie bei jedem Objekt (wie {}, Arrays usw.). Nicht leere Zeichenfolgen und Boolesche Werte sind alles wahrheitsgemäße Bedingungen. Aber sie sind nicht alle gleich.
quelle