前回は、JavaScriptとECMAScriptの関係や歴史など、JavaScriptの概要をまとめた。ここでは、インタプリタ言語や動的型言語など JavaScript の言語仕様について説明する。
1 JavaScriptの特徴
JavaScriptのプログラミング言語としての特徴は以下の6つである。
- インタプリタ言語:インタプリタ言語の利点はコンパイル型言語に比べて開発が手軽であること。実行環境上でコードを直接動かせる。欠点は一般的に実行速度が遅いこと
- C言語やJavaに似た構文:ifやwhileなどのキーワードが同じ
- 動的型言語:変数や関数の返り値に型指定がない
- プロトタイプベースのオブジェクト指向:クラスベースのオブジェクト指向と少し違う(詳細は後述)
- リテラル表記の表現力:高機能なリテラル表記を持つため開発生産性が高い
- 関数型プログラミング:関数をオブジェクトとして扱えることと関数リテラルがあることで関数型プログラミングをサポートできる
2 表記について
js> var s = ‘foobar'; //説明のためのコメント
実行結果(あるいは式の評価結果)
print関数
JavaScriptのコア言語に組み込みのprint関数は存在しないが、今回のコード例はprintを使う。
3 変数の基礎
変数の使い方
変数の役割は値やオブジェクトに名前を付けることである。キーワードvarを使い変数を宣言する。変数に値を代入するには代入演算子(=)を使う。代入演算子の左辺に変数、右辺に代入値を記述する。
式の中に書いた変数の働きは左辺値と右辺値で違いがある。左辺値に書いた変数は代入先を示す働きなのに対し、右辺値に書いた変数は値を取り出す働きである。宣言だけで何も代入していない変数は、undefined値になる。宣言していない変数の値の取り出し(右辺値での利用)はReferenceError例外になる。代入先(左辺値)としての利用はエラーにならない。
varの省略
varによる宣言なしで変数に値を代入できる(暗黙の宣言をした変数)が推奨しない。暗黙の宣言で使用した変数はグローバル変数になる。グローバル変数の利用は最小限にすべきだからである。
定数
ECMAScript規格に定数の構文はない。しかしJavaScript独自拡張の定数宣言が存在する。定数を宣言するにはconstを使い、定数はすべて大文字にする慣習がある。
4 関数の基礎
関数とは
関数とはある一連の手続き(文の集まり)をまとめて外部から呼び出せるようにするしくみである。関数に引数を渡し、関数は値を返せる。関数本体のコードを宣言しただけでは実行されず、関数が呼ばれて初めて実行する。
関数宣言と呼び出し
関数を定義するには関数宣言文を使う。キーワードfunctionで始めて関数名、引数リスト、関数本体が並ぶ。関数宣言の仮引数に型指定はない。以下に文法を示す。
function 関数名(引数、引数、…) {
関数本体
}
関数リテラル
関数は関数リテラル式でも定義できる。構文的にはfunctionから始めて、省略可能な関数名、引数リスト、関数本体が並ぶ。関数リテラルは式の中に書くことができ、値を返すことができる。関数リテラル式と関数呼び出し式の違いは、前者は言語機能として持たないプログラミング言語があること(Javaのメソッドなど)。
関数はオブジェクト
オブジェクトは本質的に名前がない。このことは関数にも当てはまる。そのため名なしの関数を名前で呼ぶために関数名が存在する。つまり、変数名と関数名は本質的に同じである。
5 オブジェクトの基礎
オブジェクトとは
JavaScriptのオブジェクトは名前と値のペア(プロパティ)の集合である。一方、Javaのオブジェクトはクラスをインスタンス化したものと説明できる。基本原則は同じで、どちらもメモリ上の実体で、状態を持ち、プログラミングの操作の対象になる。直感的には、オブジェクトはプログラムで扱うデータを表現するものである。
JavaScriptオブジェクトはJavaのマップに似ているが、前者には以下の2つの特徴がある。1つはプロパティ値に関数を指定できる点で、もう1つはプロトタイプチェーンのしくみである。このしくみによりJavaScriptオブジェクトでクラスの継承に似た機能を実現できる。
オブジェクトリテラル式とオブジェクトの利用
オブジェクトはオブジェクトリテラル式で生成できる。オブジェクトリテラル式の文法は、カッコ{}で囲って、プロパティ名とプロパティ値のペアを並べる。プロパティ名は識別子、文字列値、数値のいずれかである。プロパティ値は任意の値やオブジェクトを記述できる。
プロパティアクセス
オブジェクト参照に対するドット演算(.)でプロパティにアクセスできる。ドット演算子の後ろにプロパティ名を書くとプロパティ値を読み出せる。
プロパティアクセス(ブラケット)
プロパティのアクセスはブラケット[]演算子でも可能である。[]の中にはプロパティ名を示す文字列値を指定する。
メソッド
オブジェクトのプロパティには任意の型の値やオブジェクト、あるいは関数を代入できる。JavaScriptは言語仕様としてのメソッドは持たないが、事実上オブジェクトのプロパティに関数を持たせるとメソッドとして呼べる。
new式
JavaScriptにはオブジェクト生成のためのnew式がある。new式で生成したオブジェクトは、プロパティアクセスができる。
クラスとインスタンスx
JavaScriptの言語仕様にクラスはないが、事実上クラスと見なす方が理解しやすいものをここではクラスと呼ぶ。つまり、実質コンストラクタ呼び出しを想定している関数オブジェクトをクラスと呼ぶ。また、コンストラクタ呼び出しによる生成を強調したいときは、生成したオブジェクトをインスタンスオブジェクトと呼んで区別する。
クラス機能の整理方法
クラス機能の整理方法は以下の4つがある。
- 関数またはコンストラクタ呼び出し:-
- クラスのプロパティ:Javaのstaticメソッドやstaticフィールド相当
- prototypeオブジェクトのプロパティ:Javaのインスタンスメソッド相当
- インスタンスプロパティ:Javaのインスタンスフィールド相当
オブジェクトと型
Javaの場合オブジェクトはクラスやインタフェースという型を持つが、同じ意味での型はJavaScriptに存在しない。JavaScriptでもクラス(らしきもの)を定義してオブジェクトを型階層に分類できるが、選択可能なスタイルの1つとして型階層を使えるだけである。
6 配列の基礎
配列は順序を持った値の集まりを表現する言語機能である。JavaScriptは組み込み型として配列型を持たないが、Arrayクラスのインスタンスとして存在する。配列リテラルは[]で囲み、値を並べる。配列内のそれぞれの値を要素と呼ぶ。
最後に
JavaScriptはプログラミング言語として以下の6つの特徴を持つ。すなわち、インタプリタ言語、C言語やJavaに似た構文、動的型言語、プロトタイプベースのオブジェクト指向、リテラル表記の表現力、関数型プログラミングである。また、JavaScriptの表記、変数、関数、オブジェクト、配列の基礎についても説明した。
次回は、5つの基本型とオブジェクト型 JavaScript の型についてまとめる。
![]() |