定数 (const) は、 let キーワードを使って定義する変数と同じ、ブロックスコープを持ちます。定数の値は、再代入による変更はできず、再宣言もできません。
このデモのソースファイルは GitHub リポジトリに格納されています。デモプロジェクトに協力したい場合は、 https://github.com/mdn/interactive-examples をクローンしてプルリクエストを送信してください。
構文
const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]];
解説
この宣言は、宣言された場所に応じて、グローバルまたはブロック内にローカルなスコープを持った定数を作成します。グローバルな定数は var 変数とは異なり、 window オブジェクトのプロパティにはなりません。
定数には初期化子が必要です。宣言された同じ文の中で値を指定しなくてはいけません (つまり、あとで変更することができません)。
const 宣言は、値への読み取り専用の参照を作ります。定数が保持している値が不変ということではありません。 — その変数の識別子が再代入できないというだけです。たとえば、定数が中身がオブジェクトである場合、オブジェクトの内容 (例えばそのプロパティ) 自体は変更可能です。
「一時的なデッドゾーン」に関する考慮事項はすべて、 let と const の両方に適用されます。
定数は、同じスコープ内の関数や変数と同じ名前にすることはできません。
例
次の例は、定数の動作の例です。ブラウザーのコンソールで試してください。
// メモ: 定数は大文字でも小文字でも宣言できるが、
// 慣例的にすべて大文字を使う。
// MY_FAV 定数を定義して、7 を値にする
const MY_FAV = 7;
// エラーになる - Uncaught TypeError: Assignment to constant variable.
MY_FAV = 20;
// MY_FAV は 7
console.log('my favorite number is: ' + MY_FAV);
// 定数を再宣言しようとするとエラーになる - Uncaught SyntaxError: Identifier 'MY_FAV' has already been declared
const MY_FAV = 20;
// MY_FAV 変数名は定数として予約されているため、失敗する
var MY_FAV = 20;
// これもエラーになる
let MY_FAV = 20;
// ブロックスコープの性質に注意してほしい
if (MY_FAV === 7) {
// これは有効であり、ブロックスコープの MY_FAV を作る
// (let を使って、定数でなく、ブロックスコープの変数として宣言することもできる)
let 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'};
// オブジェクトの上書きはエラーになる - Uncaught TypeError: Assignment to constant variable.
MY_OBJECT = {'OTHER_KEY': 'value'};
// しかし、オブジェクトのキーは保護されていないので、
// 次の文は問題なく実行される
MY_OBJECT.key = 'otherValue'; // Use Object.freeze() to make object immutable
// 配列も同じ
const MY_ARRAY = [];
// 配列にアイテムをプッシュすることができる
MY_ARRAY.push('A'); // ["A"]
// しかし、新しい配列を代入するのはエラーになる - Uncaught TypeError: Assignment to constant variable.
MY_ARRAY = ['B'];
仕様書
| 仕様書 |
|---|
| ECMAScript (ECMA-262) Let and Const Declarations の定義 |
ブラウザーの互換性
このページの互換性一覧表は構造化データから生成されています。データに協力していただけるのであれば、 https://github.com/mdn/browser-compat-data をチェックアウトしてプルリクエストを送信してください。
Update compatibility data on GitHub
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
const | Chrome 完全対応 21 | Edge 完全対応 12 | Firefox
完全対応
36
| IE 完全対応 11 | Opera 完全対応 9 | Safari 完全対応 5.1 | WebView Android 完全対応 ≤37 | Chrome Android 完全対応 25 | Firefox Android
完全対応
36
| Opera Android 完全対応 10.1 | Safari iOS 完全対応 6 | Samsung Internet Android 完全対応 1.5 | nodejs 完全対応 6.0.0 |
凡例
- 完全対応
- 完全対応
- 実装ノートを参照してください。
- 実装ノートを参照してください。