MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

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

構文

const name1 = value1 [name2 = value2 [, ... [nameN = valueN]]];
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")。

関連項目

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

 このページの貢献者: Sync, ambi, hgcr, rosskie, YuichiNukiyama, dskmori, yukirin, jungjoo, teoli, Susisu, ethertank, Nanto vi
 最終更新者: Sync,