Appendix A : JavaScript

 WWW におけるもっともポピュラーなクライアントサイドスクリプト言語である JavaScript について簡単に紹介しよう。もっとも,JavaScript だけで 1 冊の本が出るくらいなので,ここでは本当に“さわり”だけである。

JavaScript とは

 JavaScript は Netscape Navigator 2.0 で搭載されたスクリプト言語である。現在は,ECMAScript として規格化され,JavaScript はその実装の一形態という位置付けになっている。Internet Explorer での JScript も,ECMAScript の実装のひとつということになる。Java とつくからにはアプレット作成の Java と似ているのではないかと思われるかもしれないが,実際,似ている面もあり,根底から異なる部分もある。

 まず,コードの書かれ方は,いずれも C,C++ スタイルの記号的な記法で,一見同じように見える。また,“オブジェクト”が重要な役割を持つことも共通している。WWW で用いられることもあって,セキュリティに引っかかるような動作は(Java において,アプレット作成では)制限されている。共通なもっとも優れた点は,“動く環境ならプラットフォームを選ばない”ことである。

 それで,違いはというと,実は“中身はまったく違う”。強いて比較すると,“Java のほうが厳格”である。たとえばデータ格納に用いる変数には型があるが,Java では変数型はスタティックであり,JavaScript ではかなりダイナミックである。よく言えば JavaScript では“変数型をさほど意識しなくてもよい”ということになる。

 文法も JavaScript は比較的ルーズである。オブジェクトに関しても,Java の特徴である厳格さ,複雑さが簡単なものになっている。

 実行時に関してのメカニズムにも違いがあり,Java のように“いったんコンパイル”の必要はない。

 まとめてしまうと,JavaScript は多くの人が簡単に書けるようにやさしくつくられていて,それでダイナミックな処理ができるということである。

 JavaScript の大きな特徴はオブジェクトに根ざしているという点である。オブジェクト(ここでは何か“もの”を想像してほしい)は性質を表すプロパティをもっている。卑近な例では,“テレビ”というオブジェクトがあれば,そのプロパティは“電源”“音量”“チャンネル”などであろう。

 関数も重要である。一定の手続きをまとめてしまうのである。たとえば,“与えられた自然数の階乗を計算する”関数を作ると,“この自然数の階乗を計算せよ”と呼べば,結果が返ってくる。

 オブジェクトに対して何らかの処理をするものをメソッドという。JavaScript は組み込みのメソッドのほかに,関数をオブジェクトに結びつけてメソッドとすることもできる。

 それからイベント駆動されうるという点も見逃せない。ユーザの反応に対して関数などが呼び出され,対話型のインタフェースを実現できる。

 よく目にする JavaScript を用いたページは用もなくステータスバーを書き換えてみたり,テロップを流してみたりというものばかりだが,小型で簡略だとはいえ,れっきとしたプログラミング言語であり,もっと複雑な処理にも耐えうるつくりになっている。また,最近のスクリプト言語の特徴として,文字列処理を得意とするという一面もある。

JavaScript 基礎の基礎

 ここでは,厳密な話を抜きにして,JavaScript の基礎の基礎を簡単に解説しよう。

 データの入れ物としての変数は var ステートメントで宣言される。JavaScript では型は明示的でないので,数値を入れても文字列を入れても構わない。ただし,文字列は引用する。

var a = 4
var s = "String"

 変数 a には数値 4 を,変数 s には文字列 String を入れて初期化した。

 演算子は四則(+,-,*,/),比較(==,!=,<,>),論理(||,&&,!),ビット操作(<<,>>,|,&)などがある。結果は変数に代入できる。また,インクリメント・ディクリメント演算子(++,--)もある。

var a = 4
var b = a + 3

 変数 ba + 3(=5)で初期化される。文字列の連結は + 演算子で行う。

 オブジェクトのプロパティの参照は次のように行う。

object.property
object["property"]

 関数は関数名と引数(ひきすう)リスト,実行する命令を中かっこでくくって定義する。

function function_name(arg1, arg2, ...) {
  ...
}

 関数から値を返すときは return ステートメントを使う。

return (式)

 関数を呼ぶには,関数名と引数リストを渡す。値を返すものは代入できる。

function_name (arg1, arg2, ...)

 たとえば,与えられた数の 3 乗を計算する関数 cube() を宣言してみよう。

function cube(x) {
  return x * x * x
}

3 の 3 乗を関数を呼んで計算し,変数 y に納める。

y = cube(3)

 メソッドは次のかたちで呼ぶ。メソッドが値を返すときは代入できる。

object.method(arg1, arg2, ...)

 よく使うメソッドとして HTML 文書を書く document.write() がある。先ほどの関数 cube を定義しておいて,

var a = 5
document.write("<P>cubed " + a + " is " + cube(a) + ".<\/P>")

では文書中に“cubed 5 is 125.”と出力される。ちなみに,数値と文字列を“足し算”すると,数値は文字列として結合される。

 制御文には条件分岐の if...else,ループの forwhile などがある。

if (condition) {
  ...
} else {
  ...
}

 if は () 内の条件が満たされると直後の {} を実行し,満たされなければ else 以下の {} を実行する。else 以下 はなくてもよい。

function isNegative(a) {
  if (a < 0) {
    return "negative"
  } else {
    return "non-negative"
  }
}

上の例において関数 isNegative は引数 a が負か否かで分岐し,異なる値を返す。

for (expr1; expr2; expr3) {
  ...
}

 for は expr1 で式を初期化し,expr2 が満たされている間,1 度ループするごとに expr3 を評価しながら {} 内を繰り返す。

for (i = 0; i <= 10; i++) {
  ...
}

 上の例では,i を 0 として初期化し,i が 10 以下である間,1 回のループごとに i を 1 ずつ増やしながら {} 内を繰り返す。

 ここまでの説明では JavaScript をなめた程度にもならない。だが,これ以上深入りするのも本稿の範囲を出ることになるので,いろいろなサイトを巡るなり,書籍を参考にするなりして,必要なスキルを身につけていただきたい。