54 votes

Pourquoi "" == [null] est-il vrai en JavaScript?

Je sais que JavaScript a beaucoup de fou résultats avec des comparaisons entre les types, bien que je ne pas bien comprendre pourquoi. Suis tombé sur celui d'aujourd'hui.

Pourquoi ne

"" == [null]

évaluer à l' true en JavaScript?

Certains plus sur le Javascript, l'égalité d'attractions, grâce à @Qantas:

76voto

Pointy Points 172438

Le "Résumé de l'Égalité de l'Algorithme de Comparaison" a beaucoup de pièces, mais l'important est ici:

Si le Type(x) est une Chaîne ou un Nombre et le Type(y) est l'Objet, retourner le résultat de la comparaison x == ToPrimitive(y).

(Il y a une image-miroir de trop.) Donc, parce qu' "" est une chaîne de caractères et [null] est un objet, nous devons d'abord convertir [null] d'une chaîne en appelant ToPrimitive([null]). C'est une opération interne décrites comme suit, quand il est demandé de convertir une instance d'Objet à une valeur primitive:

Renvoie une valeur par défaut pour l'Objet. La valeur par défaut d'un objet est extrait par l'appel de la [[Valeur par défaut]] méthode interne de l'objet, en passant l'option soupçon PreferredType. Le comportement de la [[Valeur par défaut]] méthode interne est défini par cette spécification pour tous les natifs ECMAScript objets dans 8.12.8.

Maintenant, le [[Valeur par défaut]] fonctionnement interne appellera .toString() sur l'objet et le retour de cette valeur. Essayez [null].toString() dans votre navigateur de la console:

> [null].toString()
""

Et là vous l'avez.

Edit: Et pourquoi est - [null].toString() une chaîne vide? Parce que l' .toString() opération sur le Tableau des instances toujours des appels .join(), et qui donne toujours une chaîne vide pour null et undefined valeurs. Ainsi, un tableau d'un null se termine comme une seule chaîne de caractères vide.

17voto

McGarnagle Points 56802

C'est selon les arcanes de conversion de type de règles de Javascript. Règle n ° 8:

Si le Type(x) est une Chaîne ou un Nombre et le Type(y) est l'Objet, de retourner le résultat de la comparaison x == ToPrimitive(y).

Donc la comparaison est entre x = "" et y = [null] converti en chaîne à l'aide de ToPrimitive. La conversion d'un tableau avec un élément null résultats dans une chaîne vide (car Array.toString() renvoie une liste séparée par des virgules de valeurs), d'où ils s'évaluer à l'égalité.

12voto

Bergi Points 104242

Pourquoi est - "" == [null] true?

Parce que vous êtes en comparant un tableau avec une chaîne, à l'aide de la non-opérateur d'égalité stricte == - donc, il va essayer de jeter des valeurs du même type avant de les comparer.

Ce qui se passe dans le détail:

  1. vous comparer une chaîne à un objet, l'objet est converti en une chaîne de caractères:
  2. Lorsqu'un tableau est converti en une valeur primitive, .toString() méthode est invoquée (comme expliqué en détail par les autres réponses), ce qui est équivalent à l'appel de .join():
  3. dans le cas d'un élément de tableau qui contient seulement un undefined ou null de la valeur renvoie la chaîne vide
  4. qui, finalement, est équivalent à la chaîne vide

Cette troisième étape est l'inattendu d'une ([null]+"" != null+""), si il a effectivement fait fonte qui à une chaîne, le résultat aurait été "null" et votre égalité d'être faux.

2voto

Paul S. Points 20115

Regardons la spécification et le suivi de chaque étape

Passer par le Résumé de l'Égalité de l'Algorithme de Comparaison (§11.9.3)

  1. typeof ""; // string et typeof [null]; // object donc pas applicable
  2. ni est - null ou indéfini donc pas applicable
  3. même que 2
  4. il n'est ni un nombre, n'est pas applicable
  5. même 4
  6. ni est un bool, ne s'applique pas
  7. encore une fois pas applicable
  8. enfin, quelque chose d'applicable, maintenant nous avons besoin de savoir ToPrimitive([null])

§9.1 ToPrimitive pour les Objets dit que nous devons travailler, [[DefaultValue]] (§8.12.8), points 1 et 2, qui disent si vous pouvez le faire .toString et il donne une chaîne, de retour, de sorte

[null].toString(); // ""

Nous sommes donc maintenant d'effectuer la comparaison "" == "" qui true par le Résumé de l'Égalité de l'Algorithme de Comparaison du point 1. d.

Si Type(x) est de la Chaîne, puis revenez true si x et y sont exactement la même séquence de caractères (même longueur et de même les personnages dans des positions correspondantes). Sinon, retour false.

1voto

user2829761 Points 19

JavaScript est faiblement typé. vous pouvez utiliser ce qui suit pour obtenir un résultat faux:

 "" === [null]
 

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