定数 (const) は、 let 文を使って定義する変数と同じ、ブロックスコープです。定数の値は、再代入による変更はできず、再宣言もできません。

構文

const name1 = value1 [, name2 = value2 [, ... [nameN = valueN]]];
nameN
定数名。正当な 識別子 なら、どんなものでもかまいません。
valueN
定数の値。 正当な なら、どんなものでもかまいません。

説明

この宣言は、グローバルか、宣言された関数内ローカルな定数を作ります。グローバルな定数は var 変数と異なり、 window オブジェクトのプロパティにはなりません。つまり、宣言された同じ文の中で値を指定しなくてはいけません (あとで変更できません)。

const 宣言は、値への読み取り専用の参照を作ります。その値が不変ということではなく、その変数識別子が再代入できないというだけです。たとえば、定数がオブジェクトのコンテンツの場合、オブジェクトのコンテンツ(例 その引数)自体は変更可能です。

temporal dead zone」の懸念事項はすべて、 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 2015 (6th Edition, ECMA-262)
Let and Const Declarations の定義
標準 初回定義。
ECMAScript Latest Draft (ECMA-262)
Let and Const Declarations の定義
ドラフト 変更なし。

ブラウザーの対応

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOS 版 SafariSamsung InternetNode.js
基本対応Chrome 完全対応 21Edge 完全対応 ありFirefox 完全対応 36
補足
完全対応 36
補足
補足 Prior to Firefox 13, const is implemented, but re-assignment is not failing.
補足 Prior to Firefox 46, a TypeError was thrown on redeclaration instead of a SyntaxError.
IE 完全対応 11Opera 完全対応 ありSafari 完全対応 5.1WebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 ありFirefox Android 完全対応 36
補足
完全対応 36
補足
補足 Prior to Firefox 13, const is implemented, but re-assignment is not failing.
補足 Prior to Firefox 46, a TypeError was thrown on redeclaration instead of a SyntaxError.
Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 ありnodejs 完全対応 あり

凡例

完全対応  
完全対応
実装ノートを参照してください。
実装ノートを参照してください。

関連情報

ドキュメントのタグと貢献者

最終更新者: mfuji09,