constとlet
constおよびletはES5のvarを置き換えるものです。
constは定数を宣言するもので、letが変数を宣言するものです。
役割としてはletがvarと同様のものですが、同一ではないため別の名前になっています。
再代入の可否
constとletの差異は再代入の可否です。constは再代入が禁止されます。
const x = 1;
x = 2; // error
let y = 3;
y = 4; // ok
constでオブジェクトや配列を定義した場合にその要素を書き換えることは再代入にはなりません。
const o = {};
o.a = 1; // ok
const a = [];
a[0] = 2; // ok
ブロックスコープ
varは関数スコープという多少分かりにくいスコープの概念でしたが、
constとletはブロックスコープになりより直感的に使えます。
function f() {
var x = 1;
if (true) {
var x = 2; // same as x = 2;
}
console.log(x); // display "2"
}
function g() {
let x = 1;
if (true) {
let x = 2; // different from outer x
}
console.log(x); // display "1"
}
一方で、同一変数名をネストしたブロックスコープで使って変数を隠してしまうことは、 バグの元にもなるので一般的には勧められるものではありません。
参照: http://eslint.org/docs/rules/no-shadow
varにしかできないこと
- 関数スコープの変数の宣言
- (ファイルを横断する)グローバル変数の宣言
おすすめ
varは一切使わない- 再代入を行わないケースでは必ず
constを使う
課題
- 再代入の可否について試す