Visit Mozilla.org

New in JavaScript 1.8

出典: MDC

この記事は Firefox 3 の新機能について述べています

JavaScript 1.8 は Gecko 1.9 (それは Firefox 3 に組み込まれる予定です)で導入されることが予定されています。これは、JavaScript 1.7 よりは、さほど大きな更新ではありませんが、ECMAScript 4/JavaScript 2 に追随するための更新がいくつか含まれています。このリリースは、JavaScript 1.6 及び JavaScript 1.7 で仕様化された新機能の全てを含んでいます。

JavaScript 1.8 の開発状況を追うためには、bug 380236 を参照してください。

目次

[編集] JavaScript 1.8 の使用

JavaScript 1.8 のいくつかの新機能を HTML で使用するためには、以下にようにしてください。:

 <script type="application/javascript;version=1.8"> ... あなたのコード ... </script>

JavaScript shell、JavaScript XPCOM コンポーネントや、XUL の <script> 要素を使用するときは、最新 JS バージョン(Mozilla 1.9 では、JS1.8 ) が 自動的に使われます(bug 381031, bug 385159)。

新キーワードである、"yield" と "let" を使用する必要がある機能は、1.7 以上のバージョンを指定しなければなりません。 なぜなら、既存のコードが、それらのキーワードを変数や関数の名前として使用するかもしれないからです。新しいキーワードを導入していない機能(例えば、ジェネレータ)は、JavaScript のバージョンを指定することなく使用することができるでしょう。

[編集] 式クロージャ

この追加は、典型的な ラムダ記法日本語版)に似た表現を与える、単純な関数を書くための簡略表現に過ぎません。

JavaScript 1.7 以前:

 function(x) { return x * x; }

JavaScript 1.8:

 function(x) x * x

この構文を使うことによって、中括弧と 'return' 文を省くことができます(それらは暗黙的に補われます)。この方式でコードを書くことは、それを構文的に短くするだけに過ぎません。

例:

イベントリスナーを渡す簡略表現:

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

JavaScript 1.6 からの array のメソッドである、some でのこの表現の使用:

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

[編集] ジェネレータ式

この追加により、ジェネレータ (JavaScript 1.7 で導入されたものです) を簡単に作成することが可能になります。ジェネレータを生成するには、通常は内部に yield を含むカスタム関数を作成しなければなりませんでしたが、この追加により、配列内包に似た構文を使って同じ性質のジェネレータ文を作成することができるようになります。

JavaScript 1.7 では、オブジェクトのためのカスタムジェネレータを作成するために以下のようなものを書くでしょう。:

 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");
 }

JavaScript 1.8 では、ジェネレータ式を代わりに使うことで、カスタムジェネレータ関数を作成する必要性は無くなります。:

 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");
 }

ジェネレータ式は、関数に値として渡すこともできます。これは、配列があらかじめ生成される典型的な配列内包の場合と違って、本当に必要とされるまでジェネレータが実行されないので、特に注目するに値します。その違いの例を挙げます。

JavaScript 1.7 の配列内包の使用

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

JavaScript 1.8 のジェネレータ式の使用

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

この 2 つの例の大きな違いは、配列内包を使った場合には配列を内包するときと繰り返し処理を行うときの 2 度 "obj" 構造に対してループが実行されるのに対して、ジェネレータ式を使った場合には 1 度しかループが実行されずに済むという点です。

[編集] さらなる Array の拡張

JavaScript 1.8 では、 Array オブジェクトに、2 つの新しい繰り返しのメソッドが導入されました。:

  • reduce() - 配列の全ての要素に関数を実行し、直前の呼び出しから結果を収集します。
  • reduceRight() - 配列の全ての要素に関数を実行し、直前の呼び出しから結果を収集しますが、逆から実行します。

[編集] for..in の分配方法 の変更

TBD 【訳注: 「いずれ決定」の意味の略語】: New_in_JavaScript_1.7#Looping_across_objects で説明しています(bug 366941)。

[編集] 予定されている変更

JavaScript 1.8 に含まれることが予定されている変更:

  • JSON エンコーディング、デコーディング
  • Slice 構文
  • 一般化された分配 (destructuring) for...in