65 votes

Différence entre le type de chaîne et l'objet chaîne en javascript ?

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 ?

45voto

olliej Points 16255

Les chaînes de caractères sont un type de valeur en JS, elles ne peuvent donc pas avoir de propriétés qui leur soient attachées, pas de prototype, etc. Toute tentative d'accès à une de leurs propriétés revient techniquement à effectuer la conversion JS [[ToObject]] (en fait une nouvelle chaîne).

Une façon simple de distinguer la différence est (dans un navigateur)

a = "foo"
a.b = "bar"
alert("a.b = " + a.b); //Undefined

A = new String("foo");
A.b = "bar";
alert("A.b = " + A.b); // bar

De plus, alors que

"foo" == new String("foo")

est vraie, elle ne l'est qu'en raison des conversions de type implicites de l'opérateur ==.

"foo" === new String("foo")

échouera.

12voto

Jason Orendorff Points 15869

C'est analogue à la différence entre int y Integer en Java.

Selon la norme, les chaînes de caractères sont automatiquement converties en String lorsque vous essayez d'appeler une méthode. Voir ECMA 262-3 section 11.2.1 ; l'étape 5 appelle ToObject (qui est défini à la section 9.9).

11.2
[...]
La production MemberExpression : MemberExpression [ Expression ] est évaluée comme suit :

  1. Évaluer MemberExpression.
  2. Appelez GetValue(Résultat(1)).
  3. Évaluer l'expression.
  4. Appelez GetValue(Résultat(3)).
  5. Appelez ToObject(Resultat(2)).
  6. Appelez ToString(Résultat(4)).
  7. Retourne une valeur de type Référence dont l'objet de base est Résultat(5) et dont le nom de la propriété est Résultat(6).

9.9 ToObject

L'opérateur ToObject convertit son argument en une valeur de type Object selon les règles suivantes
[...]
Créez un nouvel objet String dont la propriété [[value]] est fixée à chaîne de caractères. Voir 15.5 pour une description des objets String.

En tant que technique de spécification, il s'agit d'une astuce pour expliquer comment les chaînes de caractères peuvent sembler avoir des méthodes alors qu'elles ne sont pas vraiment des objets.

En dehors de cela, les objets wrappers ne sont pas très utiles. Je ne sais pas pourquoi ils sont dans le langage. J'aurais préféré qu'ils n'y soient pas :)

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