Permettez-moi d'ajouter ce conseil :
En cas de doute, lisez le spécification !
L'ECMA-262 est la spécification d'un langage de script dont JavaScript est un dialecte. Bien sûr, dans la pratique, le comportement des principaux navigateurs importe davantage qu'une définition ésotérique de la manière dont quelque chose est censé être traité. Mais il est utile de comprendre pourquoi new String("a") !== "a" .
Laissez-moi vous expliquer comment lire le cahier des charges pour clarifier cette question. Je vois que dans ce très vieux sujet, personne n'a eu de réponse pour cet effet très étrange. Donc, si vous pouvez lire une spécification, cela vous aidera énormément dans votre profession. C'est une compétence acquise. Alors, continuons.
La recherche de === dans le fichier PDF m'amène à la page 56 de la spécification : 11.9.4. L'opérateur d'égalité stricte ( === ) et, après avoir parcouru le jargon spécifique, j'ai trouvé :
11.9.6 L'algorithme de comparaison d'égalité stricte
La comparaison x === y, où x et y sont des valeurs, produit vrai ou faux . Une telle comparaison est effectuée comme suit :
1. Si Type(x) est différent de Type(y), retourner faux .
2. Si Type(x) est indéfini, retourner vrai .
3. Si Type(x) est Null, retourner vrai .
4. Si Type(x) n'est pas Nombre, passez à l'étape 11.
5. Si x est NaN , retour faux .
6. Si y est NaN , retour faux .
7. Si x a la même valeur numérique que y, retourner vrai .
8. Si x est +0 et y est 0, retourner vrai .
9. Si x est égal à 0 et y est égal à +0, retourner vrai .
10. Retour faux .
11. Si Type(x) est String, alors on retourne vrai si x et y sont exactement la même séquence de caractères (même longueur et mêmes caractères dans les positions correspondantes) ; sinon, retourner faux .
12. Si Type(x) est booléen, retourner vrai si x et y sont tous deux vrai ou les deux faux ; sinon, retour faux .
13. Retour vrai si x et y font référence au même objet ou s'ils font référence à des objets joints l'un à l'autre (voir 13.1.2). Sinon, on retourne faux .
L'étape 11 est intéressante. Oui, les chaînes de caractères sont traitées comme des types de valeurs. Mais cela n'explique pas pourquoi new String("a") !== "a" . Avons-nous un navigateur non conforme à la norme ECMA-262 ?
Pas si vite !
Vérifions les types des opérandes. Essayez de le faire vous-même en les entourant de typeof() . Je trouve que nouveau String("a") est un objet, et l'étape 1 est utilisée : return faux si les types sont différents.
Si vous vous demandez pourquoi nouveau String("a") ne renvoie pas une chaîne de caractères, que diriez-vous d'un exercice de lecture d'une spécification ? Amusez-vous bien !
Aidiakapi a écrit ceci dans un commentaire ci-dessous :
Extrait du cahier des charges
11.2.2 Le nouvel opérateur :
Si le Type(constructeur) n'est pas Object, on lève une exception TypeError.
En d'autres termes, si String ne serait pas de type Object, il ne pourrait pas être utilisé avec l'opérateur new.
nouveau renvoie toujours un objet, même pour Chaîne de caractères constructeurs, aussi. Et hélas ! La sémantique des valeurs pour les chaînes de caractères (voir étape 11) est perdue.
Et cela signifie finalement : new String("a") !== "a" .