◆ fn.length (Function.prototype.length) : に関数定義に書かれている引数の数
◆ 関数内で arguments.length : 実行時に渡された引数の数 

JavaScript では関数実行時に arguments という引数が勝手に作られます
こいつには 実行時に渡された引数 と 自分自身への参照が入っています
引数のリストは配列のように入っていて length プロパティもあります

なので実行された時に 渡された引数の数を知ることは出来ます

fn(1, undefined) と実行すると 引数の数は2arguments[1] にはundefined が値として入っています
arguments[2] などにアクセスしても返ってくる値は一緒ですが 値として入っていると配列化してforEach でループした時に実行されたり キー(添字)が存在するという違いがあるので一応知っておいたほうがいいと思います


じゃあ 関数が本当に期待してる数は?
定義してるのより少なくても多くてもOKな可変引数な言語だし そういう値はとれない?

と思ってたんですが lo-dash を使った時にカリー化でちゃんと引数の数が定義した数と合ったときに実行されていて 足りていないとラッパ関数が返り値になっていました

lo-dash は underscore.js とほぼ一緒のとっても便利なライブラリです
underscore.js よりちょっと高機能です

ということは 取得する方法がある!!
lo-dashほどのライブラリだと 特殊な方法を使って持ってきてたりしそうと思いながらもコードを呼んでると……

なんと
fn.length


関数の length プロパティ
これだけでした

あー こんなのでとれるんだ
そんな簡単なものだったんだ
言われてみると昔みたことあるようなないような

聞いたことがあったとしても使うことがなさすぎて頭が抜けてますね
本当に どこで使うんでしょうか
カリー化関数作る時くらい?

ところで

JavaScriptの新機能の デフォルト引数が付けられた引数は fn.length に含まれないようです
なくてもいいやつですからね
(function(x,y,z){}).length // 3
(function(x,y=1,z=2){}).length // 1