2017-03-01 59 views
0

有一个Function.prototype.arity属性用于获取参数函数期望的数目。现在它已经过时(自JS 1.4以来),并且相同的目标有Function.prototype.length究竟是什么`Function.prototype.length`的意思是?

但最近我在文档中找到了关于Array.prototype.reduce方法的文章。上面清清楚楚地写着,该方法具有财产length等于1

reduce方法的length属性是1

这个确切的文章有数量的参数头,并有其中的两个:

Array.prototype.reduce(callbackfn [,初值])

callbackfninitialValue(可选)。

所以我不清楚,到底什么是length财产的目的。
如果它被用来给开发者提供有用的信息,那么它实际上不会。
如果它只是一个技术自动生成的属性,只是表示函数定义中的参数个数,那么为什么不保持其一致性呢?

+1

[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

+0

”reduce“期望一个参数(必要的),另一个是可选的,所以它不计数! –

+0

至少你需要一个回调函数来运行reduce。 –

回答

0

Array.prototype.reducelength是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默认值不能undefinednull或相似的,因为功能已转移是基于对是否提供参数[不是它的价值是什么。但我们可以做到这一点与对象的身份。)

+0

所有这些,除了其他参数,在JavaScript中都不是很直观。 –

+0

@DmitryParzhitsky:是的,好吧,这又是一个意见。默认的参数值不会被计算在内,这对我来说是最令人惊讶的,但我们必须记住,它在第一次创建20年后才被添加到语言中。 TC39(管理该语言的委员会)在推动JavaScript向前迈进时非常困难,并且没有破坏15年前编写的内容,并且仍然被全部使用。在我们使用语言之前,默认参数的常见成语导致它们不被计数,所以我猜这就是为什么它们以这种方式出现的原因。 :-) –

-2

长度是Array对象的属性。它返回数组中元素的数量。这非常有用。这是关于它在互联网上的信息。

+0

属性['Array.prototype.length'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/length)和['Function.prototype。长度'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/length)是完全不同的:) –

+0

问题很明显是关于'length'属性* *函数**,而不是数组或字符串的'length'属性。 –