JavaScriptの「let」「const」「var」の違いと使い分け

プログラミング

let、const、var とは

JavaScriptでは、変数を使用するときには変数名を宣言することが推奨されており、変数名を宣言するときに、使用するキーワードが「let」「const」「var」です。

以前は var のみ使用できましたが、ES2015(ES6)より let と const が追加されました。

let と const の追加により、var を使用する理由がほとんどなくなりました(後述します。)が、現状でも var を使用している人を見かけることがあります。

let、const、var それぞれの違いをしっかりと理解し、正しく使い分けができるようになりましょう。

変数とは

JavaScript を含むプログラミング言語全般において、とある文字列や数値などのデータを繰り返し使用することは少なくありません。

同じデータを繰り返し記述するのは手間がかかるため、そのデータに名前をつけて何度も繰り返し使用できるようにする機能が「変数」です。

let、const、var の違い

let、const、var はそれぞれ以下の3点での違いがあります。

  • 再代入可能か
  • 再宣言可能か
  • スコープの種類
letconstvar
再代入×
再宣言××
スコープブロックスコープブロックスコープ関数スコープ

再代入

再代入とは、一度宣言した変数に再度値を設定し直すことを意味します。

再代入可能な「let」「var」では、値が再代入されます。

一方、再代入不可能な「const」では、再代入を行うとエラーとなります。

// let
let a = "0";
a = "1";
console.log(a);  // 1

// const
const b = "0";
b = "1";  // エラー

// var
var c = "0";
c = "1";
console.log(c);  // 1

再宣言

再宣言とは、一度宣言した変数を同じ変数名で宣言することを意味します。

再宣言可能な「var」では、後に宣言された変数が適用されます。

一方、再宣言不可能な「let」「const」では、再宣言を行うとエラーとなります。

// let
let a = "0";
let a = "1";  // エラー

// const
const b = "0";
const b = "1";  // エラー

// var
var c = "0";
var c = "1";
console.log(c);  // 1

ブロックスコープ

スコープとは、変数の有効範囲のことを指します。

宣言された変数はスコープ内でのみ使用でき、スコープ外で使用することはできません。

「let」「const」で宣言された変数はともにブロックスコープであり、「{}(ブロック)」で囲われた中でのみ変数を使用することができます。

JavaScriptのスコープについて理解を深める

// let
{
  let a = "0";
  console.log(a);  // 0
}
console.log(a);  // エラー

// const
{
  const b = "0";
  console.log(b);  // 0
}
console.log(b);  // エラー

関数スコープ

「var」で宣言された変数は関数スコープであり、宣言された関数内ではどこからでも使用することができます。

// var
{
  var c = "0";
  console.log(c);  // 0
}
console.log(c);  // 0

var を使う必要がない理由

ES2015(ES6)での「let」と「const」の追加により、「var」を使用する理由はほとんどなくなったと言われています。

その理由は、「let」が「var」とほとんど同じ役割を果たしており、制約の多い「let」の方が自由度の高い「var」よりもコーディング上優れているためです。

制約が多いよりも、自由な方が良いのでは?という疑問が浮かびそうですが、コーディングを行う上では、一定の制約(ルール)があった方が保守性の高いコードを書けるため、ある程度の制約のある方が望ましいと言えます。(もちろん、制約がありすぎると不便なので使われません。)

const に対する誤解

「const」は定数と言われることがありますが、厳密には定数ではありません。

それは、オブジェクトや配列の値の変更(削除・追加)は再代入とは異なる扱いであり、変更が可能だからです。

また、変数宣言で「名前をつける」ということは、ほとんどの場合、値が変わる(再代入される)ことは想定されません。

ですので、基本的に関数宣言は「const」で行うことができます。

ただ、for文など、カウントとして増えていく変数を宣言する際には「let」を使用する必要があります。

let count = 0;

const elem = document.getElementById('sample');

elem.addEventListener('click', () => {
  // count に 1 を足して再代入する
  count ++;
  console.log(count); // (id="sample"がクリックされた回数)
})

コメント

タイトルとURLをコピーしました