InfoQ

News

ECMAScript 5リリース

作者 Alex Blewitt , 翻訳者 徳武 聡 投稿日 2009年12月13日 午後3時12分

コミュニティ
Java
トピック
JavaScript

原文(投稿日:2009/12/09)へのリンク

ECMAScript 5の仕様がが今週、リリースされた(pdf)。ECMAScriptは一般的にはJavaScript™として知られている。最新バージョンでは、基本ライブラリに改善が加えられている一方、一般的でありがちなコーディングミスを特定し、除去するためにより厳格なランタイムモードが導入された。

ECMAScript 4を合理化しようという初期の試みは大失敗に終わった。結局、Adobe社のActionScriptだけが提案された変更点に対応しただけだった。ECMAはバージョン4の仕様もリリースできなかった。バージョン4の仕様では、様々なグループの実装に悪影響を与えてしまうからだ。また、そのような問題がある限り、ブラウザもサポートできない。

ここ数年にわたって、JavaScriptのエンジンに大規模な改善が加えられた。例えば、NitroTraceMonkeyなどだ。その結果、JavaScriptはコラボレーションツールの分野で利用できるほど高性能になった。例えば、Google Waveはそのようなオンラインアプリケーションの事例のひとつだ。また、最近リリースされたGWT 2.0の一部としてSpeed TracerというGoogle Chromeの拡張がある。これは、JavaScriptのアプリケーションの性能を最適化するツールだ。

近年のこのような状況をふまえ、ECMAScript 5は現在使われているバージョン3との後方互換性の確保を目指し(各ブラウザが素早く対応できるようにするために)、同時に開発者が一般的なコーディングミスを犯さないようにするために、より厳しい制約を提供する。

Strict mode

strict modeを導入する目的は、ECMAScriptアプリケーションを開発するときに発生するコーディング上の一般的な問題を避けることだ。ひとつのユニット(スクリプトまたはファンクション)の中に、次のような文字列リテラルを書くことでこの制約を有効にできる。

"use strict;"

このリテラルは従来のランタイム上では何の影響もないが、バージョン5がターゲットとする新しいランタイム上ではstrict modeに切り替わる。スクリプトのトップに記述すればそのスクリプト全体が、ひとつのファンクションに記述すればそのファンクションが、strict modeになる。したがって、strict modeを適用したコードとそうでないコードを混在させることができ、既存のコードの改善にも利用できる。では、strict modeにすると実際にはどうなるのだろう。

  • 変数は利用する前に宣言しなくてはならない。言い換えれば、i=3という書き方はランタイムエラーになる。var i=3としなければならない。(iがこのスコープ内にはないという前提)
  • Evalは予約語になる。また、eval内で新しい変数を導入できなくなる。したがって、eval("var i=3"); print(i);と書くと例外が発生する。
  • 8進数のリテラルは使えない。したがって010は10であり、8ではない。
  • configurableフラグがfalseに設定されている引数や関数、変数やその他の属性に対して、delete演算子が使えない。
  • はエラーの原因になりやすいwithステートメントは使えない。構文エラーと見なされる。
  • 同じ名前で引数が重複しているファンクションは定義できない。
  • オブジェクトは同じ名前の属性を持てない。
  • argumentscaller変数は不変になる。
  • グローバルオブジェクトへのアクセスはランタイムエラーになる。

ライブラリの拡張

