const

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

構文

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

分割代入構文は、変数の宣言にも使用できます。

const { bar } = foo; // where foo = { bar:10, baz:12 }; 
/* これは、値が 10 の 'bar' という名前の変数を作成します。*/

解説

この宣言は、宣言された場所に応じて、グローバルまたはブロック内にローカルなスコープを持った定数を作成します。グローバルな定数は var 変数とは異なり、window オブジェクトのプロパティにはなりません

定数には初期化子が必要です。その値は、宣言されたのと同じ文の中で指定しなければなりません。(後から変更できないことを考えると、これは理にかなっています)

const 宣言は、値への読み取り専用の参照を作ります。これは、定数に保持されている値は不変ではなく、その変数の識別子が再代入できないということです。たとえば、定数の中身がオブジェクトの場合、オブジェクトの内容(プロパティなど)は変更可能です。

一時的なデッドゾーン」に関する考慮事項はすべて、letconst の両方に適用されます。

定数は、同じスコープ内の関数や変数と同じ名前にすることはできません。

基本的な定数の使い方

定数は大文字または小文字で宣言することができますが、すべて大文字で宣言するのが慣例です。

// 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);

定数は初期化が必要です。

// エラーが投げられます。
// Uncaught SyntaxError: Missing initializer in const declaration

const FOO;

オブジェクトと配列の定数

定数はオブジェクトや配列に対しても動作します。

const MY_OBJECT = {'key': 'value'};

// オブジェクトの上書きはエラーを投げます。
// Uncaught TypeError: Assignment to constant variable.
MY_OBJECT = {'OTHER_KEY': 'value'};

// しかしながら、オブジェクトのキーは保護されていないので、
// 次の文は問題なく実行されます。
MY_OBJECT.key = 'otherValue'; // Object.freeze() を使用すればオブジェクトを不変にできます。

// 配列も同じです。
const MY_ARRAY = [];
// 配列にアイテムをプッシュすることができます。
MY_ARRAY.push('A'); // ["A"]
// しかしながら、新しい配列を変数に代入するとエラーを投げます。
// Uncaught TypeError: Assignment to constant variable.
MY_ARRAY = ['B'];

仕様

仕様書
ECMAScript (ECMA-262)
Let and Const Declarations の定義

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
constChrome 完全対応 21Edge 完全対応 12Firefox 完全対応 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 完全対応 9Safari 完全対応 5.1WebView Android 完全対応 ≤37Chrome Android 完全対応 25Firefox 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 完全対応 10.1Safari iOS 完全対応 6Samsung Internet Android 完全対応 1.5nodejs 完全対応 6.0.0

凡例

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

関連情報