JavaScript | 関数と参照渡しの注意点

JavaScript JavaScript
スポンサーリンク

JavaScript初心者向けに、関数に値を渡すときの「イミュータブル」と「ミュータブル」の違いを、わかりやすく例を交えて詳しく解説します。


1. 基本の考え方

🔹 イミュータブル(変更できないもの)

  • 数字や文字列など
  • 関数の中で値を変えても、元の変数は変わらない

🔹 ミュータブル(変更できるもの)

  • 配列やオブジェクト
  • 関数の中で値を変えると、元の変数も一緒に変わる

2. イミュータブルの例(数字)

function doubleNumber(num) {
  num = num * 2; // 関数の中で値を変える
  console.log("関数内:", num);
}

let myNumber = 5;
doubleNumber(myNumber); // 関数内: 10
console.log("関数外:", myNumber); // 関数外: 5(元の値は変わらない)
JavaScript

💡 ポイント

  • myNumberは関数に渡されても「コピー」が渡されるイメージ
  • 関数内で変えても、元の変数には影響なし

3. ミュータブルの例(配列)

function doubleArray(arr) {
  for (let i = 0; i < arr.length; i++) {
    arr[i] = arr[i] * 2; // 配列の中身を書き換える
  }
  console.log("関数内:", arr);
}

let myArray = [1, 2, 3];
doubleArray(myArray); // 関数内: [2, 4, 6]
console.log("関数外:", myArray); // 関数外: [2, 4, 6](元の配列も変わっている)
JavaScript

💡 ポイント

  • 配列は「参照」で渡される
  • 関数内で変更すると、元の配列にも反映される

4. 元の配列を変えたくないときの対策

配列のコピーを作って渡すと、関数内で変えても元の配列は変わらない

function doubleArraySafe(arr) {
  let copy = [...arr]; // 配列のコピーを作る
  for (let i = 0; i < copy.length; i++) {
    copy[i] = copy[i] * 2;
  }
  console.log("関数内:", copy);
}

let myArray2 = [1, 2, 3];
doubleArraySafe(myArray2); // 関数内: [2, 4, 6]
console.log("関数外:", myArray2); // 関数外: [1, 2, 3](元の配列は変わらない)
JavaScript

💡 ポイント

  • [...] は「スプレッド構文」と呼ばれ、配列のコピーを作る
  • 元の配列を安全に保ちつつ、関数内で自由に操作できる

まとめ

データ型関数内で変更すると元に影響?
数字・文字列(イミュータブル)×let num = 5;
配列・オブジェクト(ミュータブル)let arr = [1,2,3];
  • イミュータブル → 安心して渡せる
  • ミュータブル → 注意が必要、必要ならコピーを使う

💡 初心者向けの感覚イメージ

  • 数字や文字列 → 「手紙のコピーを渡す」
  • 配列やオブジェクト → 「家の鍵を渡す」
    → 中身をいじると元の家も変わる
タイトルとURLをコピーしました