JavaScriptの基本構文

JavaScript (ECMAScript5)の基本構文を紹介します。この記事は、2017 年 3 月に調べたものを紹介しています。


記述方法

HTML に埋め込む方法

script タグは、header や body に埋め込み可能です。かつては、

<script language="JavaScript">
としていたようですが、最近のブラウザであれば type で大丈夫ではないでしょうか。また、コメントで囲む必要もないようです。

イベントハンドラに埋め込む方法

HTML のイベントハンドラに直接 JavaScript を書くことができます。

外部のソースファイルを読み込む方法

script タグの src 属性にファイル名を指定します。また、読み込むファイルの文字コードを明示しておくと良さそうです。また、特に問題がなければ「</body>」の直前に記述するのが良いようです。

エントリポイント

特にエントリポイントの指定は必要ありません。上から順に実行されていきます。また、HTML 側で、body の onload 時に関数を呼び出すことで、擬似的にエントリポイントを指定できます。

インクルード(他ソースファイルの読み込み)

JavaScript に該当する仕様はありません。ただし、HTML 側から複数のファイルを読み込ませることができます。

一方、RequireJS のように、モジュール化を支援するライブラリがいくらかあります。

変数宣言

変数宣言には、「var」を用います。型指定はありません。

関数

関数定義

関数定義は以下の通りです。

  • なお、JavaScript の関数は、関数のオブジェクトです。そのため、変数に代入できます。

関数呼び出し

関数の呼び出し方法は以下の通りです。

  • 関数呼び出しの際に、引数が足りない場合、その引数には null が渡されます。

可変長引数

可変長引数に該当するような構文はありませんが、関数内で「arguments」オブジェクトを使うと似たようなことができます。

参考 : arguments オブジェクトの使用

無名関数

無名関数もサポートされています。無名関数は、変数に代入可能です。

function(引数リスト){}
で定義できます(関数名を省略した形です)。

クラス

クラス定義に対応する構文はありません。ただし、「prototype chain」と呼ばれる仕様を利用することで、クラスのような振る舞いを記述できます。

メソッド定義は以下のように書くことも出来ます。

JavaScript は、this 必須です。また、Java や C++ の this とは仕様が異なるため、注意が必要です。JavaScript の this の仕様は、「ある関数が呼び出された際にその関数を格納していたオブジェクト」を指します。普段はあまり意識することはないかもしれませんが、コールバック関数として登録した場合などには注意が必要です。コールバック関数としてメンバ関数を登録し、this を固定するには「bind」を使います。

メソッドのオーバーロード

対応していません。

静的メンバ

クラスの仕様がないため、該当する仕様はありません。ただし、JavaScript のオブジェクトは連想配列であり、関数をプロパティとして持つことができるため、その仕様を利用すると、静的メンバ変数や関数相当の機能を実現できます。

オブジェクト生成(new)・メンバへのアクセス

new を使用します。new のあとには、コンストラクタ用の関数を指定します。

メンバへのアクセス方法

オブジェクトのメンバにアクセスするためには、ドット演算子「.」を使用します。

アクセス修飾子

ありません。すべてのメンバが、外部からアクセス可能です。

継承

prototype chain を利用することで、継承に近い記述が可能です。(Google 流 JavaScript におけるクラス定義の実現方法 より引用)

コンストラクタ・デストラクタ

クラスの定義方法で紹介したように、コンストラクタ関数の定義は可能です。

インタフェース定義

該当する仕様はありません。

演算子

表1: 算術演算子
四則演算 + – * /
剰余 %
表2: 代入演算子
代入 =
表3: 論理演算子
論理積 &&
論理和 ||
否定 !
表4: 比較演算子
大小比較 > < >= <=
等しい(型変換後に比較)==
等しくない(型変換後に比較) != <>
等しい(型が等しく、値も等しい) ===
等しくない(型もしくは値が等しくない) !==
3項演算子 ( 条件 ) ? (true) : (false)
表5: 型演算子
キャスト なし
型を調べる 変数 instanceof コンストラクタ関数名例 ) a instanceof MyClass
型を調べる typeof 変数 例 ) typeof n

instanceof は、指定したオブジェクトがどのコンストラクタから生成されたかを判別します。一方、typeof はその変数の(JavaScript における本当の)型名を文字列で返します。

表6: ビット演算子
ビット積 &
ビット和 |
否定^
排他的論理和 ~
左シフト <<
右シフト >>
表7: 文字列演算子
文字列結合 +

コメント

コメントは、以下の形式がサポートされています。

条件分岐構文

if 文と switch 文がサポートされています。

if 文

switch 文

ループ構文

for 文

while 文

foreach 文(配列の列挙)

該当するような言語仕様はありません。(似たような構文に「for … in」がありますが、これは、オブジェクトのプロパティ名を列挙していく構文です)

break, continue

breakcontinue ともにサポートされています。

演算子のオーバーロード

対応していません。

プロパティ(アクセッサ)

該当する仕様はありません。

インデクサ

対応していないようです。

文字列リテラル

シングルクォート( ' )もしくはダブルクォート( " )でくくります。特殊文字も使用可能です。

定数

ECMAScript5 の時点では、該当する仕様はないようです。