JavaScript | 関数で受け取る引数の数を取得する

JavaScript JavaScript
スポンサーリンク

初心者向けにやさしく、例をたくさん使って function.length(関数オブジェクトの length プロパティ)が何を返すか、いつ役に立つか、混同しやすい点(実際に渡された引数の数との違い、デフォルト引数・rest の影響)まで丁寧に説明します。最後に手を動かせる練習問題と答えも付けます。さっそく行きましょう。

1. function.length が教えてくれること(超かんたん要約)

  • 関数名.length は、その関数が**定義されたときに書かれている「引数の数」**を返します。
  • 呼び出し時に実際に渡された引数の個数ではない点に注意!

2. 基本の例(まずは直感をつかむ)

function add(x, y) {
  return x + y;
}
console.log(add.length); // -> 2
JavaScript

上の例では add は引数が2つあるので length2 になります。

3. 「実際に渡された引数の数」との違い

関数を呼ぶとき、渡す引数は自由です:

console.log(add(1, 2).length); // これはエラーになる(戻り値は数なので length は無い)
console.log(add(1, 2));       // -> 3 (戻り値)
// 実際に渡す個数:
add(1);       // 引数は1つだけ(undefined が y に入る)
add(1,2,3,4); // extra な引数は無視される(関数内で参照しなければ)
JavaScript

関数に何個渡したか知りたいときは、function.length ではなく 呼び出し時の情報arguments.length や rest の長さ)を使います。後述します。

4. デフォルト引数(default parameters)があるとどうなる?

デフォルト値が付いた引数より前までの引数数が length に数えられます。
例:

function f(a, b = 2, c) { }
console.log(f.length); // -> 1
JavaScript

理由:b にデフォルトがあると「ここから先は省略可」という扱いになり、lengthb の直前まで(この例では a のみ)を数えます。

実践イメージ:

  • function (x) {}length = 1
  • function (x = 0) {}length = 0(最初の引数がデフォルトなら 0)

5. 可変長引数(rest 引数 ...args)があるとどうなる?

...(rest)で受け取る引数は length含まれません

function g(first, ...rest) { }
console.log(g.length); // -> 1
JavaScript

rest は「残り全部」をまとめる仕組みなので、length には通常引数だけがカウントされます。

6. arrow 関数でも同じ?

矢印関数(arrow)でも length は使えます:

const arrow = (a, b) => a + b;
console.log(arrow.length); // -> 2
JavaScript

7. 実際に「呼び出し時に渡された個数」を知る方法

  • 古い仕組み:arguments(関数の内部でのみ使える擬似配列)
  • 新しい・推奨:rest 引数を使う(...args)して args.length を見る

例(arguments):

function checkArgs() {
  console.log(arguments.length); // 実際に渡された個数
}
checkArgs(1,2,3); // -> 3
JavaScript

例(rest):

function checkRest(...args) {
  console.log(args.length); // -> 実際に渡された個数
}
checkRest(1,2); // -> 2
JavaScript

8. いつ使う?実用シーン

  • ライブラリや汎用関数で「想定している引数の数」に応じて振る舞いを変えたいとき(ただし設計としては明示的に判定するほうが良いことが多い)。
  • デバッグやメタプログラミング(関数のシグネチャを調べたい)で便利。

ただし、関数の設計が変わると length も変わるので、外部に依存するコードを書くと brittle(壊れやすい)になります。

9. ブラウザで試せる小さな HTML サンプル

開発者ツールの Console に貼って試せます(ファイルを作らなくても OK):

<!doctype html>
<html>
<body>
<script>
function demo(a, b = 1, ...rest) {}
console.log('demo.length =', demo.length); // -> 1
function demo2(x,y) {}
console.log('demo2.length =', demo2.length); // -> 2

function callCount() {
  console.log('arguments.length =', arguments.length);
}
callCount(1,2,3); // -> 3

function callRest(...args) {
  console.log('rest length =', args.length);
}
callRest(1); // -> 1
</script>
</body>
</html>
HTML

10. 練習問題

  1. 次の関数 hh.length の値は?理由も書こう。
function h(a, b = 2, c, ...rest) {}
JavaScript
  1. arrow という名前の矢印関数を const arrow = (x=0) => x; のように作ったとき、arrow.length は何?
  2. 実際に渡された引数の個数をチェックして、1 個なら「one」、2 個なら「two」、その他なら「other」と出力する関数を rest を使って作ってみよう。

答え

  1. h.length1。理由:b にデフォルト値があるので b の直前まで(つまり a のみ)がカウントされる。
  2. arrow.length0。最初の引数がデフォルトを持つと length はその直前までの数(この場合は 0)。
  3. サンプル解答:
function check(...args) {
  if (args.length === 1) console.log('one');
  else if (args.length === 2) console.log('two');
  else console.log('other');
}

check(1);      // one
check(1,2);    // two
check(1,2,3);  // other
JavaScript

11. よくある質問(FAQ)

Q
function.length は安全に使っていい?
A

小さなユーティリティやデバッグなら問題ありませんが、ライブラリの外部 API でこれを前提に振る舞いを変えると、将来その関数に引数が増えたときに壊れやすくなります。設計上は「引数の数」よりも「引数の意味(名前)」で分岐する方が堅牢です。

Q
arguments.lengthfunction.length を混同しやすい — 覚え方は?
A

覚え方:
function.length = 定義時の期待値(definition)
arguments.length / ...args.length = 呼び出し時の実績(actual)

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