Was ist der richtige Weg, um die Gleichheit zwischen Strings in JavaScript zu überprüfen?
{} == "[object Object]"
zum Beispiel als wahr ausgewertet wird.
String().equals()
ist keine Methode in JS ...
Was ist der richtige Weg, um die Gleichheit zwischen Strings in JavaScript zu überprüfen?
{} == "[object Object]"
zum Beispiel als wahr ausgewertet wird.
String().equals()
ist keine Methode in JS ...
Antworten:
Immer Bis Sie die Unterschiede und Auswirkungen der Verwendung derOperatoren==
undvollständig verstanden haben===
, verwenden Sie den===
Operator, da er Sie vor unklaren (nicht offensichtlichen) Fehlern und WTFs bewahrt. Der "normale"==
Operator kann aufgrund des internen Typ-Zwangs sehr unerwartete Ergebnisse erzielen. Daher ist die Verwendung===
immer der empfohlene Ansatz.
Um einen Einblick in diese und andere "gute gegen schlechte" Teile von Javascript zu erhalten, lesen Sie Mr. Douglas Crockford und seine Arbeit. Es gibt einen großartigen Google Tech Talk, in dem er viele gute Informationen zusammenfasst: http://www.youtube.com/watch?v=hQVTIJBZook
Aktualisieren:
Die JS- Serie You Don't Know von Kyle Simpson ist ausgezeichnet (und kostenlos online zu lesen). Die Serie geht auf die häufig missverstandenen Bereiche der Sprache ein und erklärt die "schlechten Teile", die Crockford vermeiden sollte. Wenn Sie sie verstehen, können Sie sie richtig nutzen und die Fallstricke vermeiden.
Das Buch " Up & Going " enthält einen Abschnitt über Gleichstellung mit dieser spezifischen Zusammenfassung, wann die Operatoren lose ( ==
) und strenge ( ===
) zu verwenden sind:
Um eine ganze Reihe von Details auf ein paar einfache Imbissbuden zu reduzieren und Ihnen zu helfen, zu wissen, ob Sie sie verwenden
==
oder===
in verschiedenen Situationen, hier sind meine einfachen Regeln:
- Wenn einer der Werte (auch als Seite bezeichnet) in einem Vergleich der Wert
true
oderfalse
sein könnte, vermeiden==
und verwenden Sie ihn===
.- Wenn entweder Wert in einem Vergleich könnte diesen spezifischen Wert (
0
,""
, oder[]
- leeres Array), zu vermeiden==
und zu verwenden===
.- In allen anderen Fällen können Sie sicher sein
==
. Es ist nicht nur sicher, sondern vereinfacht in vielen Fällen Ihren Code auf eine Weise, die die Lesbarkeit verbessert.
Ich empfehle Crockfords Vortrag weiterhin Entwicklern, die nicht die Zeit investieren möchten, um Javascript wirklich zu verstehen - ein guter Rat für Entwickler, die nur gelegentlich in Javascript arbeiten.
if (typeof foo == "string")
===
Operator zu verwenden und sich nie Gedanken darüber zu machen, ob ich wirklich 100% sicher bin, dass sich ==
das so verhält, wie ich es mir vorstelle.
++
/ --
) zu verwenden.
++
oder --
oder einzelne Zeilen if/else
Anweisungen oder continue
oder den new
Betreiber oder eine andere Zahl von völlig legitim Code Praktiken dass Crockford „schädlich“ hat angesehen. Und natürlich nie jemals betrachtet auch nur zu denken über die Verwendung eval
oder with
auch wenn ihre Tücken sind gut verstanden. Und hast du die nächste Version von JS gesehen? Eine strengere Syntax und eine Handvoll Hilfsfunktionen, von denen einige schon seit Jahren im Umlauf sind, sind alles, was wir nach all dieser Zeit bekommen. Die Syntax hat sich überhaupt nicht weiterentwickelt. Wenn Crockford dahinter steckt, war es eine schlechte Sache.
Wenn Sie wissen, dass es sich um Zeichenfolgen handelt, müssen Sie nicht nach dem Typ suchen.
"a" == "b"
Beachten Sie jedoch, dass Zeichenfolgenobjekte nicht gleich sind.
new String("a") == new String("a")
wird false zurückgeben.
Rufen Sie die valueOf () -Methode auf, um sie in ein Grundelement für String-Objekte zu konvertieren.
new String("a").valueOf() == new String("a").valueOf()
wird true zurückgeben
new String("a") == "a"
ist wahr (würde aber nicht mit sein ===
), da die linke Seite in einen primitiven Zeichenfolgenwert konvertiert wird.
new String("a") == new String("a")
, new String("a") === new String("b")
, new String("a") === new String("a")
werden alle zurück false
, da man mit Referenzen auf Objekte der es zu tun String
Klasse, nicht Primitive Art string
.
new String(foo)
Erstellt ein String- Objekt und String(foo)
konvertiert foo in ein String-Grundelement.
Nur eine Ergänzung zu den Antworten: Wenn alle diese Methoden false zurückgeben, ist es möglich, dass links und / oder rechts von einer Zeichenfolge ein Leerzeichen steht, auch wenn Zeichenfolgen gleich zu sein scheinen. .trim()
Setzen Sie also vor dem Vergleich einfach ein am Ende der Zeichenfolgen:
if(s1.trim() === s2.trim())
{
// your code
}
Ich habe Stunden verloren, um herauszufinden, was los ist. Hoffe das wird jemandem helfen!
fetch
). Vielen Dank.
Was mich zu dieser Frage geführt hat, ist das padding
undwhite-spaces
Überprüfen Sie meinen Fall
if (title === "LastName")
doSomething();
und Titel war " LastName"
Vielleicht müssen Sie also eine solche
trim
Funktion verwenden
var title = $(this).text().trim();
.toString().trim()
in Typescript
Wenn Sie nicht wirklich wissen, wie Zwang funktioniert, sollten Sie stattdessen ==
den Identitätsoperator vermeiden und verwenden ===
. Aber Sie sollten dies lesen, um zu verstehen, wie es funktioniert .
Wenn Sie verwenden ==
, lassen Sie die Sprache eine Art Zwang für Sie ausüben, zum Beispiel:
"1" == 1 // true
"0" == false // true
[] == false // true
Wie Douglas Crockford in seinem Buch sagte:
Es ist immer besser, den Identitätsoperator zu verwenden.
{}==" "
gab mir Unexpected token ==
was ist der richtige Weg, um es zu tun?
Es gibt zwei Möglichkeiten, wie Zeichenfolgen in Javascript erstellt werden können.
var str = 'Javascript';
Dadurch wird ein primitiver Zeichenfolgenwert erstellt.
var obj = new String('Javascript');
Dadurch wird ein Wrapper-Objekt vom Typ erstellt String
.
typeof str // string
typeof obj // object
Der beste Weg, um die Gleichheit zu überprüfen, ist die Verwendung des ===
Operators, da er sowohl den Wert als auch den Typ beider Operanden überprüft.
Wenn Sie die Gleichheit zwischen zwei Objekten überprüfen möchten, String.prototype.valueOf
ist die Verwendung der richtige Weg.
new String('javascript').valueOf() == new String('javascript').valueOf()
String Objects
kann mit JSON.stringyfy()
Trick überprüft werden .
var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel);
Der einfachste Weg, dies zu tun, besteht darin, einen ternären Operator wie folgt zu verwenden:
"was" == "was" ? true : false
Wenn sich die zu vergleichende Zeichenfolge jedoch in einem Array befindet, verwenden Sie den es6-Filter
let stringArray = ["men", "boys", "girls", "sit", "can", "gotten"]
stringArray.filter(I=> I === boys ?
stringArray.pop(indexOf(I)) : null)
Das obige wird Ihr stringArray und den dazu passenden String aus dem Array überprüfen, das wir in unserem Fall "Jungen" ausgewählt haben.
Ich habe beim Testen eine alternative Lösung gefunden. Sie können die Funktion für den String-Prototyp verwenden.
String.prototype.betwenStr = function(one){
return JSON.stringify(new String(this)) === JSON.stringify(new String(one));
}
//call it
"hello world".betweenStr("hello world"); //returns boolean
//value
funktioniert gut in Chrome-Browsern
==
.