有一个Function.prototype.arity
属性用于获取函数期望的参数数量。现在它已经过时了(自JS 1.4起),同样的目标有Function.prototype.length
。
但最近我在文档中发现了一篇关于Array.prototype.reduce
方法的文章。它清楚地表明该方法的属性length
等于1
:
length
方法的reduce
属性为1。
这篇文章的标题包含多个参数,其中有两个:
Array.prototype.reduce(callbackfn [,initialValue])
callbackfn
和initialValue
(可选)。
所以我不清楚length
属性的确切目的是什么
如果它用于向开发人员提供有用的信息,那么它实际上没有
如果它只是一个技术自动生成的属性,只是指示函数定义中的参数数量,那么为什么不保持其一致性呢?
答案 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
的默认值不能是initialValue
或undefined
或类似的,因为函数必须根据参数是否被提供而分支[不是它的值是什么]。但是我们可以用对象标识做到这一点。)
答案 1 :(得分:-2)
Length是Array对象的属性。它返回数组中的元素数。这非常有用。这是有关它的信息。