98 votes

Pourquoi fait (« foo » === nouveau String("foo")) ont la valeur false en JavaScript ?

Je m’apprêtais à commencer à utiliser === (correspond à triple, une comparaison stricte) tout le temps lorsque l'on compare les valeurs de chaîne, mais maintenant je trouve que

est faux et même avec ceci :

Bien sûr :

Il est donc recommandé de toujours utiliser == pour la comparaison de chaînes, ou toujours convertir des variables en chaînes avant de le comparer ?

126voto

SLaks Points 391154

"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éé.

34voto

squint Points 28293

À l’aide de `` ,

  • un objet n’est jamais égal à rien, sauf une autre référence à elle-même.
  • une primitive est égale par rapport à une autre primitive si leur type et leur valeur sont identiques.

10voto

raina77ow Points 45965

L' new mot est un criminel (comme d'habitude, je veux dire)...

Lorsque vous utilisez new, vous l'avez explicitement exprimer votre désir de travailler avec l'objet. Il peut être surprenant pour vous, mais ce:

var x = new String('foo');
var y = new String('foo');
x === y; 

... vous donnera un puissant false. C'est simple: comparaison ne sont pas les objets' intérieur, mais la des références d'objet. Et, bien sûr, ne sont pas égaux, comme deux objets différents ont été créés.

Ce que vous voulez probablement à utiliser est la conversion:

var x = String('foo');
var y = String('foo');
x === y;

... et qui vous donnera, comme prévu, true comme résultat, de sorte que vous pouvez vous réjouir et à prospérer avec votre égal foos jamais. )

4voto

Danilo Valente Points 6375

est la chaîne pure et est la chaîne de l’objet

2voto

mda Points 617

De la node.js REPL (« nœud » sur la ligne de commande s’installé) :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X