Was ist der richtige Weg, um die Zeichenfolgengleichheit in JavaScript zu überprüfen?

844

Was ist der richtige Weg, um die Gleichheit zwischen Strings in JavaScript zu überprüfen?

JSS
quelle
2
Gibt es einen Grund, == nicht zu verwenden?
Kendrick
21
@ Kendrick - sicher. Das Typ-Zwangssystem kann unglaublich unintuitiv sein und Fehler sehr leicht übersehen (es sieht richtig aus, kann aber sehr falsch sein)
STW
20
@Kendrick - weil {} == "[object Object]"zum Beispiel als wahr ausgewertet wird.
Chetan Sastry
12
etwas nervig, das String().equals()ist keine Methode in JS ...
Alexander Mills
2
@AlexanderMills Warum?
Ry-

Antworten:

624

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 trueoder falsesein 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.

STW
quelle
7
Es ist nicht notwendig, wenn Sie sicher sind, dass beide Operanden Zeichenfolgen sind, z. B. wenn Sieif (typeof foo == "string")
Marcel Korpel
25
@Marcel - Sie haben Recht, aber es ist viel besser, immer den ===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.
STW
7
@STW - Ein Beispiel, warum Crockford nicht das A und O von JavaScript ist, ist sein Rat, kein unäres Inkrement / Dekrement ( ++/ --) zu verwenden.
Marcel Korpel
10
Und nie benutzen ++oder --oder einzelne Zeilen if/elseAnweisungen oder continueoder den newBetreiber 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 evaloder withauch 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.
MooGoo
4
@CoffeeAddict - Ein schneller Test in JSFiddle scheint nicht zuzustimmen. Bei beiden wird zwischen Groß- und Kleinschreibung unterschieden: jsfiddle.net/st2EU
STW
205

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

Anurag
quelle
4
Vielen Dank für dieses JSS, zwei Zeichenfolgenobjekte werden niemals gleich sein, es sei denn, sie sind unabhängig vom Wert dasselbe Objekt.
Anurag
4
@JSS: Zusätzlich new String("a") == "a"ist wahr (würde aber nicht mit sein ===), da die linke Seite in einen primitiven Zeichenfolgenwert konvertiert wird.
Matthew Crumley
5
@JSS: 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 StringKlasse, nicht Primitive Art string.
Palswim
4
Nur um dies für jeden zu klären, der es liest. new String(foo)Erstellt ein String- Objekt und String(foo) konvertiert foo in ein String-Grundelement.
Brigand
9
@FakeRainBrigand - klar wie Schlamm, aber darum geht es in Javascripts, nicht wahr?
Periata Breatta
58

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!

akelec
quelle
1
Vielen Dank. Es ist jedoch seltsam für mich, weil ich sichergestellt habe, dass links oder rechts kein Leerzeichen vorhanden ist und dies dennoch der einzige Weg war, mein Problem zu lösen. Vielleicht hängt es mit der internen Darstellung eines Strings zusammen?
Niko
2
Danke @akelec !! @Niko, es lag wahrscheinlich an dem Zero-Width-Space-Charakter, der für das bloße Auge unsichtbar ist. Siehe en.wikipedia.org/wiki/Zero-width_space . Obwohl dieser Charakter seinen Zweck hat, lehnen viele Entwickler seine Existenz ab!
stwr667
Vielen Dank, das war frustrierend, da die Gleichheitsprüfung in meinem if fehlgeschlagen ist und ich beim Überprüfen beim Debuggen kein Leerzeichen gesehen habe.
Drzounds
Ein häufiges Problem beim Laden einer Variablen aus einer Textdatei (dh: using fetch). Vielen Dank.
Sopalajo de Arrierez
@SopalajodeArrierez, genau, am Ende der Zeichenfolge befindet sich meistens ein Leerzeichen oder ein Wagenrücklauf. Bitte schön.
Akelec
22

Was mich zu dieser Frage geführt hat, ist das paddingundwhite-spaces

Überprüfen Sie meinen Fall

 if (title === "LastName")
      doSomething();

und Titel war " LastName"

Geben Sie hier die Bildbeschreibung ein

Vielleicht müssen Sie also eine solche trimFunktion verwenden

var title = $(this).text().trim();
Basheer AL-MOMANI
quelle
2
Vielen Dank hier habe ich .toString().trim()in Typescript
Akitha_MJ
17

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.

ludico8
quelle
3
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert.
Parkash Kumar
{}==" "gab mir Unexpected token ==was ist der richtige Weg, um es zu tun?
Basheer AL-MOMANI
12

Es gibt zwei Möglichkeiten, wie Zeichenfolgen in Javascript erstellt werden können.

  1. var str = 'Javascript'; Dadurch wird ein primitiver Zeichenfolgenwert erstellt.

  2. 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.valueOfist die Verwendung der richtige Weg.

new String('javascript').valueOf() == new String('javascript').valueOf()
Abhishek
quelle
6

String Objectskann 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);

Muhammad Usman
quelle
1

In Anbetracht der Tatsache, dass beide Zeichenfolgen sehr groß sein können, gibt es zwei Hauptansätze bitwise searchundlocaleCompare

Ich habe diese Funktion empfohlen

function compareLargeStrings(a,b){
    if (a.length !== b.length) {
         return false;
    }
    return a.localeCompare(b) === 0;
}
Nagibaba
quelle
-2

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.

Pedro JR
quelle
-8

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

Khorram Bin Salim Khondkar
quelle
In der Frage wird gefragt, wie überprüft werden soll, ob "Hallo Welt" = "Hallo Welt", und nicht, ob "Hallo Welt" eine Zeichenfolge ist.
Nick
4
Das ist einfach albern. Sie haben eine Rube Goldberg-Version von erstellt ==.
JJJ
Hallo OP, deine Bearbeitung ist in ihrem spirituellen Teil völlig anders und deine Antwort hat bereits zu viele Abstimmungen erhalten. Ich fordere Sie auf, diese Antwort zu entfernen und eine neue mit Ihrer bearbeiteten Version zu veröffentlichen
Yılmaz Durmaz