Novidades no Javascript 1.8

O JavaScript 1.8 está programado para ser lançado como parte do Gecko 1.9 (que será incorporado ao Firefox 3). Esta é uma atualização menos substancial que o JavaScript 1.7, mas tem algumas atualizações para acompanhar o progresso rumo ao ECMAScript 4/JavaScript 2. Esta liberação incluirá todas as novas características especificadas no JavaScript 1.6 e JavaScript 1.7.

Veja o bug 380236 para acompanhar o progresso do desenvolvimento do JavaScript 1.8.

Usando JavaScript 1.8

A fim de usar algumas das novas características do JavaScript 1.8 no HTML, use:

 <script type="application/javascript;version=1.8"> ... seu código ... </script>

Quando usando o JavaScript shell, componentes XPCOM ou elementos XUL <script>, a versão mais recente do Javascript (1.8 no Mozilla 1.9) é usada automaticamente (bug 381031, bug 385159).

Os recursos que requerem o uso das novas palavras-chave "yield" e "let" requerem que você especifique a versão 1.7 ou mais recente, porque o código existente pode usar estas palavras-chave como variáveis ou nomes de função. Os recursos que não introduzem novas palavras-chave (como o gerador de expressões) podem ser usados sem que seja necessário especificar a versão do JavaScript.

Fechamentos de expressões

Esta adição nada mais é que uma abreviação para escrever funções simples, dando à linguagem algo similar a uma típica notação lambda.

JavaScript 1.7 e mais antigos:

 function(x) { return x * x; }

JavaScript 1.8:

 function(x) x * x

Esta sintaxe permite que você deixe de fora as chaves e a declaração 'return' — fazendo-as implícitas. Não há benefício adicionado ao se escrever código desta maneira, à exceção de ser sintaticamente mais curto.

Exemplos:

Uma abreviação para ligar ouvintes de evento:

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

Usando esta notação com alguma das funções de array do JavaScript 1.6:

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

Gerador de expressões

Esta adição permite que você crie geradores de maneira simples (que foram introduzidos no JavaScript 1.7). Tipicamente você teria que criar uma função personalizada contendo a palavra-chave yield, mas esta adição permite que você use uma sintaxe semelhante à compreensão de arrays para criar uma instrução geradora idêntica.

No JavaScript 1.7, você poderia escrever algo como o seguinte, a fim de criar um gerador personalizado para um objeto:

 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("End of record.<br>\n");
 }

No JavaScript 1.8, você pode contornar a criação de uma função de gerador personalizada usando um gerador de expressões em vez disso:

 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("End of record.<br>\n");
 }

Geradores de expressões também podem ser passados como valores a uma função. Isto é particularmente notável de modo que geradores não serão executados antes que seja absolutamente necessário (diferente de típicas situações de compreensão de array, onde os arrays são construídos antes do tempo). Um exemplo da diferença pode ser visto aqui:

Usando a compreensão de array do JavaScript 1.7

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

Usando o gerador de expressões do JavaScript 1.8

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

A diferença significativa entre os dois exemplos, começando pelo que usa o gerador de expressões, é que você poderia usar somente o loop uma vez sobre a estrutura 'obj', ao invés de uma vez compreender o array e novamente iterar com ele.

Mais extras do Array

Existem dois novos métodos iterativos de Array incluídos no JavaScript 1.8, especificamente:

  • reduce() - executa uma função em cada item no array e coleta os resultados de chamadas anteriores.
  • reduceRight() - executa uma função em cada item no array e coleta os resultados de chamadas anteriores, mas em reverso.

Mudanças na desestruturação for..in

Menção em en:New_in_JavaScript_1.7#Looping_across_objects (bug 366941).

Mudanças iminentes

As mudanças esperadas para a chegada no JavaScript 1.8 incluem:

  • Codificação e decodificação JSON.
  • Sintaxe slice.
  • Desestruturação generalizada for...in (isso significa algo diferente de #Chances in destrugturing for..in? --Nickolay 10:52, 9 de setembro de 2007 (PDT)).

Categorias

Interwiki Language Links

Document Tags and Contributors

Contributors to this page: Verruckt, Leandro Mercês Xavier, fscholz
Last updated by: fscholz,