Why does ("foo" === new String("foo")) evaluate to false in JavaScript?
Solution 1:
"foo"
is a string primitive. (this concept does not exist in C# or Java)
new String("foo")
is boxed string object.
The ===
operator behaves differently on primitives and objects.
When comparing primitives (of the same type), ===
will return true if they both have the same value.
When comparing objects, ===
will return true only if they refer to the same object (comparing by reference). Thus, new String("a") !== new String("a")
.
In your case, ===
returns false because the operands are of different types (one is a primitive and the other is an object).
Primitives are not objects at all.
The typeof
operator will not return "object"
for primitives.
When you try to access a property of a primitive (using it as an object), the Javascript language will box it to an object, creating a new object every time. This is described in the specification.
This is why you cannot put properties on primitives:
var x = "a";
x.property = 2;
alert(x.property) //undefined
Each time you write x.property
, a different boxed String
object is created.
Solution 2:
Using ===
,
an Object is never equal to anything except another reference to itself.
a primitive is equal when compared to another primitive if their type and value are the same.