I don’t fully understand this — what is the reason for needing to know actual 
argument count?  The historical reason was that if i have a var arg function 
with a few required parameters i don’t have any nice way of iterating the 
optional args.

Default and rest parameters seem to solve this use case.

—Oliver

On Nov 10, 2013, at 10:12 AM, Allen Wirfs-Brock <[email protected]> wrote:

> One of the the few remaining uses of a function's 'arguments' binding is to 
> determine the actual number of passed arguments.  This is necessary in some 
> overloading scenarios where a function has different behavior when an 
> argument is completely absent then it has when undefined (or any other 
> default value) is explicitly passed in that parameter position.  That 
> situation occurs in a number of DOM APIs and even a few ES library functions.
> 
> For example(see https://bugs.ecmascript.org/show_bug.cgi?id=1877 ), 
> Array.prototype.splice returns different results for:
>    [1,2,3].splice()
> and
>    [1,2,3].splice(undefined)
> 
> The natural ES6 declaration for a splice function is:
> 
>    function splice(start, deleteCount, ...items) {...
> 
> but if you write it this way then within the body you have to have a test 
> like:
> 
>     if (arguments.length == 0) {...
> 
> to implement the correct  web-compatable behavior.
> 
> Or, alternatively you could declare the functions as:
> 
> function splice(...actualArgs) {
>      let [start, stop, ...item] = actualArgs;
>      ...
>      if (actualArgs.length == 0) {...
> 
> So, to implement a Web-compaable version of splice you either have to use 
> 'arguments' to determine the actual number of passed objects or you need to 
> declare it with a bogus parameter pattern and use explicit or implicit 
> destructuring to parse out the positional parameters.
> 
> One way around this dilemma would be to provide a syntactic affordance for 
> determing the actual argument count.  For example, one possibility would be 
> to allow the last item of any formal parameter list to be an item of the 
> syntactic form:
> 
>     ActualArgumentCount : '#' BindingIdentifier
> 
> So, the declaration for splice could then be:
> 
>    function splice(start, deleteCount, ...items, #argCount) {
>       ...
>       if (argCount == 0) {...
> 
> Thoughts?
> 
> Allen
> 
> 
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to