【JavaScript/TypeScript】const / let / var

JavaScript / TypeScript

const / let / var って、どんなふうに違うのかな?

今回は JavaScript の 定数や変数である const / let / var について取り上げてみたい思います。

const / let / var まとめ

種類再代入再宣言スコープ主な用途
const❌ 不可❌ 不可ブロックスコープ変更されない値(定数)
let✅ 可能❌ 不可ブロックスコープ普通の変数
var✅ 可能✅ 可能関数スコープ(古い)レガシーコードとの互換

const (定数) ※使用推奨

特徴

  • 再代入不可
  • 再宣言不可
  • ブロックスコープ
  • 宣言時に初期化必須
    ➡️「中身が不変」ではなく「参照が不変

オブジェクト・配列は変更できるが再代入は不可(重要)

スコープ

ブロックスコープ内 しか参照できない
➡️ 意図しない参照を防げる

let(変数)

特徴

  • 再代入可能
  • 再宣言不可
  • ブロックスコープ
  • ES2015(ES6)から登場

ブロックスコープ

ブロックスコープ内 しか参照できない
➡️ 意図しない参照を防げる

var(変数)※非推奨

特徴

  • 関数スコープ
  • 再代入可能
  • 再宣言可能
  • 巻き上げ(hoisting)が分かりづらい

ブロックスコープ

ブロックスコープ外 でも参照できる
➡️ ブロック {} を無視するため、バグの温床 になる

巻き上げ(hoisting)での違い

巻き上げ(hoisting)とは、JavaScript がコードを実行する前に、変数や関数の宣言をあらかじめ登録する仕組み のことで、値の代入はこの段階では行われない。

hoisting(巻き上げ)イメージ例

  1. JavaScriptがコードを読む
  2. 変数・関数の「宣言」のみを先に集める
  3. 上から順にコードを実行する

➡️ Temporal Dead Zone(TDZ): 初期化(宣言)される前の、参照できない期間のこと

var

var で宣言した場合、登録されているが値が代入されずに初期化(宣言)前にアクセスすると undefined となる

const / let

const let で宣言した場合、初期化(宣言)前にアクセスできないため、エラーとなる

※参考 関数宣言 / 関数式(const/let)

関数宣言 の場合は、hoisting(巻き上げ)されるため初期化(宣言)前でも実行可能だが、関数式(const/let) の場合は、初期化(宣言)前にアクセスできないため、エラーとなる

どれを使うべき?

  • const推奨、基本はこちらを使用
  • let:後で値が変わる変数
  • var:非推奨、古い、使わない

まとめ

JavaScript の const / let / var について、いかがでしたでしょうか?

再代入スコープ の違い、hoisting(巻き上げ)の挙動 など、それぞれの特性を理解することで、予期せぬバグを防ぎ、より安全で読みやすいコードを書くことができます。

基本的には const を使い、値を変更する必要がある場合のみ let を使う ことを意識して、バグの少ない JavaScript を書いていきましょう。

コメント

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