const
宣言 は、読み取り専用の値を生成します。不変の値を意味するものではありません、単純に、再アサインできない変数の識別子を意味します。
構文
const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]];
説明
この宣言は、グローバルまたは宣言された関数内のローカルな定数を生成します。定数の初期化が必須です。つまり、宣言された文と同じ文で値を指定しなくてはいけません (あとで変更できません)。
定数は、ブロックスコープで let
文を使用して宣言された変数のように動作します。定数の値は、再代入によって変更することができず、かつ定数が再度宣言されることはできません。
let
に適用される "temporal dead zone" についてのすべての懸念事項もまた、const
にも適用されます。
定数は、同じスコープの中で関数または変数と名前を共有できません。
例
以下は定数の動作の例です。ブラウザコンソールで試してください。
// NOTE: 定数は大文字や小文字でも宣言できるが、慣例的に大文字を使用する。 // MY_FAV 定数を定義し、7 を初期値で設定する const MY_FAV = 7; // Firefox と Chrome ではエラーをスローします (Safari では失敗しません) MY_FAV = 20; // 7 が出力される console.log("my favorite number is: " + MY_FAV); // 定数を再設定するとエラーになる const MY_FAV = 20; // MY_FAV 変数名は定数として予約されているため、これは失敗します。 var MY_FAV = 20; // これもエラーをスローする。 let MY_FAV = 20; // ブロックスコープの性質に注意することが重要である if (MY_FAV === 7) { // これは有効であり、ブロックスコープの MY_FAV を生成する // (ブロックスコープの定数ではない変数として宣言するために let を使用することも可能) const MY_FAV = 20; // MY_FAV is now 20 console.log("my favorite number is " + MY_FAV); // this gets hoisted into the global context and throws an error var MY_FAV = 20; } // MY_FAV はまだ 7 のまま console.log("my favorite number is " + MY_FAV); // A 定数への割り当ては構文エラー const A = 1; A = 2; // 定数宣言での初期化忘れは、エラーをスローする const FOO; // 定数はオブジェクトも設定できる。 const MY_OBJECT = {"key": "value"}; // オブジェクトを再設定は失敗します (Firefox と Chrome ではエラーをスローするが Safari では大丈夫) MY_OBJECT = {"OTHER_KEY": "value"}; // しかし、オブジェクトの属性は保護されてないため、 // 以下のようなステートメントは成功します。 MY_OBJECT.key = "otherValue";
仕様
仕様 | ステータス | コメント |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) Let and Const Declarations の定義 |
標準 | 初回定義。 |
ECMAScript 2017 Draft (ECMA-262) Let and Const Declarations の定義 |
ドラフト |
ブラウザ互換性
機能 | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基本サポート | 21 | (有) | 36 (36) | 11 | 12 | 5.1 |
Reassignment fails | 20 | (有) | 13 (13) | 11 | ? | ? |
Allowed in sloppy mode | 49.0 |
機能 | Android | Android Webview | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
---|---|---|---|---|---|---|---|
基本サポート | 未サポート | (有) | ? | ? | (有) | ? | (有) |
Reassignment fails | 未サポート | (有) | ? | ? | (有) | ? | (有) |
Allowed in sloppy mode | 未サポート | 49.0 | 49.0 |
互換性の注記
以前のバージョンの Firefox および Chrome や、Safari 5.1.7 や Opera 12.00 では、const
で宣言しても、後から値を変更することができます。
また、Internet Explorer 6-10 ではサポートされていませんが、Internet Explorer 11 では、サポートされています。
Firefox 固有の注記
const
宣言は、ECMAScript 2015 (ES6) の仕様に登場するずっと前から Firefox で実装されていました。const
ES6 の適合性については、バグ 950547 と バグ 611388 をご覧ください。
- SpiderMonkey 46 (Firefox 46 / Thunderbird 46 / SeaMonkey 2.43) 以前では、
SyntaxError
の代わりにTypeError
が throw されます (バグ 1198833)。 - SpiderMonkey 46 (Firefox 46 / Thunderbird 46 / SeaMonkey 2.43) からは、
{const a=1};
変数a
は、ReferenceError
を throw し、ブロックスコープ内では 1 を返しません。const a;
SyntaxError
を throw します ("missing = in const declaration"
): 初期化が必須です。const a = 1; a = 2;
SyntaxError
を throw します("invalid assignment to const a")。