"foo"
to ciąg pierwotny prymitywny. (ta koncepcja nie istnieje w języku C# lub Java)
new String("foo")
to obiekt w ramkach.
Operator ===
behaves differently on primitives and objects.
Porównując prymitywy (tego samego typu), ===
zwróci wartość true, jeśli obie mają tę samą wartość.
Porównując obiekty, ===
zwróci true tylko wtedy, gdy odnoszą się do tego samego obiektu (porównywanie przez odniesienie). Tak więc, new String("a") !== new String("a")
.
W twoim przypadku ===
zwraca wartość false, ponieważ operandy są różnych typów (jeden jest prymitywny, a drugi jest obiektem).
Primenty nie są wcale obiektami.
Operator typeof
nie zwróci "object"
dla elementów pierwotnych.
Podczas próby uzyskania dostępu do właściwości obiektu pierwotnego (używając go jako obiektu), język JavaScript spowoduje umieszczenie go w obiekcie, tworząc za każdym razem nowy obiekt. Jest to opisane w specification.
To dlaczego nie można umieścić na właściwości prymitywów:
var x = "a";
x.property = 2;
alert(x.property) //undefined
każdym razem piszesz x.property
, A inny zapakowane String
obiekt jest tworzony.
Może dlatego 'foo' jest czysty łańcuch i' new String ("foo") 'jest Obiekt String –
Tło: http://stackoverflow.com/questions/1646698/what-is-the-new-keyword-in-javascript –
Zaleca się, aby nie tworzyć ciągów z 'nowym ciągiem' (całkowicie bezcelowe) zamiast używając '==' – Esailija