このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【JavaScript入門】引数の仕様

引数の仕様

 関数の引数にまつわる仕様は意外とバリエーション豊富で、最初はすべて覚える必要はありません。ただし、オブジェクトを引数に渡したときの挙動や、引数の数が合わないときの動きなど、知っておくと便利なポイントがいくつかあります。ここでは、そのような場面でよく遭遇するトピックをまとめます。

1.プリミティブ型とオブジェクトを引数に渡すときの違い

  • プリミティブ型 (number, string, boolean, etc.): 値が直接関数の引数変数にコピーされる。関数の中で引数変数を変更しても、呼び出し元には影響しない。
  • オブジェクト (Array含む): 値そのものではなく「参照」が関数に渡される。関数内部でオブジェクトの内容を変更すると、呼び出し元のオブジェクトも変わる。

2.オブジェクトや配列の内容を関数が書き換える例

【myFunctionArgs.html】

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>myFunctionArgs.html</title>
</head>
<body>
  <h1>引数の仕様サンプル</h1>
  <p>ブラウザの開発者ツール(コンソール)を開いて結果を確認してください。</p>

  <script>
    // 1. オブジェクトの値を関数内部で書き換える
    function modifyObject(argObj) {
      argObj.price = 0;
    }

    let drink = { name: 'コーヒー', price: 350 };
    console.log('呼び出し前:', drink);
    modifyObject(drink);
    console.log('呼び出し後:', drink);

    // 2. 配列の要素を関数内部で書き換える
    function modifyArray(argArray) {
      argArray[0] = '変更後';
    }

    let teaList = ['ほうじ茶', '抹茶ラテ', 'ウーロン茶'];
    console.log('呼び出し前:', teaList);
    modifyArray(teaList);
    console.log('呼び出し後:', teaList);

    // 3. プリミティブ型は関数内で変更しても呼び出し元に影響しない
    function modifyNumber(num) {
      num = num + 100;
      console.log('関数内での num:', num);
    }

    let amount = 200;
    console.log('呼び出し前 amount:', amount);
    modifyNumber(amount);
    console.log('呼び出し後 amount:', amount);
  </script>
</body>
</html>

実行結果

デバックコンソールの出力

呼び出し前: {name: "コーヒー", price: 350}
呼び出し後: {name: "コーヒー", price: 0}
呼び出し前: ["ほうじ茶", "抹茶ラテ", "ウーロン茶"]
呼び出し後: ["変更後", "抹茶ラテ", "ウーロン茶"]
呼び出し前 amount: 200
関数内での num: 300
呼び出し後 amount: 200

3.引数の数と実際の引数個数が一致しない場合

 JavaScript の関数は、引数を定義していても、その数に合わない呼び出しをしてもエラーにはなりません。

function showSingleArg(arg) {
  console.log('引数:', arg);
}

// 引数なし
showSingleArg();         // => 引数: undefined
// 引数1つ
showSingleArg('だけ');   // => 引数: だけ
// 引数2つ
showSingleArg('一番目', '二番目'); // => 引数: 一番目 (二番目は無視)
  • 引数を少なく渡した場合:渡されなかった引数は undefined になる
  • 引数を多く渡した場合:余った引数は無視される

まとめ

  • プリミティブ型を引数にした場合:値そのものが渡されるため、関数内での変更は呼び出し元に影響しない。
  • オブジェクトや配列を引数にした場合:参照が渡されるため、関数内での変更が呼び出し元にも反映される。
  • 引数の数が一致しなくてもエラーにならない:渡されない引数は undefined、多い分は無視。

 これらの挙動を知っておくと、予期しないバグを防ぎやすくなります。JavaScript では厳密な引数チェックは行われないため、必要に応じて自前で引数の型や数を検証することもあります。