Array.prototype.reduce
的length
是1,因为第二个参数是可选。*
所以这是我也不清楚,究竟length
财产的目的。
要告诉开发商多少宣布参数有一个默认值(如有)或其余参数(如果有的话)的第一个参数,两者在参数列表中最早之前。或为the spec puts it:
的length
属性的值是表示函数预期参数的典型数量的整数。
确切的算法在the spec's Static Semantics: ExpectedArgumentCount section。
如果它被用来给开发者提供有用的信息,那么它实际上并没有。
那么,这是一个意见问题。 :-)
当你有一种像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
*在ES5,其在JavaScript中的声明将是:
function reduce(callback) {
// ...
}
...然后它会使用arguments.length
以确定是否” d应该是initialValue
。
在ES2015 +(又名“ES6” +),它要么仍然是这样的,或者是这样的:
function reduce(callback, ...args) {
// ...
}
...并使用args.length
,看看是否有一个初始值。
或者可能是这样的:
const omitted = {};
function reduce(callback, initialValue = omitted) {
// ...
}
...然后使用initialValue === omitted
知道你是否愿意提供的初始值。 (中initialValue
默认值不能undefined
或null
或相似的,因为功能已转移是基于对是否提供参数[不是它的价值是什么。但我们可以做到这一点与对象的身份。)
[ECMAScript 5.1,Section 15.3.5.1,'length'](http://www.ecma-international.org/ecma-262/5.1/#sec-15.3.5.1):“_length属性的值是一个整数,表示函数所期望的**“典型”参数个数**,但是该语言允许函数被其他参数调用。“ – Andreas
”reduce“期望一个参数(必要的),另一个是可选的,所以它不计数! –
至少你需要一个回调函数来运行reduce。 –