"foo"
ist eine Zeichenfolge primitive. (Dieses Konzept existiert nicht in C# oder Java)
new String("foo")
ist ein Boxed-String-Objekt.
Der Operator ===
behaves differently on primitives and objects.
Beim Vergleich von Primitiven (desselben Typs) gibt ===
den Wert true zurück, wenn beide den gleichen Wert haben.
Beim Vergleich von Objekten gibt ===
nur dann true zurück, wenn sie sich auf dasselbe Objekt beziehen (Vergleich durch Referenz). So, new String("a") !== new String("a")
.
In Ihrem Fall gibt ===
false zurück, weil die Operanden von verschiedenen Typen sind (einer ist ein Primitiv und der andere ist ein Objekt).
Primitive sind überhaupt keine Objekte.
Der Operator typeof
gibt "object"
für Primitive nicht zurück.
Wenn Sie versuchen, auf eine Eigenschaft eines Primitivs zuzugreifen (indem Sie es als Objekt verwenden), wird es von der JavaScript-Sprache in ein Objekt eingeschlossen und jedes Mal ein neues Objekt erstellt. Dies ist in der specification beschrieben. Diese
ist, warum Sie nicht Eigenschaften auf Primitiven setzen können:
var x = "a";
x.property = 2;
alert(x.property) //undefined
Jedes Mal, wenn Sie x.property
, ein verschiedenen boxed String
Objekt schreiben wird erstellt.
Vielleicht, weil 'foo' ist der reine String und 'new String ("foo")' ist die Objektkette –
Hintergrund: http://stackoverflow.com/questions/1646698/what-is-the-new-keyword-in-javascript –
Es wird empfohlen, keine Strings mit 'new String' (völlig sinnlos) zu erstellen using '==' – Esailija