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

構文

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

説明

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

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

let に対する "temporal dead zone" の懸念事項はすべて、const にも適用されます。

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

次の例は、定数の動作の例です。ブラウザコンソールで試してください。

// NOTE: 定数は大文字でも小文字でも宣言できるが、慣例的にすべて大文字を使う。

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

// 定数を再宣言しようとするとエラーになる
const MY_FAV = 20;

// MY_FAV 変数名は定数として予約されているため、失敗する -  Uncaught SyntaxError: Identifier 'MY_FAV' has already been declared
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"};

// オブジェクトの上書きはエラーになる - 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 の定義
ドラフト 変更なし。

ブラウザ実装状況

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応21 あり361 211 あり5.1
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応 あり あり あり361 2 あり あり あり

1. Prior to Firefox 13, const is implemented, but re-assignment is not failing.

2. Prior to Firefox 46, a TypeError was thrown on redeclaration instead of a SyntaxError.

関連項目

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

最終更新者: Uemmra3,