获取函数的数量

IT技术 javascript functional-programming arity
2021-02-11 01:30:38

在 Javascript 中,如何确定为函数定义的形式参数的数量?

请注意,这不是arguments调用函数时参数,而是定义函数时使用的命名参数的数量。

function zero() {
    // Should return 0
}

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

function two(x, y) {
    // Should return 2
}
5个回答
> 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
}
你的意思是arguments.callee.length
2021-03-24 01:30:38
我打算回答我自己的问题,因为它不在 Stack Overflow 上,但你打败了我!我将使用函数的技术更新您的答案,以确定其自身的数量。
2021-03-29 01:30:38
请注意,这与 不同arguments.length,后者是实际收到的参数数量。
2021-04-05 01:30:38
是的,这就是我说“arity”的原因,所以知道他们正在搜索什么的人不必费力地阅读有关arguments.
2021-04-09 01:30:38
@jhs:还要注意,arguments.callee在 ECMAScript 5 严格模式下会引发错误,这意味着它已有效地从语言中删除。
2021-04-14 01:30:38

函数的元数存储在其.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

正如其他答案中所述,该length物业会告诉您这一点。所以zero.length将是 0,one.length将是 1,two.length将是 2。

从 ES2015 开始,我们有两个问题:

  • 函数可以在参数列表的末尾有一个“rest”参数,它将在该位置或之后给出的任何参数收集到一个真正的数组中(与arguments伪数组不同)
  • 函数参数可以有默认值

确定函数的元数时不计算“rest”参数:

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

类似地,带有默认参数的参数不会添加到 arity,并且实际上会阻止任何其他跟随它的人添加到它,即使他们没有显式默认值(假设它们具有无提示默认值undefined):

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

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

谢谢!这是一个很棒的更新。我认为 for ...rest,虽然它隐藏了真正的 arity,但该.length属性仍然很有用。但是在使用默认参数的情况下,您是否知道任何解决方法,或者甚至只是一种检测是否正在使用默认参数的方法?
2021-03-21 01:30:38
@JasonSmith:没有什么不依赖于反编译(例如,Function#toString)。
2021-04-12 01:30:38

函数元数是函数包含的参数数量。它可以通过调用长度属性来获得。

例子:

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

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

注意:在函数调用中传递的参数数量不会影响函数的数量。

为什么要发布这个答案?它包含与 2011 年接受的答案相同的信息。
2021-04-03 01:30:38

arity 属性用于返回函数预期的参数数量,但是,它不再存在并已被 Function.prototype.length 属性取代。

你有这个说法的任何来源吗?我找不到.arity任何地方。即使在 ECMAScript 标准 (1997) 的第 1 版中,它也是.length.
2021-04-04 01:30:38