JavaScript

型、値、変数

 プログラムは処理を実行するときにを操作します。例えば、「 3.14 」のような数値や「 Hello World 」のような文字列値などを操作します。そして、プログラミング言語で操作する値の種類のことをと呼びます。型は、プログラミング言語にとって最も基礎となるものです。プログラムが値を後ほど使いたい場合に、プログラム中で値を保管(代入)しておくためのものが変数です。変数は値に対して名前を付けて、この名前でその値を参照できるようにします。変数も、プログラミング言語にとって基礎となるものです。ここでは、JavaScript における型と値と変数について説明します。

 JavaScript の型には、大きく分けて2種類あります。基本型オブジェクト型です。JavaScript の基本型には、数値、文字列、論理値があります。

 JavaScript の特殊な値である nullundefined は、基本型の値です。ただし、両方とも、数値でも文字列でも論理値でもありません。それぞれ、特別な型だと考えてください。そして、それぞれその型に属する唯一の値と考えるのがよいでしょう。

 数値、文字列、論理値でも、null でも undefined でもない JavaScript の値がオブジェクトです。オブジェクトは、プロパティの集合体です。各プロパティは名前と値を持ち、数値や文字列などの基本型の値や、オブジェクトを保持できます。1つだけ非常に特殊なオブジェクトがあります。それは、グローバルオブジェクトです。

 一般的に言えば、JavaScript のオブジェクトは、名前の付けられた値を順不同にまとめたものです。JavaScript では、配列という特殊なオブジェクトも定義されています。配列は、値に順序を付けてまとめるものです。JavaScript には、配列を操作するために、特別な構文も用意されています。また、配列は、通常のオブジェクトとは異なる振る舞いもします。

 JavaScript には、もう1つ特殊なオブジェクトが存在します。それは関数です。関数は、ある種の処理を実行するために呼び出されるものです。配列の場合と同じように、関数の振る舞いは他のオブジェクトと異なっています。また、JavaScript では、関数を操作するために特別な構文も用意されています。JavaScript の関数で重要な点は、関数自体が値を持つことです。つまり、JavaScript プログラムから通常のオブジェクトと同じように操作出来ます。

 new 演算子とともに、新たに生成されるオブジェクトを初期化するために使われる関数をコンストラクタと呼びます。コンストラクタはオブジェクトのクラスを定義します。クラスとは、そのコンストラクタで初期化されるオブジェクトの集合のことです。クラスは、オブジェクト型の派生型にあたるものです。コア JavaScript 言語には、Array クラスや Function クラスの他に、3つの便利なクラスが定義されています。Date クラスは、日付を表現するオブジェクトを定義します。RegExp クラスでは、正規表現を表すオブジェクトを定義します。正規表現は、強力なパターンマッチングのツールです。最後に、Error クラスは、JavaScript 中で発生した文法エラーや実行時エラーを表現するオブジェクトを定義します。コンストラクタ関数を適切に定義すれば、独自のクラスを定義することもできます。

 JavaScript インタプリタは、自動的にガーベジコレクションを行い、メモリを管理します。プログラマは必要になったら、オブジェクトを作るだけで済みます。オブジェクトの破棄や、メモリの開放について悩む必要はありません。オブジェクトがプログラム中から参照できなくなった時に、インタプリタはそのオブジェクトはもう使われないと判断し、自動的にメモリを解放します。

 JavaScript はオブジェクト指向言語です。オブジェクト指向とは、簡単に言えば、グローバルに定義された関数を使ってさまざまな型の値を処理するのではなく、その型で定義されたメソッドを使って値を処理するような考え方です。例えば、配列 a の要素をソートするには、sort() 関数に配列 a を引数として渡すのではなく、次のように配列 asort() メソッドを呼び出すのが、オブジェクト指向的な考え方です。


a.sort();
// sort(a) のオブジェクト指向的な記述。

 メソッドについては、別途説明します。正確に言えば、JavaScript の場合、メソッドが持てるのはオブジェクトだけです。しかし、数値や文字列、論理値もメソッドを持つような振る舞いをします。JavaScriptでは、nullundefined だけは、メソッドを呼び出すことができません。

 JavaScript の型は、大きく分けて、基本型とオブジェクト型の 2種類があると述べました。これは、メソッドを持つものと持たないものと考えることもできます。さらに、値を変更できる型と、値が不変な型というようにも考えられます。オブジェクトや配列は、値が変更できる型です。JavaScript プログラムから、オブジェクトのプロパティや配列の要素の値を変更できます。数値や論理値、nullundefined は不変です。例えば、数値の値を変更すること自体意味がありません。文字列は、文字の配列として考えられるので、値を変更できる型と思うかもしれません。しかし、JavaScript の場合は、文字列は不変型です。文字列に対してインデックスを指定して文字を参照することはできますが、既存の文字列を変更する方法は用意されていません。

 JavaScript では、必要に応じて、ある型から別の型に自動的に変換されます。例えば、プログラム中で文字列が必要とされる場所に数値を記述した場合、自動的に数値が文字列に変換されます。論理値が必要なところで、論理値以外の値を記述した場合は、JavaScript が自動的に論理値に変換してくれます。JavaScript では自由に型が変換されるのに合わせて、「値が等しい」の意味も変わっています。== 等値演算子では、型変換が行われます。

 JavaScript の変数には型がありません。変数にどのような型の値でも代入できます。また、後になって、同じ変数にまったく異なる型の値を代入しても構いません。変数は、var キーワードを使って宣言します。JavaScript は構文スコープを使います。関数の外側で宣言した変数はグローバル変数として扱われ、JavaScript プログラム全体からアクセス可能です。関数中で宣言された変数は関数スコープとなり、関数中のコードからのみアクセスできます。