Nouveautés dans JavaScript 1.8

  • Raccourci de la révision : Nouveautés_dans_JavaScript_1.8
  • Titre de la révision : Nouveautés dans JavaScript 1.8
  • ID de la révision : 284450
  • Créé :
  • Créateur : Mgjbot
  • Version actuelle ? Non
  • Commentaire robot Ajoute: [[pl:Nowości w JavaScript 1.8]] <<langbot>>

Contenu de la révision

{{template.Fx_minversion_header(3)}} JavaScript 1.8 est prévu pour accompagner Gecko 1.9 (qui fera partie de Firefox 3). Il s'agit d'une mise à jour moins importante que JavaScript 1.7, mais elle contient certains adaptations suivant la progression vers ECMAScript 4/JavaScript 2. Cette version comprendra toutes les fonctionnalités spécifiées dans JavaScript 1.6 et JavaScript 1.7.

Consultez le {{template.Bug(380236)}} pour suivre les progrès du développement de JavaScript 1.8.

Utilisation de JavaScript 1.8

Afin d'utiliser certaines des nouvelles fonctionnalités de JavaScript 1.8, vous devrez spécifier que vous voulez utiliser cette version. Dans du code HTML ou XUL, utilisez :

 <script type="application/javascript;version=1.8"> … votre code … </script>

Lorsque vous utilisez le shell JavaScript, vous devez indiquer la version que vous désirez utiliser à l'aide de la fonction version() :

 version(180);

Pour utiliser les fonctionnalités nécessitant l'utilisation des nouveaux mots-clés « yield » et « let », la version 1.7 ou supérieure doit être spécifiée, car du code existant peut utiliser ces mots-clés comme noms de variables ou de fonctions. Les fonctionnalités qui n'utilisent pas de nouveaux mots-clés (comme les expressions génératrices) peuvent être utilisés sans préciser la version de JavaScript.

Fermetures d'expressions

Cet ajout n'est qu'un raccourci pour écrire des fonctions simples, donnant au langage quelque chose de semblable à une notation de Lambda-calcul typique.

JavaScript 1.7 et plus anciens :

 function(x) { return x * x; }

JavaScript 1.8 :

 function(x) x * x

Cette syntaxe permet de ne pas utiliser les crochets et l'instruction return en les rendant implicites. Il n'y a aucun bénéfice particulier à tirer de l'écriture de code de cette manière, à part le fait que ce soit plus court syntaxiquement.

Exemples :

Un raccourci pour lier des écouteurs d'évènements :

 document.addEventListener("click", function() false, true);

Utilisation de cette notation avec certaines des fonctions pour les tableaux de JavaScript 1.6 :

 elems.some(function(elem) elem.type == "text");

Expressions génératrices

Cet ajout permet de créer des générateurs simplement (les générateurs ont été introduits dans JavaScript 1.7). Typiquement, on aurait eu besoin de créer une fonction personnalisée contenant un yeld, mais ceci permet d'utiliser une syntaxe semblable à la compréhension de tableaux pour créer une instruction génératrice identique.

Dans JavaScript 1.7, on pourrait écrire quelque chose de semblable à ceci pour créer un générateur personnalisé pour un objet :

 function add3(obj) {
   for ( let i in obj )
     yield i + 3;
 }
 
 let it = add3(someObj);
 try {
   while (true) {
     document.write(it.next() + "<br>\n");
   }
 } catch (err if err instanceof StopIteration) {
   document.write("Fin de l'enregistrement.<br>\n");
 }

En JavaScript 1.8, on peut éviter la création d'une fonction génératrice personnalisée en créant une expression génératrice à la place :

 let it = (i + 3 for (i in someObj));
 try {
   while (true) {
     document.write(it.next() + "<br>\n");
   }
 } catch (err if err instanceof StopIteration) {
   document.write("Fin de l'enregistrement.<br>\n");
 }

