- From: Boris Zbarsky <bzbarsky@MIT.EDU>
- Date: Fri, 27 Sep 2013 01:40:16 -0400
- To: Domenic Denicola <domenic@domenicdenicola.com>
- CC: Cameron McCormack <cam@mcc.id.au>, Allen Wirfs-Brock <allen@wirfs-brock.com>, Brendan Eich <brendan@mozilla.com>, "public-script-coord@w3.org" <public-script-coord@w3.org>
On 9/27/13 1:25 AM, Domenic Denicola wrote:
> This does not match ES6, where it would be zero if you wrote
>
> function foo(arg1 = undefined, arg2) {
That's true. But why would you write that?
Allen and I spent a while talking about this last week, with not much
agreement....
The current ES6 .length rules are basically designed around the fact
that ES6 doesn't have a good concept of "how many arguments does this
function expect?" so it has to guesstimate that based on the parameter list.
But in WebIDL we are actually giving more information about how many
arguments the function expects.
So given this WebIDL:
void foo(optional long arg1, long arg2);
I would claim that the right ES expression for it (that would match the
actual WebIDL semantics) would be:
function foo(arg1, arg2) {
if (arguments.length < 2) throw new TypeError("Need 2 args");
if (arg1 !== undefined) {
arg1 = arg1 >> 0;
}
arg2 = arg2 >> 0;
}
or so.
A bigger problem is this WebIDL:
void foo(optional long arg1 = 5, long arg2);
How to map that to ES is interesting: you could use a default value on
the formal parameter, or you could just check in the function body....
and the .length would be different depending on how you did it.
You could make a case that we should shoehorn this stuff into the
limitations of ES formal parameter lists somehow, but I believe the
spirit of .length, that it be the number of arguments the function
typically expects, is better served by the definition Cameron has in the
spec right now.
> I suppose you could not map "optional" to "= undefined"
Indeed. It's not = undefined at all.
> but that seems most natural
Why?
> and fits well with how I assume default arguments in WebIDL should be mapped to ES.
Maybe.
In some ways this whole discussion about .length is pointless, since in
practice no one really cares about what .length is on functions, I
suspect.... But if we're going to have this feature (.length on
functions that's supposed to mean something) I think we should in fact
have it mean something.
-Boris
Received on Friday, 27 September 2013 05:40:47 UTC