Je me suis amusé avec la norme ECMA-262 ( Spécification du langage ECMAScript, 3ème édition, si c'est important pour cela - je n'ai pas trouvé de différence entre la 3ème et la 5ème édition sur String Type / String Object).
Il y a une chose qui me laisse perplexe : la différence entre le type String et le String Object. Oui, je connais la différence dans le sens où le type Type de chaîne est une séquence d'unités UTF-16 de 16 bits et l'élément Objet String est un objet intégré avec son Classe définie comme "String" et sa propriété interne Valeur définie comme une valeur de l'élément Type de chaîne .
Mais en lisant la spécification, le type string ne semble pas exposer de méthodes, c'est-à-dire qu'il s'agit juste d'une valeur sans aucune propriété supplémentaire. Prenez ce code, tout est exactement comme prévu :
document.writeln(typeof "foo"); // 'string'
document.writeln(typeof new String("foo")); // 'object'
Le premier type est l'actuel Type de chaîne et le second est le Type d'objet (c'est un objet de la classe Chaîne de caractères mais son type de données est un objet). Cependant, en regardant ceci :
"foo".charAt(0);
fooStrObj = new String("Foo");
fooStrObj.charAt(0);
Ils semblent tous deux exposer les mêmes fonctions, mais il n'y a pas de fonctions sur l'onglet Type de chaîne définie dans la norme ECMA-262 ; toutes les fonctions qu'elle expose proviennent de l'objet String.prototype (et je ne vois aucune référence au fait que l'objet Type de chaîne expose magiquement toutes les propriétés et fonctions de l'objet String.prototype dans la norme ECMA-262). Il en est de même pour les valeurs de type Type de chaîne automatiquement promu à un Objet String avec l'original Type de chaîne comme sa valeur interne Valeur la propriété ?
Et s'ils sont traités exactement de la même manière (ce qui semble être le cas), pourquoi avoir deux façons différentes de représenter une Chaîne de caractères ?