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?
Antwort
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.
Es ist nicht notwendig, wenn Sie sicher sind, dass beide Operanden string sind, zB wenn 'if (typeof foo == "string") ' –
@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
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. –
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
Sie meinen 'neue String (" a ") == neue String (" a ")' wird false zurückgeben? was ist mit 'neuer String (" a ") === neuer String (" b ")'? – JSS
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
@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. –
Es gibt zwei Möglichkeiten, in denen Strings in Javascript gemacht werden können.
var str = 'Javascript';
Dies erstellt einen primitiven String-Wert.var obj = new String('Javascript');
Dies erstellt ein Wrapper-Objekt vom TypString
.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()
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.
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. –
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>
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!
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
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
- 1. Was ist der richtige Weg, um in Rails zu zählen?
- 2. Was ist der richtige Weg, um FB.Event.subscribe zu behandeln?
- 3. Was ist der richtige Weg um umzuleiten?
- 4. Was ist der richtige Weg, um Berechtigungen zu adressieren?
- 5. Was ist der richtige Weg, um diese Informationen zu erhalten?
- 6. Was ist der richtige Weg, Testbereiche um Ausnahmen zu gruppieren
- 7. Was ist der richtige Weg, um scala.io.Source zu verwenden?
- 8. Was ist der richtige Weg, um Controller-Aktionen zu erstellen?
- 9. Was ist der aktuelle richtige Weg, um Edelsteine zu veröffentlichen?
- 10. Was ist der richtige Weg, um eine QList zu initialisieren?
- 11. Was ist der richtige Weg, um eine ListBox zu laden?
- 12. Was ist der richtige Weg um Transienten zu markieren?
- 13. Was ist der richtige Weg, um den Fall zu vergleichen?
- 14. Was ist der richtige Weg, um Montageversion zu behandeln?
- 15. Was ist der richtige Weg, um EF-Warnungen zu unterdrücken?
- 16. Was ist der richtige Weg, um nach False zu suchen?
- 17. Was ist der richtige Weg, um Block in Initialisierungsmethoden einzurichten?
- 18. Was ist der richtige Weg, um log4j in JSP-Seiten
- 19. Was ist der richtige Weg, um das Vorhandensein einer Eigenschaft in einem JavaScript-Objekt zu testen?
- 20. Was ist der richtige Weg, um verwandte Objekte in Javascript zu steuern?
- 21. Was ist der richtige Weg, auf Verbindungen zu warten?
- 22. Lucene: Was ist der richtige Weg, um eine Suche abzubrechen?
- 23. Was ist der richtige Weg, um Java-Quellcode in Eclipse zu importieren, um Verfälschungen zu vermeiden?
- 24. Was ist der richtige Weg, um die CSV-Datei einzuloggen?
- 25. Was ist der richtige Weg, um mit Mongodb-Verbindungen umzugehen?
- 26. Was ist der richtige Weg, um diese Javascript-Schleife zu erreichen?
- 27. Was ist der richtige Weg, um eine Bildunterschrift mit html5
- 28. Was ist der richtige Weg, um den "in" -Operator zu verwenden, um ein Histogramm zu erstellen?
- 29. Was ist der richtige Weg, um eine Datei mit CUploadedFile
- 30. Was ist der richtige Weg zu prüfen, ob APC installiert und funktioniert?
Gibt es einen Grund, nicht == zu verwenden? – Kendrick
@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
@Kendrick - weil '{} ==" [object Object] "' als wahr ausgewertet , beispielsweise. –