2010-08-27 5 views
535

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

+1

Gibt es einen Grund, nicht == zu verwenden? – Kendrick

+13

@Kendrick - sicher. Es ist Typ-Zwangs-System kann unglaublich unintuitiv sein und kann Fehler sehr leicht übersehen (es * sieht * richtig aus, kann aber sehr falsch sein) – STW

+10

@Kendrick - weil '{} ==" [object Object] "' ​​als wahr ausgewertet , beispielsweise. –

Antwort

435

immer Bis Sie in vollem Umfang die Unterschiede und Auswirkungen der Verwendung der == und === Betreiber verstehen, verwenden Sie die === Betreiber, da es werden Sie von obskuren (nicht offensichtlich) Bugs und WTFs speichern. Der "reguläre" Operator == kann aufgrund der Typenkorrektur intern sehr unerwartete Ergebnisse haben, daher ist die Verwendung von === immer der empfohlene Ansatz.

Für Einblick in diese und andere "gut vs. schlecht" Teile von Javascript lesen Sie auf Mr. Douglas Crockford und seine Arbeit. Es gibt eine große Google Tech Talk, wo er viele gute Informationen zusammenfasst: http://www.youtube.com/watch?v=hQVTIJBZook


Update:

Die You Don't Know JS Serie von Kyle Simpson ist ausgezeichnet (und kostenlos online zu lesen). Die Serie geht in die allgemein missverstandenen Bereiche der Sprache und erklärt die "schlechten Teile", die Crockford Ihnen vorschlägt, zu vermeiden. Indem Sie sie verstehen, können Sie sie richtig nutzen und die Fallstricke vermeiden.

Der „Up & Going“ Buch enthält einen Abschnitt über Equality, mit dieser speziellen Zusammenfassung, wenn die lose zu verwenden (==) vs strengen (===) Betreiber:

Um eine ganze Menge Details einkochen zu wissen, ob ein paar einfachen Imbissbuden, und helfen Ihnen hier in verschiedenen Situationen == oder === zu verwenden, meine einfachen Regeln sind:

  • Wenn entweder Wert (aka Seite) in einem Vergleich diesein könnteoder false Wert, vermeiden Sie == und verwenden Sie ===.
  • Wenn entweder Wert in einem Vergleich dieser spezifischen Werte sein könnte (0, "" oder [] - leeres Array), vermeiden == und === verwenden.
  • In alle anderen Fällen können Sie sicher == verwenden. Es ist nicht nur sicher, sondern vereinfacht in vielen Fällen Ihren Code auf eine Weise, die die Lesbarkeit verbessert.

Ich empfehle noch Crockford Gespräch für Entwickler, die nicht wollen, um die Zeit zu investieren, um wirklich zu verstehen Javascript — es ist ein guter Rat für einen Entwickler, der nur arbeitet gelegentlich in Javascript.

+7

Es ist nicht notwendig, wenn Sie sicher sind, dass beide Operanden string sind, zB wenn 'if (typeof foo == "string") ' –

+12

@Marcel - Sie sind richtig, aber es ist viel besser, * immer * den Operator' === zu verwenden und sich nie um die Frage zu kümmern, "bin ich wirklich, total, 100% sicher, dass' == ' wird sich verhalten wie ich es mir vorstelle? " – STW

+1

Es gibt Fälle, wo es * immer * eine Zeichenkette sein wird, die '===' und ihre (infinitesimale) Performance-Auswirkung unnötig macht. Einer ist 'typeof', der garantiert eine Zeichenfolge zurückgibt. Ein anderer Fall ist, wenn Sie über eine Reihe von Schlüsseln in einem Objekt iterieren - natürlich ist es auch wichtig, mit was Sie es vergleichen. Dies sind Fälle, in denen Sie nicht "denken" müssen, weil es garantiert ist. Ich denke, für Anfänger ist es keine schlechte Idee, '===' zu verwenden, aber wenn Sie erfahren sind und die Spezifikation gut kennen, können Sie ohne Risiko auf '=== 'verzichten. –

143

Wenn Sie wissen, dass es sich um Zeichenfolgen handelt, müssen Sie nicht nach 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 Methode valueOf() es zu einem für String-Objekte primitive zu konvertieren,

new String("a").valueOf() == new String("a").valueOf() 

wird return true

+0

Sie meinen 'neue String (" a ") == neue String (" a ")' wird false zurückgeben? was ist mit 'neuer String (" a ") === neuer String (" b ")'? – JSS

+4

danke für diese JSS, zwei String-Objekte werden nie gleich sein, es sei denn, sie sind das gleiche Objekt unabhängig von dem Wert. – Anurag

+4

@JSS: Zusätzlich ist 'new String (" a ") ==" a "' wahr (wäre aber nicht mit '==='), weil die linke Seite in einen primitiven String-Wert konvertiert wird. –

8

Es gibt zwei Möglichkeiten, in denen Strings in Javascript gemacht werden können.

  1. var str = 'Javascript'; Dies erstellt einen primitiven String-Wert.

  2. var obj = new String('Javascript'); Dies erstellt ein Wrapper-Objekt vom Typ String.

    typeof str // string
    typeof obj // object

So ist die beste Art und Weise für die Gleichstellung zu überprüfen, wird mit dem === Operator, weil es Wert sowie Art der beiden Operanden überprüft.

Wenn Sie die Gleichheit zwischen zwei Objekten überprüfen möchten, ist die Verwendung von String.prototype.valueOf der richtige Weg.

new String('javascript').valueOf() == new String('javascript').valueOf() 
9

