初心者向けにやさしく、例をたくさん使って function.length(関数オブジェクトの length プロパティ)が何を返すか、いつ役に立つか、混同しやすい点(実際に渡された引数の数との違い、デフォルト引数・rest の影響)まで丁寧に説明します。最後に手を動かせる練習問題と答えも付けます。さっそく行きましょう。
1. function.length が教えてくれること(超かんたん要約)
関数名.lengthは、その関数が**定義されたときに書かれている「引数の数」**を返します。- 呼び出し時に実際に渡された引数の個数ではない点に注意!
2. 基本の例(まずは直感をつかむ)
function add(x, y) {
return x + y;
}
console.log(add.length); // -> 2
JavaScript上の例では add は引数が2つあるので length は 2 になります。
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 にデフォルトがあると「ここから先は省略可」という扱いになり、length は b の直前まで(この例では a のみ)を数えます。
実践イメージ:
function (x) {}→length = 1function (x = 0) {}→length = 0(最初の引数がデフォルトなら 0)
5. 可変長引数(rest 引数 ...args)があるとどうなる?
...(rest)で受け取る引数は length に含まれません。
function g(first, ...rest) { }
console.log(g.length); // -> 1
JavaScriptrest は「残り全部」をまとめる仕組みなので、length には通常引数だけがカウントされます。
6. arrow 関数でも同じ?
矢印関数(arrow)でも length は使えます:
const arrow = (a, b) => a + b;
console.log(arrow.length); // -> 2
JavaScript7. 実際に「呼び出し時に渡された個数」を知る方法
- 古い仕組み:
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
JavaScript8. いつ使う?実用シーン
- ライブラリや汎用関数で「想定している引数の数」に応じて振る舞いを変えたいとき(ただし設計としては明示的に判定するほうが良いことが多い)。
- デバッグやメタプログラミング(関数のシグネチャを調べたい)で便利。
ただし、関数の設計が変わると
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>
HTML10. 練習問題
- 次の関数
hのh.lengthの値は?理由も書こう。
function h(a, b = 2, c, ...rest) {}
JavaScriptarrowという名前の矢印関数をconst arrow = (x=0) => x;のように作ったとき、arrow.lengthは何?- 実際に渡された引数の個数をチェックして、1 個なら「one」、2 個なら「two」、その他なら「other」と出力する関数を
restを使って作ってみよう。
答え
h.lengthは1。理由:bにデフォルト値があるのでbの直前まで(つまりaのみ)がカウントされる。arrow.lengthは0。最初の引数がデフォルトを持つとlengthはその直前までの数(この場合は 0)。- サンプル解答:
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
JavaScript11. よくある質問(FAQ)
- Q
function.lengthは安全に使っていい? - A
小さなユーティリティやデバッグなら問題ありませんが、ライブラリの外部 API でこれを前提に振る舞いを変えると、将来その関数に引数が増えたときに壊れやすくなります。設計上は「引数の数」よりも「引数の意味(名前)」で分岐する方が堅牢です。
- Q
arguments.lengthとfunction.lengthを混同しやすい — 覚え方は? - A
覚え方:
function.length= 定義時の期待値(definition)arguments.length/...args.length= 呼び出し時の実績(actual)
