変数と定数:var, let, constの違いと使い分けの基本

変数と定数:var, let, constの違いと使い分けの基本
目次

変数とは何か?「値を入れる箱」をもう少し正確に理解する

プログラミングでいう 変数 は、よく「値を入れるための名前付きの箱」と説明されます。
このたとえはとても大事で、JavaScriptでも同じです。

もう少し正確に言うと、変数を作るとは、

  • コンピュータのメモリに“置き場所”を確保し
  • そこに値(数値・文字列・オブジェクトなど)を入れて
  • あとで取り出したり、入れ替えたりできるようにする

ということです。

JavaScriptの特徴として、変数に入れる値の種類(型)を、最初に決めておく必要がありません。これを 動的型付け と呼びます。

たとえば、同じ変数に数値→文字列の順で入れてもエラーになりません。
これは初心者にとっては書きやすい反面、「思っていない型のまま処理が進む」原因にもなります(詳しくは後半で説明します)。

そして変数は、ただ値を入れるだけでなく、プログラムの中の「状態(変化する情報)」を管理するために使います。

例:

  • ゲームのスコア
  • 入力フォームの内容
  • 計算途中の合計
  • ログイン状態 など

学習の最初は、次の形を“型”として体に覚えればOKです。

let age = 25;
  • age:箱の名前
  • =:値を入れる(代入)
  • 25:入れる値

このイメージができると、あとで複雑な処理になっても「いま何がどこに入っているか」を追いやすくなります。

ES6で変数の書き方が変わった(varだけの時代からlet/constへ

JavaScriptは昔、変数宣言が var しかありませんでした
しかし2015年の大きなアップデート(ES6 / ECMAScript 2015)で、letconst が追加されました。

これが「変数宣言の革命」と言われる理由は、var にはバグの原因になりやすいクセがあり、let/const がそれをかなり解決したからです。

現在の開発現場では、基本的に let/constが標準です。
初心者も最初から let/const を中心に学ぶのが近道です。

JavaScriptの「ゆるさ」:動的型付けと暗黙の型変換に注意

JavaScriptが「便利だけど難しい」と言われる理由のひとつが、この ゆるさです。

たとえば、数値と文字列を + で足すとき、多くの言語ではエラーになりますが、JavaScriptはエラーにせず続行します。
そして多くの場合、文字列として結合します。

let x = "5"; // 文字列
let y = 3;   // 数値
console.log(x + y); // "53"

本当は「8」にしたかったのに「53」になる。
しかもエラーが出ないので、気づきにくいのが怖いところです。

他にも、true + 12 になる(trueが1として扱われる)など、知らないと混乱しやすい動きがあります。

だから変数を扱うときは、

  • 今の値は何?
  • 型(数値?文字列?)は合ってる?

を意識する必要があります。
困ったら console.log()typeof で確認する癖をつけると、ミスが減ります。

varはなぜ避けられる?ホイスティング(巻き上げ)が混乱の元

今は基本的に使わない var ですが、古いコードではまだ見かけるので「挙動は知っておく」価値があります。

var のややこしさの中心が ホイスティング(巻き上げ) です。

ポイントはこれです:

  • var の「宣言」は上に持ち上げられたように扱われる
  • でも「代入(値を入れる)」は持ち上げられない

その結果、こういうことが起きます。

console.log(val); // undefined(エラーにならない)
var val = "hello";

普通は「まだ宣言してないからエラー」になってほしいのに、undefined が出ます。
これがバグの原因になりやすいのです。

さらに varブロックスコープを持ちません
ifやforの {} の外にも変数が漏れやすく、名前の衝突や上書きが起きやすくなります。

let:再代入できる変数(ブロックスコープで安全)

let は「あとで値を変える必要がある変数」を作るときに使います。

一番大事なポイントは、letブロックスコープを持つことです。

ブロックスコープとは、「{} の中だけで有効」というルールです。

if (true) {
  let message = "hello";
  console.log(message); // "hello"
}

console.log(message); // エラー(外から見えない)

この仕様のおかげで、変数が関係ない場所まで影響する事故が減ります。
また let は同じ名前の二重宣言も基本的に防げるため、うっかりミスも減ります。

. const:再代入できない定数(まずはこれを基本にする)

const は「一度入れた値を、あとから入れ替えない」変数です。
つまり 再代入が禁止です。

const name = "Mike";
name = "Judy"; // エラー

この「変わらない」という性質は、とても重要です。
コードを読むときに「この値は途中で変わらない」とわかるだけで、理解がかなり楽になります。

そのため現場ではよく、

  • 基本はconst
  • 値を変える必要があるときだけlet

というルールが推奨されます。

※注意:const が禁止するのは「箱ごと入れ替える(再代入)」ことです。
配列やオブジェクトの中身を変更できる場合がある(ここは応用で扱うと良い)という点は覚えておくと安心です。

スコープ(参照できる範囲):グローバルとローカル

変数には「どこから見えるか」というルールがあります。これが スコープです。

  • グローバルスコープ:どこからでも見える(便利だが危険)
  • ローカルスコープ:限られた範囲だけで見える(安全)

グローバル変数は便利ですが、別のファイルやプラグインと変数名がかぶると、勝手に上書きされて原因不明のバグになります。
だからモダンJSでは、スコープをできるだけ小さくして、影響範囲を狭めるのが基本です。

ifやforの中でのvarは危険(ブロックを突き抜ける)

var はブロックスコープがないので、ifやforの {} の外にも変数が漏れます。

for (var i = 0; i < 5; i++) {
  var temp = "test";
}

console.log(i);    // 5(外から見える)
console.log(temp); // "test"(外から見える)

初心者は「forの中で作ったのに、なぜ外で見えるの?」となりがちです。
この違いが、let/const が必要になった理由でもあります。

変数の「宣言」「初期化」「代入」を分けて理解する

変数の扱いは、次の3段階で考えると理解が安定します。

  1. 宣言:箱の名前を作る
    • let x;(この時点では中身は undefined
  2. 初期化:最初の値を入れる
    • let x = 10;
  3. 再代入:別の値に入れ替える
    • x = 20;(letはOK、constはNG)

また変数名は、意味が分かる名前にすることが重要です。
JavaScriptでは userName のような キャメルケースがよく使われます。

まとめ:モダンJavaScriptの変数選び

最後に、覚えるべきルールはこれだけです。

  • 基本は const を使う(値が変わらないならこれ)
  • 必要なときだけ let を使う(カウンタ、合計、途中計算など)
  • var は基本使わない(古いコード理解のために挙動だけ知る)

JavaScriptは「ゆるい」ぶん、自分でルールを持って変数を管理するほど、バグが減って読みやすいコードになります。
変数はただの箱ですが、箱の作り方(var/let/const)で、プログラムの安全性が大きく変わります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次