JavaScript とは何か
JavaScript はクロスプラットフォームでオブジェクト指向なスクリプト言語です。JavaScript は小さくて軽量 (lightweight)な言語です。スタンドアローンの言語としては不便ですが、ウェブブラウザなど、他の製品やアプリケーションに簡単に組み込めるように設計されています。ホスト環境内では JavaScript はその環境のオブジェクトと接続し、それをプログラム的にコントロールすることができます。
コア JavaScript は、Array
、Date
、Math
といったオブジェクトのコアセット、さらに演算子、制御構造、命令文といった言語要素のコアセットからなります。コア JavaScript はオブジェクトをさらに追加することでさまざまな用途に拡張できます。
- クライアントサイド JavaScript は、ブラウザ(Navigator または他のウェブブラウザ)やその Document Object Model (DOM) をコントロールするオブジェクトを追加することでコア言語を拡張しています。クライアントサイド拡張の例として、アプリケーションが HTML のフォームに要素を配置したり、マウスのクリックや、フォームへの入力、ページナビゲーションといったユーザイベントに対応したりすることができるようになります。
- サーバサイド JavaScript では、サーバ上での JavaScript の実行に関連したオブジェクトを追加することでコア言語を拡張しています。サーバサイド拡張の例として、アプリケーションがリレーショナルデータベースと通信したり、アプリケーションのある呼び出しから別の呼び出しへの情報の連続性を実現したり、サーバ上でファイル操作を実行したりすることができるようになります。
JavaScript の LiveConnect 機能を使うことで、Java と JavaScript のコード間で互いに通信できるようになります。JavaSctipt からは Java のオブジェクトのインスタンスを生成したり、そのパブリックなメソッドやフィールドにアクセスできます。Java からは JavaScript のオブジェクトやプロパティ、メソッドにアクセスできます。
JavaScript は Netscape によって生み出され、また、JavaScript が最初に使用されたのは Netscape ブラウザでした。
JavaScript と Java
JavaScript と Java は似ている部分もありますが、基本的には異なっています。JavaScript 言語は Java と共通点がありますが、Java の静的型付けや強い型チェックは備えていません。JavaScript はほとんどの Java の構文や基本的な制御フロー構成をサポートしています。
Java の宣言によって構築されるクラスのコンパイルタイムシステムとは大きく異なり、JavaScript では数値、真偽値、文字列を表す少数のデータ型をベースとしたランタイムシステムをサポートしています。JavaScript ではより一般的なクラスベースのオブジェクトモデルではなく、プロトタイプベースのオブジェクトモデルを採用しています。プロトタイプベースモデルにより動的継承が可能になっています。すなわち、継承されるものは個々のオブジェクトによって異なりうるということです。JavaScript では関数の宣言を特に必要としていません。関数はオブジェクトのプロパティとして存在することができます。そしてその場合はゆるく型付けされたメソッドとして実行されます。
JavaScript は Java と比べてとても自由な形式の言語です。変数、クラス、メソッドを宣言しなくてもいいのです。メソッドが public か private か protected かなど気にする必要もなく、インタフェースを実装する必要もありません。変数、パラメータ、関数が返す型は明白に型付けされているわけではありません。
Java は高速な実行と型の安全性を求めて設計されたクラスベースのプログラミング言語です。型の安全性とは、例えば、Java の整数をオブジェクト参照にキャストしたり、Java のバイトコードを改変することでプライベートメモリにアクセスしたりということができないということです。Java のクラスベースモデルは、プログラムはもっぱらクラスとそのメソッドから成り立つということを意味します。Java のクラス継承と強い型付けは一般に緊密に結合したオブジェクトの階層を必要とします。この必要事項によって Java プログラミングは JavaScript よりも複雑になります。
それに対して、JavaScript は HyperTalk や dBASE のようなより小型な動的型付け言語の方向性を気持ちの上では受け継いでいます。これらのスクリプト言語は構文が簡潔であり、特殊なビルトイン機能があり、オブジェクトの生成に関して必要なことが最小限であるために、多くの人にプログラミングツールが使用されています。
JavaScript | Java |
---|---|
オブジェクト指向。オブジェクトの種類の区別はない。継承はプロトタイプのメカニズムを通して行われ、プロパティやメソッドはどんなオブジェクトにでも動的に追加できる。 | クラスベース。オブジェクトはクラスとインスタンスに分けられる。すべての継承はクラス階層を通して行われる。クラスやインスタンスにプロパティやメソッドを動的に追加することはできない。 |
変数のデータ型は宣言されない(動的型付け)。 | 変数のデータ型の宣言が必須(静的型付け)。 |
自動的にはハードディスクに書き込めない。 | 自動的にはハードディスクに書き込めない。 |
表 1.1:JavaScript と Java の比較
JavaScript と Java の違いについてのさらなる情報については、オブジェクトモデルの詳細 の章を参照してください。
JavaScript と ECMAScript 仕様
JavaScript は Netscape によって生み出され、また、JavaScript が最初に使用されたのは Netscape ブラウザでした。しかしながら、Netscape はヨーロッパの情報通信システム分野の標準化団体 Ecma International(かつての ECMA - European Computer Manufacturers Association; ヨーロッパ電子計算機工業会)に働きかけ、コア JavaScript ベースの標準化された国際的なプログラミング言語を供給することになりました。この標準化されたバージョンの JavaScript は ECMAScript と呼ばれ、標準をサポートしているすべてのアプリケーションで同じように動作します。企業はこのオープンスタンダードな言語を用いることで企業独自の JavaScript の実装を開発することができます。ECMAScript 標準は ECMA-262 仕様で文書化されています。
ECMA-262 標準は ISO(International Organization for Standardization; 国際標準化機構)によって ISO-16262 として認可されてもいます。ECMA-262 の PDF 版 が Mozilla のウェブサイト上にあります。また、Ecma International のウェブサイト にも仕様が掲載されています。ECMAScript の仕様書には Document Object Model (DOM) については記載されていません。これは World Wide Web Consortium (W3C) によって標準化されています。DOM は HTML 文書のオブジェクトをスクリプトから扱う方法を定義しています。
JavaScript のバージョンと ECMAScript の版との関係
Netscape は Ecma International と密接に連携して ECMAScript 仕様 (ECMA-262) を作成しました。次の表では JavaScript のバージョンと ECMAScript の版との関係について説明します。
JavaScript のバージョン | ECMAScript の版との関係 |
---|---|
JavaScript 1.1 | ECMA-262 初版は JavaScript 1.1 に基づいている。 |
JavaScript 1.2 | JavaScript 1.2 リリース時には ECMA-262 は未完成だった。JavaScript 1.2 は以下の理由で ECMA-262 初版と完全互換ではない。
|
JavaScript 1.3 |
JavaScript 1.3 は ECMA-262 初版と完全互換。 == と != を除いて、JavaScript 1.2 の全追加機能を保ったまま、JavaScript 1.2 と ECMA-262 との不整合を JavaScript 1.3 で解消した。これは ECMA-262 と一致するように変更された。 |
JavaScript 1.4 |
JavaScript 1.4 は ECMA-262 初版と完全互換。 JavaScript 1.4 リリース時には ECMAScript 仕様第 3 版は未完成だった。 |
JavaScript 1.5 | JavaScript 1.5 は ECMA-262 第 3 版と完全互換。 |
表 1.2:JavaScript のバージョンと ECMAScript の版
コア JavaScript リファレンス では、どの言語機能が ECMAScript に対応しているかを示しています。
JavaScript は ECMAScript 仕様には含まれない機能も常に搭載するようになっています。つまり、JavaScript は追加機能も備えながらも ECMAScript と互換性があるということです。
JavaScript の文書と ECMAScript の仕様書
ECMAScript の仕様書は ECMAScript を実装する上での必要条件のまとめです。そのため、ある JavaScript の機能が他の ECMAScript の実装でサポートされているかどうかを知りたい場合に便利です。ECMAScript でサポートされている機能のみを使用して JavaScript コードを書こうとしているのであれば、ECMAScript の仕様書をくまなく読む必要があるかもしれません。
ECMAScript の文書はスクリプトプログラマの手助けとなるようには作られていません。そのため、スクリプトを書くことについての情報に関しては JavaScript の文書を使用してください。
JavaScript と ECMAScript の用語
ECMAScript の仕様書では JavaScript プログラマにはなじみの薄い用語や構文が使用されています。言語の説明は ECMAScript ということで異なることもありますが、言語自体は同じです。JavaScript は ECMAScript 仕様で概説されている機能をすべてサポートしています。
JavaScript の文書は JavaScript プログラマに適した言語の側面について説明しています。
- JavaScript の文書では Global オブジェクトについて議論しません。これはプログラマが直接使うものではないからです。Global オブジェクトのメソッドやプロパティに関しては、プログラマが使うものであり、JavaScript の文書で議論しますが、トップレベルの関数やプロパティというように呼びます。
- パラメータなし(ゼロ引数)の
Number
およびString
オブジェクトのコンストラクタについては JavaScript の文書では議論しません。生成されるものがほとんど役に立たないからです。引数なしのNumber
コンストラクタは +0 を返し、引数なしのString
コンストラクタは ""(空文字列)を返します。