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.