2021年10月8日 JavaScript (JavaScript Primer) 変数と宣言
varの問題
同じ変数名で、再定義できてしまう点です。
letやconstでは、同じ名前の変数を再定義しようとすると、次のような構文エラー(SyntaxError)が発生します。
let word = "モスバーガー"; let word = "モスバーガー"; // SyntaxError: Identifier 'word' has already been declared
const food = "マック"; const food = "マック"; // SyntaxError: Identifier 'food' has already been declared
そのため、間違えて変数を二重に定義してしまうというミスを防ぐことができます。
またvarには変数の巻き上げと呼ばれる意図しない挙動があります。
後の章で詳しく学習するようなので、現時点では「letはvarを改善したバージョン」ということだけ覚えておくとよいと本書では言っています。
上記の理由から、varではなくlet constを使うべきです。
後方互換性を考慮し、varは使用可能になっています。
letとconstの違い
- constは、再代入できない変数を宣言できます
- letは、再代入ができる変数を宣言できます
constは再代入できない変数を定義するキーワードです。
再代入を禁止することで、ミスから発生するバグを減らすことが期待できます。
このため変数を宣言する場合には、まずconstで定義できないかを検討し、できない場合はletを使うことを推奨しています。
変数名の命名規則
変数を作成するときは、命名規則を守る必要があります。 JavaScript Primerに記載されている命名ルールを以下に引用します。
- 半角のアルファベット、_(アンダースコア)、$(ダラー)、数字を組み合わせた名前にする
- 変数名は数字から開始できない
- 予約語と被る名前は利用できない
変数名の最初の文字が数字でしたり、変数名が数字のみの場合は、変数宣言に失敗します。
const 2is = 0; // SyntaxError: Invalid or unexpected token const 123 = "あいう" // SyntaxError: Unexpected number
また、予約語として定義されているキーワードは変数名として利用できません。予約語とは、あらかじめ使い方が決まっている単語です。
const for = 10; // SyntaxError: Unexpected token 'for'
constは厳密には定数ではない
本書の内容を噛み砕いて書いてみました。
1.定義したものが、可変な値(配列など) だった場合は、その中身となるものは書き換えが可能なので厳密には定数とは呼べないと言えます。
2.定義したものが、不変な値(文字列や数値) だった場合は、変更できないため定数と言えます。
ちなみに、同じ入力に対して常に同じ出力が保障されることを参照透過性といいます。
1の場合のコード例
const array = []; array.push(5); array.push(7); array.push(7,8); console.log(array); // [ 5, 7, 7, 8 ]←arrayは可変な値のため中身を書き換えられています。(定数とは言えない)
2の場合のコード例
const number = 10; // 10は数値であり、不変な値のため変更することができません。(定数と言えます)
まとめ
- constは、再代入できない変数を宣言できる
- letは、再代入ができる変数を宣言できる
- varは、再代入ができる変数を宣言できるが、いくつかの問題が知られている
- 変数の名前(識別子)には利用できる名前のルールがある
- constは厳密に言うと定数ではない