#20 JavaScriptで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

JavaScriptで関数を使っていると、悩むことはありませんか。「引数を渡し忘れたらエラーになってしまう」「引数の数が決まっていないときはどうすればいいの?」といった場面です。今回は、そんな悩みを解決してくれる「デフォルト引数」と「可変長引数」という2つの機能を紹介します。どちらも関数をより柔軟に、読みやすく書くための仕組みです。

デフォルト引数とは

関数を呼び出すとき、引数(関数に渡す値)を省略すると、その値はundefined(値が定義されていないことを表す特別な値)になります。そのままだと計算に使ったときに意図しない結果になりがちです。

そこで便利なのが「デフォルト引数」です。これは、引数が渡されなかったときに自動で使われる初期値をあらかじめ設定しておく仕組みです。書き方はとてもシンプルで、引数名の後ろに= 初期値を書くだけです。

function greet(name = "ゲスト") {
  console.log(`こんにちは、${name}さん`);
}

greet();        // こんにちは、ゲストさん
greet("田中");  // こんにちは、田中さん

このように、引数を省略した場合は自動的に「ゲスト」が使われます。以前は関数の中でif文を使って「値が渡されていなければ初期値を代入する」という処理を書く必要がありましたが、デフォルト引数を使えば1行で済みます。

なお、デフォルト引数には固定の値だけでなく、他の変数を使った計算式や、別の関数の呼び出し結果を指定することもできます。この柔軟さはJavaScriptらしい特徴のひとつです。

可変長引数(残余引数)とは

次に紹介するのは「可変長引数」です。これは、関数に渡す引数の数が決まっていない場合に使う書き方です。例えば「合計を計算する関数」を作るとき、渡す数値が2個の場合も5個の場合もあり得ますよね。そんなときに便利なのが、引数名の前に...(ドット3つ)を付ける「残余引数(rest parameters)」という書き方です。

function sum(...numbers) {
  return numbers.reduce((total, n) => total + n, 0);
}

console.log(sum(1, 2, 3));       // 6
console.log(sum(10, 20, 30, 40)); // 100

この...numbersは、渡された引数をすべて配列としてまとめてくれます。配列なので、reduceのような配列用のメソッド(まとめて処理を行うための便利な機能)がそのまま使えるのが大きな利点です。

従来のarguments・apply・callとの違い

実はJavaScriptには、残余引数が登場する前から「arguments」という仕組みがありました。これは関数の中で自動的に使える特殊な変数で、渡された引数がすべて格納されています。ただし、argumentsは配列に似ていますが本物の配列ではないため、reducemapのような配列のメソッドを直接使うことができません。使うには配列に変換する一手間が必要でした。

また、他言語やJavaScriptの古いコードでは、関数に配列の中身をひとつずつ引数として渡すためにapplycallというメソッドが使われることもあります。これらは今でも使われる場面があります。ただし、残余引数とセットで登場する「スプレッド構文」(配列を...で展開して個別の値として渡す書き方)を使うと、より簡潔に同じことができます。

const nums = [3, 1, 4, 1, 5];
console.log(Math.max(...nums)); // 5

このように、初心者のうちは新しい書き方である残余引数・スプレッド構文を中心に覚えておけば十分です。argumentsやapply/callは、古いコードを読むときに「こういう書き方もあったのか」と理解できれば問題ありません。

デフォルト引数と可変長引数を組み合わせる

この2つは組み合わせて使うこともできます。ただし、可変長引数(残余引数)は必ず引数リストの一番最後に書くというルールがある点に注意してください。

function order(item, quantity = 1, ...options) {
  console.log(`${item}を${quantity}個、オプション: ${options.join("、")}`);
}

order("コーヒー", 2, "氷なし", "砂糖多め");

このように、決まった役割を持つ引数にはデフォルト引数を、数が不定な部分には残余引数を使い分けることで、呼び出す側にとって使いやすい関数を設計できます。

まとめ

今回はJavaScriptの関数をより柔軟に書くための2つの機能を紹介しました。

  • デフォルト引数:引数が省略されたときに使われる初期値を、= 値の形で設定できる
  • 可変長引数(残余引数):...引数名と書くことで、数が決まっていない引数を配列としてまとめて受け取れる

どちらも「関数を呼び出す側の負担を減らす」ための工夫です。最初は少し記号の意味を覚えるのに戸惑うかもしれませんが、実際に手を動かしてコードを書いてみると、すぐに感覚がつかめるはずです。ぜひ自分の書いた関数に少しずつ取り入れてみてください。

関連記事


本ページはプロモーションを含みます。

参考書籍(PR)

JavaScriptをもっと学びたい方には「改訂新版JavaScript本格入門」がおすすめです。

コメント

このブログの人気の投稿

#11 Rustで学ぶエラーハンドリングの基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本

#19 Goで学ぶテスト(単体テスト)の基本