Le 10/11/2013 19:12, Allen Wirfs-Brock a écrit :
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.
I imagine it also breaks splice.length, but that's fixed by making
length configurable (writable? I don't remember).
I'm fine with the second solution. It's inelegant, but it's also legacy...
I don't think differenciating .splice() and .splice(undefined) and
equivalent use cases is a practice that should be encouraged.
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?
Why creating something new if it's only encouraging a bad practice?
Is there a good use case?
David
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss