--- title: const slug: Web/JavaScript/Reference/Statements/const tags: - ECMAScript 2015 - JavaScript - Language feature - Reference - Statement - constants translation_of: Web/JavaScript/Reference/Statements/const ---
定数 (const) は、let
キーワードを使って定義する変数と同じ、ブロックスコープを持ちます。定数の値は、再代入による変更はできず、再宣言もできません。
const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]];
nameN
valueN
分割代入構文は、変数の宣言にも使用できます。
const { bar } = foo; // where foo = { bar:10, baz:12 }; /* これは、値が 10 の 'bar' という名前の変数を作成します。*/
この宣言は、宣言された場所に応じて、グローバルまたはブロック内にローカルなスコープを持った定数を作成します。グローバルな定数は {{jsxref("Statements/var", "var")}} 変数とは異なり、{{domxref("window")}} オブジェクトのプロパティにはなりません。
定数には初期化子が必要です。その値は、宣言されたのと同じ文の中で指定しなければなりません。(後から変更できないことを考えると、これは理にかなっています)
const
宣言は、値への読み取り専用の参照を作ります。これは、定数に保持されている値は不変ではなく、その変数の識別子が再代入できないということです。たとえば、定数の中身がオブジェクトの場合、オブジェクトの内容(プロパティなど)は変更可能です。
「一時的なデッドゾーン」に関する考慮事項はすべて、{{jsxref("Statements/let", "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);
// エラーが投げられます。 // 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'];
仕様書 |
---|
{{SpecName('ESDraft', '#sec-let-and-const-declarations', 'Let and Const Declarations')}} |
{{Compat("javascript.statements.const")}}