Version 7 (modified by 14 years ago) ( diff ) | ,
---|
JavaScript 言語概論
このテキストは何?
ここでは、 JavaScript のプログラミング言語としての使用、特徴を学びます。
- JavaScript ってそもそも何? どんなことができるの? という人はJavaScript チュートリアルを、
- JavaScript に最初から用意されているクラスとかを使いこなしたい! という人はCore JavaScript イントロダクションを、
- JavaScript でリッチなグリグリ動く GUI を作りたい! という人はDOM 概論を、
- JavaScript でもフリーのライブラリを利用して楽をしたい! という人はJavaScript ライブラリ概論を、
それぞれ参照してください。
どんな言語?
JavaScript 言語の大まかな特徴を、ざっと列挙してみましょう。
比較的小さな実装のスクリプト言語
Web ブラウザの機能の一つとして実装される JavaScript は、その為に非常に軽量に実装されています。つまり、言語自体が元々持つ機能が少ない、ということです。例えば、ローカルファイルへの入出力を行う命令などは用意されていません。
また、スクリプト言語なので、処理系はプログラムをステップ毎に逐次読み込みながら実行します。最近は JIT コンパイラ (内部でコンパイルを行ってから実行するタイプ) の処理系が多いので、基本的な構文チェックだけを先に通してから実行される、という動作も多くなってきていますが、基本的にはエラーが発生する前の部分までは実行される、といった動作になります。
文法は C や Java にやや似ている
JavaScript という名前の通り、言語の文法は Java に似ていなくもありません。が、値の型が曖昧な点や、インタプリタとして動作する点などを理由に、初期の頃は C に似た書き方の BASIC みたいな言語、といった見られ方をしていました。
近年、 JavaScript の持つ言語としての特徴が再評価され、むしろ C に似た書き方の LISP みたいな言語、といった見られ方に移りつつあるようです。
文法が C や Java に似ていると言われる所以は何か。まず、処理の単位となるブロックをブレース "{" ~ "}" で括る書き方。
function hoge() { // 処理... } if (a == b) { // 処理... }
それから、処理の単位をセミコロン ";" で区切る書き方 (但し、行末のセミコロンは必須ではない)。
var a = 10; var b = a + 20; // 行末のセミコロンは省略可 var a = 10 var b = a + 20
コメントの書き方も Java と同じです。 "/*" ~ "*/" で括るか、 "" の後ろに書きます。
/* * 複数行 * コメント */ alert("コメントサンプル"); // 一行コメント
その他、 if, for, while, switch といった処理の流れを記述するおなじみの構文や、 C言語風の演算子 (==, ++, -- など)、さらには関数呼び出し時には関数名の後ろに引数をかっこで括る書き方なども、まさに C や Java そっくりの書き方です。
数値と文字列の型は曖昧
多くのスクリプト言語と同様、 JavaScript もまた、数値と文字列を自由に行き来する言語です。例えば、数値と文字列の足し算は、文字列の連結として解釈されます。
var a = 10; var b = 20; alert("a + b = " + (a + b)); // "a + b = 30" と表示
また、数字だけの文字列を数値演算に含めることもできます。その場合、足し算においては文字列の連結として誤解されないよう注意が必要です。
var a = document.getElementById("input_a").value - 0; // 入力欄の文字列を取得。 var b = document.getElementById("input_b").value - 0; // 0 で減算することで、変数には確実に数値として代入される。 document.getElementById("result").value = a + b; // 足し算した結果を別のフォーム部品に表示。
複雑なデータ構造を自由に書ける
C や Java がデータ構造の構成を構造体やクラスとしてあらかじめ定義しなければならないのに対し、 JavaScript のオブジェクトはいつでも好きなだけメンバを追加できます。
// オブジェクトを作成 var murachi = { real_name = "村山 俊之", real_name_kana = "ムラヤマ トシユキ", birth = new Date(1978, 1, 7), sex = "Female" }; // 本名を表示 alert("名前: " + murachi.real_name + " (読み: " + murachi.real_name_kana + ")"); // オブジェクトに後からメンバを追加できる murachi.disp_name = "T.MURACHI"; murachi.tall = 166; murachi.weight = 70; alert(murachi.disp_name + "の身長は" + murachi.tall "cm、体重は" + murachi.weight + "kg");
もちろん、メンバにオブジェクトや配列を持たせることもできますし、配列にオブジェクトを持たせることもできます。
var harapeko = { name = "株式会社はらぺこ", name_e = "Harapeko Inc.", birth = new Date(2008, 4, 1), // オブジェクトの入れ子 address = { post_no = 2750015, county = "千葉県", city = "習志野市", town = "鷺沼台1-8-27", building = "マウント・ヴィレッヂⅠ 101" }, // メンバに配列を追加 address_history = [ // オブジェクトの配列 { post_no = 2760017, county = "千葉県", city = "八千代市", town = "八千代台北1-10-11", building = "マメール八千代台 502" }, { post_no = 2760017, county = "千葉県", city = "八千代市", town = "八千代台北1-10-11", building = "ファイン八千代台 502" } ] }; // オブジェクトの内容を一通り表示 document.write("<p>会社名: " + harapeko.name + "</p>"); document.write("<p>創立: " + harapeko.birth.toLocaleString() + "</p>"); document.write("<p>現住所: 〒" + harapeko.address.post_no + " " + harapeko.address.county + harapeko.address.city + harapeko.address.town + " " + harapeko.building + "</p>"); document.write("<p>過去の住所 (古い順に):</p><ul>"); for (var i = 0; i < harapeko.address_history.length; i++) { var old_address = harapeko.address_history[i]; document.write("<li>〒" + old_address.post_no + " " + old_address.county + old_address.city + old_address.town + " " + old_address.building + "</li>"); } document.write("</ul>");