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

