JavaScript Const
const キーワードは ES6(2015年)で導入されました。
const で定義された変数は再宣言できません。
const で定義された変数は再代入できません。
const で定義された変数はブロックスコープを持ちます。
再代入できません
const キーワードで定義された変数は再代入できません:
const PI = 3.141592653589793;
PI = 3.14; // これはエラーになります
PI = PI + 10; // これもエラーになります
代入が必要です
JavaScript の const 変数は宣言時に値を代入する必要があります:
正しい:
const PI = 3.14159265359;
間違い:
const PI;
PI = 3.14159265359;
JavaScript const を使用するタイミング
値が変更されるべきでないことが明確な場合には常に const で変数を宣言します。
const を使用して宣言する場合:
- 新しい配列
- 新しいオブジェクト
- 新しい関数
- 新しい正規表現
定数オブジェクトと配列
const キーワードは少し誤解を招くことがあります。
それは定数値を定義するのではなく、値への定数参照を定義します。
そのため、次の操作はできません:
- 定数値の再代入
- 定数配列の再代入
- 定数オブジェクトの再代入
しかし、次の操作はできます:
- 定数配列の要素の変更
- 定数オブジェクトのプロパティの変更
定数配列
定数配列の要素を変更することができます:
// 定数配列を作成できます:
const cars = ["Saab", "Volvo", "BMW"];
// 要素を変更できます:
cars[0] = "Toyota";
// 要素を追加できます:
cars.push("Audi");
しかし、配列を再代入することはできません:
const cars = ["Saab", "Volvo", "BMW"];
cars = ["Toyota", "Volvo", "Audi"]; // エラー
定数オブジェクト
定数オブジェクトのプロパティを変更することができます:
// 定数オブジェクトを作成できます:
const car = {type:"Fiat", model:"500", color:"white"};
// プロパティを変更できます:
car.color = "red";
// プロパティを追加できます:
car.owner = "Johnson";
しかし、オブジェクトを再代入することはできません:
const car = {type:"Fiat", model:"500", color:"white"};
car = {type:"Volvo", model:"EX60", color:"red"}; // エラー
重要
var、let、const の違い
スコープ | 再宣言 | 再代入 | 巻き上げ | thisにバインド |
---|---|---|---|---|
var | No | Yes | Yes | Yes |
let | Yes | No | Yes | No |
const | Yes | No | No | No |
良い点
let と const はブロックスコープを持ちます。
let と const は再宣言できません。
let と const は使用する前に宣言しなければなりません。
let と const は this にバインドしません。
let と const は巻き上げされません。
注意
Internet Explorer 11以前では let と const キーワードはサポートされていません。
最初の完全なサポートが始まったブラウザのバージョンに関する情報は以下の表をご参照ください:
Chrome 49 | Edge 12 | Firefox 36 | Safari 11 | Opera 36 |
---|---|---|---|---|
2016年3月 | 2015年7月 | 2015年1月 | 2017年9月 | 2016年3月 |
ブロックスコープ
const キーワードで変数を宣言する場合、ブロックスコープに関しては let と類似しています。
この例では、ブロック内で宣言された x と、ブロック外で宣言された x は異なります:
const x = 10;
// ここでは x は 10 です
{
const x = 2;
// ここでは x は 2 です
}
// ここでは x は 10 です
再宣言
JavaScript の var 変数を再宣言することはプログラムのどこでも許可されています:
var x = 2; // 許可されています
var x = 3; // 許可されています
x = 4; // 許可されています
既存の var 変数または let 変数を同じスコープで const に再宣言することは許可されません:
var x = 2; // 許可されています
const x = 2; // 許可されていません
{
let x = 2; // 許可されています
const x = 2; // 許可されていません
}
{
const x = 2; // 許可されています
const x = 2; // 許可されていません
}
既存の const 変数を同じスコープで再代入することは許可されません:
const x = 2; // 許可されています
x = 2; // 許可されていません
var x = 2; // 許可されていません
let x = 2; // 許可されていません
const x = 2; // 許可されていません
{
const x = 2; // 許可されています
x = 2; // 許可されていません
var x = 2; // 許可されていません
let x = 2; // 許可されていません
const x = 2; // 許可されていません
}
巻き上げ
var で定義された変数はプログラムの先頭に巻き上げられ、いつでも初期化できます。
つまり、宣言する前に変数を使用することができます:
// これはOKです:
carName = "Volvo";
var carName;
巻き上げされた const 変数もプログラムの先頭に巻き上げられますが、初期化はされません。
つまり、宣言する前に const 変数を使用すると ReferenceError が発生します:
alert (carName);
const carName = "Volvo";