基本ライブラリに対して、次のような拡張が加えられている。

  • DateがISO8601形式の日付を生成できるようになる(例えば20091209T12:34:56Z)。パースもできる。
  • Stringにtrim()メソッドが組み込まれる。
  • 新しいJSONオブジェクトは、JSON形式のデータを効率的に生成するためにparsestringifyをサポートする。evalと似ているが、セキュリティを考慮した実装がないのでコードを少なくできる。加えて、RFC 4627に仕様化されているJSONObjectJSONArrayだけでなく、どのようなJSONValueも使える。(4627はJSON-Textを定義しているが、これはオブジェクトか配列に制限されている。)
  • Prototypeのbind()と同じ構文でbindが組み込まれた
  • Arrayが標準的なファンクションをサポートするようになる。例えばindexOf()map()filter()そして reduce()など。
  • オブジェクトはseal()(新しい属性の追加と既存の属性の削除ができなくなる)とfreeze()(すべての属性が読み取り専用になり、属性の追加と削除もできなくなる)が利用できる。
  • Object.keys()を使うとそのオブジェクトのすべてのenumerableな属性を一覧できる。
  • Object.getOwnPropertyNames()を使うとすべてのenumerableと非enumerable属性を一覧できる。
  • Object.getPrototypeof()を使うとそのオブジェクトのprototypeを返す。

要約

JSONのパース機構の標準サポートとstrict modeは開発者に多大な恩恵を与える。これらの機能を使えばPrototypeや必要な拡張ライブラリのためにコードをより小さなライブラリへ変換できる可能性がある。JSONストリームからISO形式にパースされた日付は以前よりもはるかに移植が簡単になる。将来は日付を表す形式のデファクトスタンダードになるだろう。また、後方互換性が確保され、Prototypeのような既存のライブラリからヒントを得ているので、比較的近い将来のうちに開発者やブラウザは新しいJavaScriptの特徴になじむだろう。

ブックマーク
digg+,
reddit+,
del.icio.us+,
dzone+,
slashdot+
Hatena

特集コンテンツ一覧

アジャイルにおけるプロジェクトマネジャーの役割

この記事では最初に一般的に産業界でのプロジェクトマネージャーの役割について説明し、それから、アジャイルにおけるコーチ/ファシリィテーターの役割にあてはめてみます。

アレグザンダー祭りにて、James.O.Coplienが語るアジャイルとスクラムの源流とは

「パターン」と呼ばれる設計手法をご存知ですか?この建築の分野ではじまった設計の形式知化手法、および、使う人と作る人の対話のプロセスは、私たちソフトウェアの世界に援用されて1995年に「デザインパターン」という書籍で注目を浴びました。さらに、アジャイルと呼ばれる開発手法には、ユーザーといっしょに対話をしながら設計を進める「パターン」の思想が脈々と引き継がれているのです。

仮想パネル:ソフトウェアアーキテクチャの文書化について

この仮想パネルでは、特に、アジャイルソフトウェア開発環境におけるソフトウェアアーキテクチャの文書化について、Len Bass氏、Grady Booch氏、Paulo Merson氏、Eoin Woods氏に話を聞いた。

HTTPSコネクションの最初の数ミリ秒

HTTPSコネクションを確立するとき、一体何が起こっているのだろう。この記事では安全なコネクションを準備するためにクライアントとサーバの間でどのようなデータの交換が行われているのか、バイトレベルまで詳細に分析する。

Modular Java:動的なモジュール化

Modular Javaシリーズの第3弾は、動的なモジュール化、どのようにバンドルのクラスが解決され、どのように生成され、消滅するのか、どのようにお互いに通信するのかについて、議論する。

分散バージョン管理システムの詳細なガイド

分散バージョン管理システムへの関心や採用は増え続けています。この記事では、分散バージョン管理システムのコンセプトを紹介し、git、Mercurial、Bazaarの3つについて詳しく見てみようと思います。

Modular Java:それは何なのか?

ここ数年にわたって、Javaのモジュール化は活発に議論され続けている話題である。いくつかのJSRによってJavaの進化におけるモジュール化の必要性が示されている。モジュール化の意味するところは何で、なぜそれを気にかけるべきなのだろうか?

Modular Java:静的なモジュール化

Modular Javaシリーズの第2弾は、静的なモジュール化、バンドルの作り方、OSGiのエンジンにそれらをインストールする方法、バンドル間の(バージョン付き)依存性の設定のしかたなどについて扱う。