Something we need to define for ES.next is how to compute the length property
value for functions whose formal parameter list includes "optional" and/or rest
parameters. (See
http://wiki.ecmascript.org/doku.php?id=harmony:parameter_default_values and
http://wiki.ecmascript.org/doku.php?id=harmony:rest_parameters ). Remember
that according to 15.3.5.1the value of the length property of a function is
"the 'typical' number of arguments expected by the function" and that for user
defined functions, the value of the length property as currently specified in
13.2 is the number of items in the functions formal parameter list.
For built-in, section 15 says that the length property value for built-ins
"unless otherwise specified, this value is equal to the largest number of named
arguments shown in the subclause headings for the function description,
including optional parameters". However, there are many cases where the length
is "otherwise specified" and in many of those the pattern seems to be to not
include optional parameters in the length.
Some examples,
Built-in constructors most commonly have a length of 1. This includes Array
which can be viewed as using a rest parameter. However, Date has a length of
7 reflecting that it can have up to 7 optional parameters and RegExp has a
length of 2 even though its second argument is arguably optional (although it
isn't shown as such in the section heading). But overall, these generally the
follow the section 15 default rule of counting optional parameters.
Array.prototype and String.prototype functions generally don't include optional
parameters in the length count and they generally give a function that only has
a single rest parameter (for example, concat and push) a length of 1 but don't
include any rest parameters in the length for functions such as splice where
the rest parameter is not the firs parameter.
Date.prototype has a number of functions that take optional arguments and they
are all counted in the length.
(BTW, it would be a useful exercise for somebody to try to recode all the
built-in function section headings using optional/rest parameter syntax)
So, what is a length determination algorithm that recognizes optional/rest
arguments and is consistent with the stated intent of length and (as much as
possible)existing section 15 definitions. Here is one proposal:
The length is 0 only if the formal parameter list is empty.
For example:
function foo() {}; //foo.length==1
If the formal parameter list includes any non-optional, non-rest formal
parameters, the length is the total number of non-optional/non-rest formal
parameters.
For example:
function bar(a,b,c) {} //bar.length=3
function baz(a,b,c=0) {} //baz.length=2
function bam(a,b,c=0,...d) {} //bam.length==2 BTW, is this legal?
If there are no non-optional or non-rest formal parameters the length is 1.
function bar1(a=0) {} //bar1.length=1
function baz1(a=0,b=1,c=2) {} //baz1.length=1
function bam1(...a) {} //bam1.length==1
Thoughts?
Allen_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss