定数 (const) は、 let 文を使って定義する変数と同じ、ブロックスコープです。定数の値は、再代入による変更はできず、再宣言もできません。
構文
const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]];
説明
この宣言は、グローバルか、宣言された関数内ローカルな定数を作ります。定数は初期化が必須です。つまり、宣言された同じ文の中で値を指定しなくてはいけません (あとで変更できません)。
const 宣言は、値への読み取り専用の参照を作ります。その値が不変ということではなく、その変数識別子が再代入できないというだけです。たとえば、定数がオブジェクトの場合、オブジェクト自体は変更可能です。
let に対する "temporal dead zone" の懸念事項はすべて、const にも適用されます。
定数は、同じスコープ内で関数や変数と同じ名前にできません。
例
次の例は、定数の動作の例です。ブラウザコンソールで試してください。
// NOTE: 定数は大文字でも小文字でも宣言できるが、慣例的にすべて大文字を使う。
// MY_FAV 定数を定義して、7 を値にする
const MY_FAV = 7;
// エラーになる
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 は現在 20
console.log("my favorite number is " + MY_FAV);
// これはグローバルに巻き上げられて、エラーになる
var MY_FAV = 20;
}
// MY_FAV は 7 のまま
console.log("my favorite number is " + MY_FAV);
// 定数宣言で初期化がないと、エラーになる
const FOO;
// 定数はオブジェクトも設定できる
const MY_OBJECT = {"key": "value"};
// オブジェクトの上書きはエラーになる
MY_OBJECT = {"OTHER_KEY": "value"};
// しかし、オブジェクトのキーは保護されていないので、
// 次の文は問題なく実行される
MY_OBJECT.key = "otherValue";
// 配列も同じ
const MY_ARRAY = [];
// 配列にアイテムをプッシュすることができる
MY_ARRAY.push("A"); // ["A"]
// しかし、新しい配列を代入するのはエラーになる
MY_ARRAY = ["B"]
仕様
| 仕様 | ステータス | コメント |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) Let and Const Declarations の定義 |
標準 | 初回定義。 |
| ECMAScript Latest 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")。