Lassen Sie mich diesen Ratschlag hinzufügen:
Im Zweifelsfall lesen Sie bitte die Spezifikation !
ECMA-262 ist die Spezifikation für eine Skriptsprache, von der JavaScript ein Dialekt ist. In der Praxis kommt es natürlich mehr darauf an, wie sich die wichtigsten Browser verhalten, als auf eine esoterische Definition, wie etwas gehandhabt werden soll. Aber es ist hilfreich zu verstehen, warum new String("a") !== "a" .
Bitte lassen Sie mich erklären, wie man die Spezifikation liest, um diese Frage zu klären. Ich sehe, dass in diesem sehr alten Thema niemand eine Antwort auf diesen sehr seltsamen Effekt hatte. Wenn Sie also eine Spezifikation lesen können, wird Ihnen das in Ihrem Beruf ungemein helfen. Das ist eine erworbene Fähigkeit. Also, machen wir weiter.
Die Suche in der PDF-Datei nach === bringt mich auf Seite 56 der Spezifikation: 11.9.4. Der strenge Gleichheitsoperator ( === ) und nachdem ich mich durch den Fachjargon gewühlt habe, finde ich:
11.9.6 Der Algorithmus für den strikten Gleichheitsvergleich
Der Vergleich x === y, wobei x und y Werte sind, ergibt wahr o falso . Ein solcher Vergleich wird wie folgt durchgeführt:
1. Wenn Typ(x) von Typ(y) verschieden ist, wird zurückgegeben falso .
2. Wenn Type(x) Undefined ist, wird zurückgegeben wahr .
3. Wenn Type(x) Null ist, wird zurückgegeben wahr .
4. Wenn Typ(x) nicht Zahl ist, gehen Sie zu Schritt 11.
5. Wenn x ist NaN Rückkehr falso .
6. Wenn y NaN Rückkehr falso .
7. Wenn x der gleiche Zahlenwert wie y ist, wird zurückgegeben wahr .
8. Wenn x gleich +0 und y gleich 0 ist, wird wahr .
9. Wenn x gleich 0 und y gleich +0 ist, wird wahr .
10. Rückgabe falso .
11. Wenn Type(x) String ist, dann wird wahr wenn x und y genau die gleiche Zeichenfolge sind (gleiche Länge und gleiche Zeichen an den entsprechenden Stellen); andernfalls wird zurückgegeben falso .
12. Wenn Typ(x) boolesch ist, wird wahr wenn x und y beide wahr oder beides falso ; andernfalls, Rückkehr falso .
13. Rückgabe wahr wenn sich x und y auf dasselbe Objekt beziehen oder wenn sie sich auf miteinander verbundene Objekte beziehen (siehe 13.1.2). Andernfalls wird zurückgegeben falso .
Interessant ist Schritt 11. Ja, Zeichenketten werden als Werttypen behandelt. Aber das erklärt nicht, warum new String("a") !== "a" . Haben wir einen Browser, der nicht ECMA-262-konform ist?
Nicht so schnell!
Lassen Sie uns die Typen der Operanden überprüfen. Probieren Sie es selbst aus, indem Sie sie in typeof() . Ich finde, dass new String("a") ein Objekt ist und Schritt 1 angewendet wird: return falso wenn die Typen unterschiedlich sind.
Wenn Sie sich fragen, warum new String("a") keine Zeichenkette zurückgibt, wie wäre es mit einer Übung zum Lesen einer Spezifikation? Viel Spaß dabei!
Aidiakapi schrieb dies in einem Kommentar unten:
Aus der Spezifikation
11.2.2 Der neue Operator :
Wenn Type(constructor) nicht Object ist, wird eine TypeError-Ausnahme ausgelöst.
Mit anderen Worten, wenn String nicht vom Typ Object wäre, könnte er nicht mit dem new-Operator verwendet werden.
neu gibt immer ein Objekt zurück, auch bei Zeichenfolge auch Konstrukteure. Und ach! Die Wertesemantik für Zeichenketten (siehe Schritt 11) ist verloren.
Und das bedeutet letztendlich: new String("a") !== "a" .