"foo"
est une chaîne de caractères primitifs. (ce concept n'existe pas en C# ou Java)
new String("foo")
est encadré objet de type string.
L' ===
opérateur se comporte différemment sur les primitives et les objets.
Lorsque l'on compare les primitives (de même type), ===
retournera true si les deux ont la même valeur.
Lorsque l'on compare les objets, ===
retournera true seulement si ils font référence au même objet (en comparant par référence). Ainsi, new String("a") !== new String("a")
.
Dans votre cas, ===
renvoie faux car les opérandes sont de types différents (l'un est une primitive et l'autre est un objet).
Les Primitives ne sont pas des objets.
L' typeof
opérateur ne sera pas de retour "object"
pour les primitives.
Lorsque vous essayez d'accéder à une propriété d'une primitive (en l'utilisant comme un objet), le langage Javascript va boîte à un objet, la création d'un nouvel objet à chaque fois. Ceci est décrit dans la spécification.
C'est pourquoi vous ne pouvez pas mettre propriétés primitives:
var x = "a";
x.property = 2;
alert(x.property) //undefined
Chaque fois que vous écrivez x.property
, différentes coffret String
objet est créé.