Ich wollte die ganze Zeit === (Triple Equals, strenger Vergleich) verwenden, wenn ich String-Werte vergleiche, aber jetzt finde ich das
"foo" === new String("foo")
ist falsch und dasselbe damit:
var f = "foo", g = new String("foo");
f === g; // false
Natürlich:
f == g; // true
Wird also empfohlen, immer == für den Zeichenfolgenvergleich zu verwenden oder Variablen vor dem Vergleich immer in Zeichenfolgen zu konvertieren?
javascript
object
equality
Michael Butler
quelle
quelle
foo
es die reine Zeichenfolge undnew String("foo")
die Objektzeichenfolge istnew String
(völlig sinnlos) zu erstellen, anstatt sie zu verwenden==
new String("foo")
in Javascript verwenden wollen ? Ich habe noch nie einen solchen Code im Code gesehen, dh jQuery ...String(obj)
eine Box-Zeichenfolge in das Grundelement konvertieren, sobald Sie Ihren Parameter "Zeichenfolge" erhalten haben.("foo" === String(new String("foo"))) === true
Antworten:
"foo"
ist ein String- Primitiv . (Dieses Konzept existiert nicht in C # oder Java)new String("foo")
ist ein Boxed-String-Objekt.Der
===
Operator verhält sich bei Grundelementen und Objekten unterschiedlich .Beim Vergleich von Grundelementen (desselben Typs)
===
wird true zurückgegeben, wenn beide denselben Wert haben.Wird beim Vergleichen von Objekten
===
nur dann true zurückgegeben, wenn sie sich auf dasselbe Objekt beziehen (Vergleich nach Referenz). Also ,new String("a") !== new String("a")
.In Ihrem Fall wird
===
false zurückgegeben, da die Operanden unterschiedlichen Typs sind (einer ist ein Grundelement und der andere ein Objekt).Primitive sind überhaupt keine Objekte.
Der
typeof
Operator wird nicht"object"
für Grundelemente zurückkehren.Wenn Sie versuchen, auf eine Eigenschaft eines Grundelements zuzugreifen (indem Sie es als Objekt verwenden), wird es von der Javascript-Sprache in ein Objekt eingefügt und jedes Mal ein neues Objekt erstellt. Dies ist in der Spezifikation beschrieben .
Aus diesem Grund können Sie Primitiven keine Eigenschaften zuweisen:
Jedes Mal, wenn Sie schreiben
x.property
, wird ein anderes BoxobjektString
erstellt.quelle
typeof "foo"; // "string"
,typeof new String("foo"); // "object"
null
undundefined
.if( Object(a) !== a ) { //it's a primitive }
Verwenden von
===
,Ein Objekt ist niemals gleich etwas anderem als einem anderen Verweis auf sich selbst.
Ein Grundelement ist im Vergleich zu einem anderen Grundelement gleich, wenn Typ und Wert gleich sind.
quelle
new String("foo") === new String("foo")
istfalse
:-PDas
new
Wort ist hier ein Verbrecher ( wie üblich , darf ich sagen) ...Wenn Sie verwenden
new
, drücken Sie ausdrücklich Ihren Wunsch aus, mit Objekten zu arbeiten . Es mag für Sie überraschend sein, aber dies:... wird dir einen mächtigen geben
false
. Es ist ganz einfach: Im Vergleich werden nicht die Innenseiten der Objekte, sondern die Referenzen der Objekte verglichen. Und sie sind natürlich nicht gleich, da zwei verschiedene Objekte erstellt wurden.Was Sie wahrscheinlich verwenden möchten, ist die Konvertierung :
... und das wird Ihnen erwartungsgemäß
true
das Ergebnis geben, damit Sie sich für immer freuen und mit Ihrem Gleichen gedeihen könnenfoos
. )quelle
toString()
beispielsweise eine Methode.foo
ist die reine Zeichenfolge undnew String("foo")
ist die Objektzeichenfolgequelle
Aus der Datei node.js REPL ("Knoten" in der Befehlszeile, falls installiert):
quelle