web-dev-qa-db-ja.com

関数のアリティを取得する

Javascriptでは、関数に定義されている仮パラメーターの数をどのように決定できますか?

これは、関数が呼び出されたときのargumentsパラメーターではなく、関数が定義された名前付き引数の数であることに注意してください。

function zero() {
    // Should return 0
}

function one(x) {
    // Should return 1
}

function two(x, y) {
    // Should return 2
}
54
JasonSmith
> zero.length
0
> one.length
1
> two.length
2

ソース

関数は、次のように独自のアリティ(長さ)を決定できます。

// For IE, and ES5 strict mode (named function)
function foo(x, y, z) {
    return foo.length; // Will return 3
}

// Otherwise
function bar(x, y) {
    return arguments.callee.length; // Will return 2
}
60
Josh Lee

関数のアリティは、その.lengthプロパティに格納されます。

function zero() {
    return arguments.callee.length;
}

function one(x) {
    return arguments.callee.length;
}

function two(x, y) {
    return arguments.callee.length;
}

> console.log("zero="+zero() + " one="+one() + " two="+two())
zero=0 one=1 two=2
11
JasonSmith

他の回答でカバーされているように、lengthプロパティはそれを示しています。そう zero.lengthは0になり、one.lengthは1になり、two.lengthは2になります。

ES2015の時点で、2つのしわがあります。

  • 関数は、パラメーターリストの最後に「rest」パラメーターを持つことができます。これは、その位置または後で指定された引数を真の配列にまとめます(arguments疑似配列とは異なります)。
  • 関数パラメーターにはデフォルト値を設定できます

関数のアリティを決定するときに、「rest」パラメーターはカウントされません。

function stillOne(a, ...rest) { }
console.log(stillOne.length); // 1

同様に、デフォルト引数を持つパラメーターはアリティに追加されず、実際には、明示的なデフォルトがなくても、それに続く他のパラメーターが追加されるのを防ぎます(サイレントデフォルトはundefinedであると想定されます)。 :

function oneAgain(a, b = 42) { }
console.log(oneAgain.length);    // 1

function oneYetAgain(a, b = 42, c) { }
console.log(oneYetAgain.length); // 1
6
T.J. Crowder

関数のアリティは、関数に含まれるパラメーターの数です。これは、lengthプロパティを呼び出すことで取得できます。

例:

function add(num1,num2){}
console.log(add.length); // --> 2

function add(num1,num2,num3){}
console.log(add.length); // --> 3

注:関数呼び出しで渡されるパラメーターの数は、関数のアリティに影響しません。

0
Nikhil

関数が期待する引数の数を返すために使用されるarityプロパティは、存在しなくなり、Function.prototype.lengthプロパティに置き換えられました。

0
Dan