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

Reply via email to