Sofern Sie nicht wirklich wissen, wie Zwang funktioniert, Sie == und verwenden Sie den Identitätsoperator === stattdessen vermeiden sollten. Aber Sie sollten read this to understand how it works.

Wenn Sie == verwenden, können Sie die Sprache für Sie eine Art Zwang tun, so zum Beispiel:

"1" == 1 // true 
"0" == false // true 
[] == false // true 

Als Douglas Crockford sagte in seinem Buch:

Es ist immer besser, die Verwendung Identitätsoperator.

+1

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. –

8

was auf diese Frage führte mich ist die padding und white-spaces

meinem Fall

if (title === "this word") 
     doSomething(); 

und Titel überprüfen war " this word"

enter image description here

so vielleicht haben Sie trim Funktion wie diese

var title = $(this).text().trim(); 
-2

I've provided some code (gleiche wie unten) verwenden JavaScript-Typ-Umwandlung Gleichheit Vergleich mit Beispielen zu erläutern.

<!-- 

JavaScript has both strict and type-converting equality comparison. For strict equality the objects being compared must have the same 
type, presented by === (the triple equal sign). For strict equality, the objects being compared must be equal in type as well. 
Below I am going to provide you couple examples, I hope they help you! 

Please, don't forget to like my code. Thank you! 

--> 

<!DOCTYPE html> 
<html> 
    <body> 

    <p id="demo"></p> 

    <script> 

     document.write("The == and === comparison" + "<br>" + "<br>"); 
     //document.write(" (0 == false) returns: " + (0 == false) + "<br>"); // true 


     document.write((0 == false) + "<br>"); // true 

     document.write((0 === false) + "<br>"); // false, because they are of a different type 

     document.write((1 == "1") + "<br>"); // true, automatic type conversion for value only 

     document.write((1 === "1") + "<br>"); // false, because they are of a different type 

     document.write(('0' == false) + "<br>"); // true 

     document.write(('0' === false) + "<br>"); // false 

     document.write((2==='2') + "<br>"); //false 

     document.write((2==="2") + "<br>"); //false 

     document.write(("2"===2) + "<br>"); //true 

     document.write((2===2) + "<br>"); //true 

     document.write(("3"==3) + "<br>"); //true 

     document.write((3=='3') + "<br>"); //true 

     document.write((3==true) + "<br>"); //false 


     /*Two numbers are strictly equal when they are numerically equal (have the same number value). */ 
     document.write((3==3) + "<br>"); //true 
     document.write((5.2==5.2) + "<br>"); //true 


     /* Two strings are strictly equal when they have the same sequence of characters, same length, 
      and same characters in corresponding positions. */ 
     document.write(("hola"=="hola") + "<br>"); //true 
     document.write(("hola"=="Hola") + "<br>"); //false, because they differ in a character 'H' 


     /* NaN is not equal to anything, including NaN. Positive and negative zeros are equal to one another. */ 
     document.write(("NaN"=="hola") + "<br>"); //false 
     document.write(("NaN"== -3) + "<br>"); //false 
     document.write(("NaN"== 3) + "<br>"); //false 
     document.write(("NaN"== 2.5) + "<br>"); //false 


     /* Two Boolean operands are strictly equal if both are true or both are false. */ 
     document.write(((0 > 5) == (8 < 9)) + "<br>"); // false, the first condition (0>5) returns false and (8<9) returns true 
     document.write(((8 >= 5) == (8 == 9)) + "<br>"); // false, the first condition (8>=5) returns true and (8==9) returns false 
     document.write(((true) == (true)) + "<br>"); // true 
     document.write(((false) == (false)) + "<br>"); // true 


     /* Null and Undefined types are == (but not ===). [e.g.: (Null==Undefined) is true but (Null===Undefined) is false] */ 
     document.write((null == undefined) + "<br>"); // true 
     document.write((null === undefined) + "<br>"); // false 


     /* 
     Two objects are strictly equal if they refer to the same Object. 
     */ 
     var car1 = {type:"Fiat", model:"500", color:"white"}; 
     var car2 = {type:"Fiat", model:"500", color:"white"}; 
     var x = car1; 

     document.write((car1 === car2)+ "<br> "); // false 
     document.write((car1 == car2)+ "<br> "); // false 
     document.write((car1 === x)+ "<br> "); // true 
     document.write((car1 == x)+ "<br>"); // true 



     /* DO NOT FORGET THAT = (a single equal sign) represents assignment. e.g.: var X = 3; 
     Here we were assigning 3 to variable X 
     */ 

    </script> 

    </body> 
</html> 
21

Nur ein zusätzlich zu den Antworten: Wenn alle dieser Methoden false zurück, auch wenn die Saiten scheinen gleich zu sein, ist es möglich, dass es ein Leerzeichen nach links und rechts oder von einer Saite. Also, legen sich lediglich ein .trim() am Ende der Saiten vor dem Vergleich:

if(s1.trim() === s2.trim()) 
{...} 

Ich habe verloren Stunden, um herauszufinden, was falsch ist. Hoffe das wird jemandem helfen!

+1

Vielen Dank. Es ist mir allerdings komisch, weil ich dafür gesorgt habe, dass es weder links noch rechts Whitespaces gab und das war der einzige Weg, mein Problem zu lösen. Vielleicht hängt es mit der internen Darstellung eines Strings zusammen? – Niko

+0

Danke @akelec !! @ Niko, war es wahrscheinlich aufgrund der Null-Width-Space-Zeichen, die für das bloße Auge unsichtbar ist. Siehe https://en.wikipedia.org/wiki/Zero-width_space. Obwohl dieser Charakter seine Ziele hat, ärgern viele Entwickler seine Existenz! – stwr667

Verwandte Themen