初心者がJavaScriptを学ぶ上で最初に混乱するvar,let,constに関して、
どうやって使い分けていけば良いか解説する。
結論
最初に結論から言うと、以下のように覚えておけば大丈夫。
- 可読性の高いコードにするために、基本は
const
一択 - どうしても変数の再代入をしなければ表現できないときは
let
- varを使うのは論外
違いを説明
まずはそれぞれの特性を説明する。
const
const
は再代入不可な変数を宣言するためのものである。
Javaでいうところのfinal
。
constによって宣言された変数にもう一度何かを代入しようとした場合、エラーになる。
例
// 宣言
const hoge = 10;
// 再代入しようとすると、エラー
hoge = 5;
後述するが、const
は「定数」だと考えると納得がいかないところが多いと思う。
そのため定数ではなく「中身を入れ替えることができない変数」と考えると良い。
let
let
は再代入可能(中身を入れ替えることができる)な変数である。const
でエラーになった以下のようなコードはlet
ではエラーにならない。
例
// 宣言
let hoge = 10;
// 代入できる
hoge = 5;
console.log(hoge); // 「5」と表示される
var
これはconst
とlet
が作られる前から存在した古い宣言方法で、
挙動としてはlet
に近いが、以下の3つの点がlet
とは異なる。
- 再宣言ができてしまう
- ブロックスコープが適用されない
- 変数の巻き上げが起こる
詳しい説明は他の記事に任せるが、簡単に説明すると
let
:他のプログラミング言語の変数仕様に近いvar
:他のプログラミング言語よりも変数の自由度が高すぎる、特殊な挙動をする
という違いがある。
この特殊な挙動をするというところがポイントで、
ここを完全に理解していないとバグがあるコードを書いてしまう可能性が十分にある。
また、この特殊な挙動は機能としても別にあって便利なものではない。
こういった理由でvar
よりもlet
を使うことが推奨される。
constは「定数」ではなく「再代入不可能な変数」
「const
=定数」と覚えている人にとっては、
「基本的にconst
のみを利用しましょう」と言われると、
「定数のみでプログラムが書けるわけがない」と気持ち悪く感じるだろう。
これに対する回答は「const
は定数ではなく再代入不可能な変数だから」と考えてほしい。
例を以下に示すが、プログラミングでは再代入不可能な変数を使う方が良いコードになる。
良いコードとは
基本的に良いコードというのは変数の再代入をできるだけ行わない。
なぜなら、その変数に今何が代入されているのか追いやすいからだ。
プログラムの保守を行う際に、コードを読むコストが圧倒的に異なる。
let
で宣言された変数:使う前に「もしかしたらどこかで変更されているかもしれない」と探す必要があるconst
で宣言された変数:最初に宣言された値が絶対に入っているので、「他で書き換えられているかも」という心配がない
この話はJavaScriptに限らないことなので、以下の記事で解説している。
まとめ
- 基本は
const
一択 - どうしても変数の再代入をしなければ表現できないときは
let
- そもそも変数の値が書きかわっているときは意味が変わってることが大半なので、別の名前で定義すべき
const
は定数ではなく再代入不可能な変数- 変数の代入はできるだけ行わない方が読みやすいコードになる