Des expressions génératrices peuvent également être passées, comme valeurs, à une fonction. C'est particulièrement notable étant donné que les générateurs ne sont pas exécutés tant qu'ils ne sont pas absolument nécessaires (contrairement aux situations typiques de compréhension de tableaux, où ceux-ci sont construits à l'avance). Voici un exemple de cette différence :

En utilisant une définition de tableau par compréhension en JavaScript 1.7

 handleResults([ i for ( i in obj ) if ( i > 3 ) ]);
 
 function handleResults( results ) {
   for ( let i in results )
     // ...
 }

En utilisant une expression génératrice de JavaScript 1.8

 handleResults( i for ( i in obj ) if ( i > 3 ) );
 
 function handleResults( results ) {
   for ( let i in results )
     // ...
 }

La différence significative entre les deux exemples est qu'en utilisant l'expression génératrice, il ne faut parcourir la structure obj qu'une seule fois au total, contrairement à la définition par compréhension, et de même lors des itérations dans celle-ci.

Plus d'extras pour les tableaux

Deux nouvelles méthodes itératives pour Array sont fournies avec JavaScript 1.8, il s'agit de :

  • reduce() — exécute une fonction sur chaque élément du tableau et collecte les résultats des appels précédents.
  • reduceRight() — exécute une fonction sur chaque élément du tableau et collecte les résultats des appels précédents, mais dans le sens inverse.

Changements à venir

Parmi les autres changements prévus dans JavaScript 1.8, citons :

  • L'encodage et décodage JSON encoding.
  • Une syntaxe de découpage.
  • Déstructuration généralisée avec for...in.


{{ wiki.languages( { "en": "en/New_in_JavaScript_1.8", "ja": "ja/New_in_JavaScript_1.8", "pl": "pl/Nowo\u015bci_w_JavaScript_1.8" } ) }}

Source de la révision

<p>{{template.Fx_minversion_header(3)}}
JavaScript 1.8 est prévu pour accompagner Gecko 1.9 (qui fera partie de <a href="fr/Firefox_3">Firefox 3</a>). Il s'agit d'une mise à jour moins importante que <a href="fr/Nouveaut%c3%a9s_dans_JavaScript_1.7">JavaScript 1.7</a>, mais elle contient certains adaptations suivant la progression vers ECMAScript 4/JavaScript 2. Cette version comprendra toutes les fonctionnalités spécifiées dans <a href="fr/Nouveaut%c3%a9s_dans_JavaScript_1.6">JavaScript 1.6</a> et <a href="fr/Nouveaut%c3%a9s_dans_JavaScript_1.7">JavaScript 1.7</a>.
</p><p>Consultez le {{template.Bug(380236)}} pour suivre les progrès du développement de JavaScript 1.8.
</p>
<h3 name="Utilisation_de_JavaScript_1.8"> Utilisation de JavaScript 1.8 </h3>
<p>Afin d'utiliser certaines des nouvelles fonctionnalités de JavaScript 1.8, vous devrez spécifier que vous voulez utiliser cette version. Dans du code HTML ou XUL, utilisez :
</p>
<pre class="eval"> &lt;script type="application/javascript;version=1.8"&gt; … votre code … &lt;/script&gt;
</pre>
<p>Lorsque vous utilisez le <a href="fr/Introduction_au_shell_JavaScript">shell JavaScript</a>, vous devez indiquer la version que vous désirez utiliser à l'aide de la fonction <code>version()</code> :
</p>
<pre class="eval"> version(180);
</pre>
<p>Pour utiliser les fonctionnalités nécessitant l'utilisation des nouveaux mots-clés « <code>yield</code> » et « <code>let</code> », la version 1.7 ou supérieure doit être spécifiée, car du code existant peut utiliser ces mots-clés comme noms de variables ou de fonctions. Les fonctionnalités qui n'utilisent pas de nouveaux mots-clés (comme les expressions génératrices) peuvent être utilisés sans préciser la version de JavaScript.
</p>
<h3 name="Fermetures_d.27expressions"> Fermetures d'expressions </h3>
<p>Cet ajout n'est qu'un raccourci pour écrire des fonctions simples, donnant au langage quelque chose de semblable à une <a class="external" href="http://en.wikipedia.org/wiki/Lambda_calculus#Lambda_calculus_and_programming_languages">notation de Lambda-calcul</a> typique.
</p><p><a href="fr/Nouveaut%c3%a9s_dans_JavaScript_1.7">JavaScript 1.7</a> et plus anciens :
</p>
<pre class="eval"> function(x) { return x * x; }
</pre>
<p>JavaScript 1.8 :
</p>
<pre class="eval"> function(x) x * x
</pre>
<p>Cette syntaxe permet de ne pas utiliser les crochets et l'instruction <code>return</code> en les rendant implicites. Il n'y a aucun bénéfice particulier à tirer de l'écriture de code de cette manière, à part le fait que ce soit plus court syntaxiquement.
</p><p><b>Exemples :</b>
</p><p>Un raccourci pour lier des écouteurs d'évènements :
</p>
<pre class="eval"> document.addEventListener("click", function() false, true);
</pre>
<p>Utilisation de cette notation avec certaines des fonctions pour les tableaux de <a href="fr/Nouveaut%c3%a9s_dans_JavaScript_1.6">JavaScript 1.6</a> :
</p>
<pre class="eval"> elems.some(function(elem) elem.type == "text");
</pre>
<h3 name="Expressions_g.C3.A9n.C3.A9ratrices"> Expressions génératrices </h3>
<p>Cet ajout permet de créer des générateurs simplement (les générateurs ont été introduits dans <a href="fr/Nouveaut%c3%a9s_dans_JavaScript_1.7">JavaScript 1.7</a>). Typiquement, on aurait eu besoin de créer une fonction personnalisée contenant un <code>yeld</code>, mais ceci permet d'utiliser une syntaxe semblable à la compréhension de tableaux pour créer une instruction génératrice identique.
</p><p>Dans <a href="fr/Nouveaut%c3%a9s_dans_JavaScript_1.7">JavaScript 1.7</a>, on pourrait écrire quelque chose de semblable à ceci pour créer un générateur personnalisé pour un objet :
</p>
<pre class="eval"> function add3(obj) {
   for ( let i in obj )
     yield i + 3;
 }
 
 let it = add3(someObj);
 try {
   while (true) {
     document.write(it.next() + "&lt;br&gt;\n");
   }
 } catch (err if err instanceof StopIteration) {
   document.write("Fin de l'enregistrement.&lt;br&gt;\n");
 }
</pre>
<p>En JavaScript 1.8, on peut éviter la création d'une fonction génératrice personnalisée en créant une expression génératrice à la place :
</p>
<pre class="eval"> let it = (i + 3 for (i in someObj));
 try {
   while (true) {
     document.write(it.next() + "&lt;br&gt;\n");
   }
 } catch (err if err instanceof StopIteration) {
   document.write("Fin de l'enregistrement.&lt;br&gt;\n");
 }
</pre>
<p>Des expressions génératrices peuvent également être passées, comme valeurs, à une fonction. C'est particulièrement notable étant donné que les générateurs ne sont pas exécutés tant qu'ils ne sont pas absolument nécessaires (contrairement aux situations typiques de compréhension de tableaux, où ceux-ci sont construits à l'avance). Voici un exemple de cette différence :
</p><p>En utilisant une définition de tableau par compréhension en JavaScript 1.7
</p>
<pre class="eval"> handleResults([ i for ( i in obj ) if ( i &gt; 3 ) ]);
 
 function handleResults( results ) {
   for ( let i in results )
     // ...
 }
</pre>
<p>En utilisant une expression génératrice de JavaScript 1.8
</p>
<pre class="eval"> handleResults( i for ( i in obj ) if ( i &gt; 3 ) );
 
 function handleResults( results ) {
   for ( let i in results )
     // ...
 }
</pre>
<p>La différence significative entre les deux exemples est qu'en utilisant l'expression génératrice, il ne faut parcourir la structure <code>obj</code> qu'une seule fois au total, contrairement à la définition par compréhension, et de même lors des itérations dans celle-ci.
</p>
<h3 name="Plus_d.27extras_pour_les_tableaux"> Plus d'extras pour les tableaux </h3>
<p>Deux nouvelles méthodes itératives pour <code><a href="fr/Core_JavaScript_1.5_Reference/Objects/Array">Array</a></code> sont fournies avec JavaScript 1.8, il s'agit de :
</p>
<ul><li> <code><a href="fr/Core_JavaScript_1.5_Reference/Objects/Array/reduce">reduce()</a></code> — exécute une fonction sur chaque élément du tableau et collecte les résultats des appels précédents.
</li><li> <code><a href="fr/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight">reduceRight()</a></code> — exécute une fonction sur chaque élément du tableau et collecte les résultats des appels précédents, mais dans le sens inverse.
</li></ul>
<h3 name="Changements_.C3.A0_venir"> Changements à venir </h3>
<p>Parmi les autres changements prévus dans JavaScript 1.8, citons :
</p>
<ul><li> L'encodage et décodage JSON encoding.
</li><li> Une syntaxe de découpage.
</li><li> Déstructuration généralisée avec <code>for...in</code>.
</li></ul>
<p><br>
</p>
<div class="noinclude">
</div>
{{ wiki.languages( { "en": "en/New_in_JavaScript_1.8", "ja": "ja/New_in_JavaScript_1.8", "pl": "pl/Nowo\u015bci_w_JavaScript_1.8" } ) }}
Revenir à cette révision