究竟`Function.prototype.length`是什么意思?

时间:2017-03-01 12:07:14

标签: javascript ecma262

有一个Function.prototype.arity属性用于获取函数期望的参数数量。现在它已经过时了(自JS 1.4起),同样的目标有Function.prototype.length

但最近我在文档中发现了一篇关于Array.prototype.reduce方法的文章。它清楚地表明该方法的属性length等于1

  

length方法的reduce属性为1。

这篇文章的标题包含多个参数,其中有两个:

  

Array.prototype.reduce(callbackfn [,initialValue])

callbackfninitialValue(可选)。

所以我不清楚length属性的确切目的是什么 如果它用于向开发人员提供有用的信息,那么它实际上没有 如果它只是一个技术自动生成的属性,只是指示函数定义中的参数数量,那么为什么不保持其一致性呢?

2 个答案:

答案 0 :(得分:0)

Array.prototype.reduce的{​​{1}}为1,因为第二个参数是可选的。*

  

所以我不清楚length属性的确切目的是什么。

告诉开发人员在第一个参数之前有多少声明的参数,其中包含默认值(如果有)或rest参数(如果有),以参数列表中最早的为准。或者the spec puts it

  

length属性的值是一个整数,表示函数预期的典型参数数。

确切的算法位于the spec's Static Semantics: ExpectedArgumentCount section

  

如果它用于向开发人员提供有用的信息,那么它实际上并没有。

嗯,这是一个意见问题。 : - )

当你有一种类似JavaScript的语言,其中函数只能表达期望,但可以用更少或更多的参数调用,特别是当你添加默认参数值和休息参数的概念时,功能的优点就不足为奇了是一个有点软的概念。

一些有趣的例子:

length

*在ES5中,它在JavaScript中的声明将是:

function ex1(a) { }             // length is 1, of course
function ex2(a, b = 42) { }     // length is 1, `b` has a default
function ex3(a, b = 42, c) { }  // length is 1, `b` has a default and
                                // `c` is after `b`
function ex4(a, ...rest) { }    // length is 1 yet again, rest parameter doesn't count

...然后会使用function reduce(callback) { // ... } 来确定您是否应该arguments.length

在ES2015 +(又名“ES6”+)中,它仍然会像那样,或者像这样:

initialValue

...并使用function reduce(callback, ...args) { // ... } 查看是否有初始值。

或者可能是这样的:

args.length

...然后使用const omitted = {}; function reduce(callback, initialValue = omitted) { // ... } 来了解您是否提供了初始值。 (initialValue === omitted的默认值不能是initialValueundefined或类似的,因为函数必须根据参数是否被提供而分支[不是它的值是什么]。但是我们可以用对象标识做到这一点。)

答案 1 :(得分:-2)

Length是Array对象的属性。它返回数组中的元素数。这非常有用。这是有关它的信息。