Programmation JavaScript/Expression littérale

Un livre de Wikilivres.

Dans un programme JavaScript, il est courant de devoir introduire des données sous forme littérale. Cela se produit principalement quand on renseigne une variable, ou quand on appelle une fonction.

Ce qui suit est valide pour le code JavaScript écrit dans les fichiers externes, ou entre les balises <script> </script>. En ce qui concerne le code associé aux évènements (onclick, onload...), l'approche est différente.

ma_var = "une chaîne exprimée littéralement";
mon_nombre = 12; // un nombre littéral;
alert("Ce message est une chaîne littérale");

Ces expressions littérales peuvent être des chaînes, ou des nombres.

Les chaînes sous forme littérale[modifier | modifier le wikicode]

Elles sont constituées de lettres, chiffres, ponctuation et symboles avec un mécanisme (échappement) permettant d'étendre cet ensemble à des caractères de contrôle, de formatage et des caractères spéciaux.

Une chaîne exprimée sous forme littérale est délimitée par des guillemets double ( " ) ou simple ( ' ).

La règle veut qu'une chaîne ouverte avec un guillemet double doit être fermée avec un guillemet double. De même, une chaîne ouverte avec un guillemet simple doit être fermée avec un guillemet simple.

La première complication se produit quand nous désirons inclure des guillemets dans notre chaîne.

Appelons une fonction avec une chaîne en paramètre :

Avertissement Ce code contient une erreur volontaire !
alert("le titre de l'article : "les joies de l'informatique"");
// ne marche pas

... à la place, on peut écrire:

alert("le titre de l'article : " +
      '"' + "les joies de l'informatique" + '"' );

... mais c'est affreux.

Pour utiliser une solution élégante, nous avons recours au mécanisme d'échappement.

Le mécanisme d'échappement[modifier | modifier le wikicode]

Le mécanisme d'échappement consiste à inclure dans les chaînes, des anti-slash (\) suivis d'un caractère choisi pour sa fonction.

les caractères échappés sont en nombre limités et facile à mettre en œuvre.

L'échappement des guillemets simples (\') ou double (\")[modifier | modifier le wikicode]

Précédé d'un anti-slash, les guillemets ne feront plus office de délimiteur de chaîne, et ceci permet de les inclure comme de simples symboles de ponctuation.

alert("Mon nom est \"Personne\""); // affiche : Mon nom est "Personne"

Le retour à la ligne avec \n[modifier | modifier le wikicode]

Il est interdit d'aller à la ligne à l'intérieur d'une chaîne de caractère délimitée par ' ou ".

Cependant, il peut être utile de formater une chaîne en la présentant sur plusieurs lignes. La séquence d'échappement \n réalise cela. Elle inclut en effet le caractère de contrôle "linefeed" (valeur 10 en décimal, 0A en hexadécimal) qui réalise le retour à la ligne avec la plupart des navigateurs graphique.

Par exemple, il n'est pas possible de formater une chaîne de caractère en utilisant le code suivant :

Avertissement Ce code contient une erreur volontaire !
alert("première, 
deuxième 
et troisième ligne");
// ne marche pas

Il faudra utiliser à la place l'écriture suivante :

alert("première, \ndeuxième \net troisième ligne");

... affiche :

première,
deuxième
et troisième ligne

Le retour à la ligne avec `[modifier | modifier le wikicode]

Autre solution, utiliser l'accent grave à la place de ' ou " (`) :

alert(`première, 
deuxième 
et troisième ligne`);

La tabulation avec \t[modifier | modifier le wikicode]

La séquence d'échappement \t insère un caractère de tabulation dans la chaîne, et permet ainsi de formater l'affichage. Le caractère de tabulation est codé 9 en décimal et 09 en hexadécimal.

alert("colonne 1 \tcolonne 2 \tcolonne 3");

L'inclusion de caractères unicode avec \u[modifier | modifier le wikicode]

Javascript, quand il est codé dans un fichier distinct, ou quand il est codé entre les balises <script> </script> ne supporte pas les entités de la forme &lt; ou &#160;, ou toute autre forme d'entité.

L'échappement \u offre un mécanisme de remplacement dont la mise en œuvre nécessite de se référer à une table associant les codes hexadécimaux au symboles correspondant (par exemple).

Ces codes hexadécimaux sont présentés avec 4 (ou 5) chiffres hexadécimaux, et la séquence d'échappement \u nécessite d'écrire ces 4 chiffres sous peine d'un déclenchement d'erreur.

alert("Rodrigue as-tu du c\u0153ur?");

... affiche Rodrigue as-tu du cœur?

ce qui est plus conforme à l'original que l'anti-typographique "coeur", utilisé à longueur d'internet.

L'inclusion de caractères Unicode permet l'accès aux symboles et à la citation de fragments utilisant d'autres alphabets que le nôtre.

De plus, il permet également l'inclusion des caractères de contrôle. Ainsi, \n et \u000A sont équivalents.

Table Unicode (wikipédia)

Unicode est toutefois plus vaste et peut être découvert au travers du livre Wikibooks À la découverte d'Unicode.

Les nombres sous forme littérale[modifier | modifier le wikicode]

Les nombres sont constitués de chiffres et de signes à l'exclusion du caractère espace. JavaScript permet d'exprimer littéralement les nombres entiers, réels, octaux, hexadécimaux, exponentiels, sous forme positive ou négative.

Les nombres négatifs[modifier | modifier le wikicode]

En plaçant le signe moins ( - ) devant le nombre, on obtient ce nombre en négatif, et ceci qu'il soit noté comme entier, réel, octal, hexadécimal ou exponentiel.

ma_var = -5;

Les entiers[modifier | modifier le wikicode]

Ils s'écrivent tel quel, c'est la représentation par défaut, employant les chiffres 0 à 9.

ma_var = 12;

Les réels[modifier | modifier le wikicode]

Le signe de séparation de la partie entière est le point ( . )

ma_var = 8.65;

L'octal[modifier | modifier le wikicode]

Un nombre commençant par zero et ne comprenant que les chiffres de 0 à 7 sera interprété en octal.

ma_var = 0257;

L'hexadécimal[modifier | modifier le wikicode]

Un nombre commençant par 0x (ou 0X) comprenant les chiffres et les lettres abcdef en minuscule, majuscule ou les deux, sera interprété en hexadécimal.

ma_var = 0xf044;

La notation scientifique[modifier | modifier le wikicode]

En faisant suivre un nombre entier ou réel de la lettre e (ou E), elle-même suivie d'un entier positif ou négatif, on obtient un nombre en notation scientifique.

ma_var = 2.5e40; // Un grand nombre : 2,5 * 10 exposant 40
ma_var = 50e-30 // Un tout petit nombre

Taille des nombres[modifier | modifier le wikicode]

Le type number est au format 64 bits double précision.

Les chaînes littérales dans les expressions associées aux évènements[modifier | modifier le wikicode]

À l'intérieur des balises HTML, il est possible d'intégrer du code JavaScript associé aux évènements, (comme onclick, onmouseover...). Javascript est à ce moment là interprété en dehors de son territoire propre, c'est à dire entre les balises <script> et </script> ou dans un fichier séparé. Sa rédaction obéit alors aux règles de rédaction des attributs des balises, qui n'autorisent pas tout.

<div onclick="alert('Je suis cliqué')">cliquez moi!</div>

Html, comme xhtml, ne reconnaît pas les séquences de type \uHHHH. Nous devons nous limiter aux caractères échappés classiques, amputés de ( \" ) et ( \' ). En effet, ces deux caractères ne seront pas interprétables comme valeur de la propriété de la balise.

Si nous voulons afficher Je suis "cliqué", nous devons recourir aux entités.

Les entités sont un mécanisme permettant d'insérer n'importe quel caractère dans une chaîne.

Selon la référence du doctype html, nous aurons accès à des entités munies d'un identificateur. Sinon, sous réserve de disposer d'une table adéquate, nous pouvons reproduire n'importe quel caractère.

Sans aller plus-avant dans la description des entités, nous pouvons les décrire comme suit :

L'entité commence par le caractère & (esperluette ou "et commercial") et finit par un point-virgule. Entre ces deux symboles, on rencontre soit un identificateur ( &lt; &gt; &amp;), soit le code du caractère exprimé en décimal et précédé du signe sharp (#) (&#160; &#339;).

<div onclick="alert('Je suis &#34;cliqué&#34;')"> // Affiche: Je suis "cliqué"
     cliquez moi!
</div>

... Mission accomplie.