On Apr 13, 2012, at 12:05 PM, Oliver Hunt wrote:

> On Apr 13, 2012, at 11:48 AM, David Herman <dher...@mozilla.com> wrote:
> 
>> On Apr 13, 2012, at 11:35 AM, Oliver Hunt wrote:
>> 
>>> foo(undefined);
>> 
>> 1, 2, 1
> 
> Uh what? I pass no arguments and arguments.length is 2, and i pass one 
> argument and arguments.length is 1?

See my follow-up, answer to the first one was wrong; arguments.length is of 
course 0 in the first case.

>>> foo(undefined, undefined);
>> 
>> 1, 2, 2
> 
> So i've passed 2 arguments, but they both get replaced?

Yes.

>>> foo(undefined, 3);
>> 
>> 1, 3, 2
> 
> So if you have default values we have to emit code to check for undefined in 
> each case?
> 
> is foo(a=5, b) valid?  The above examples imply that it should be.

I'm somewhat ambivalent about it. Sure, it's true that "undefined always gets 
replaced by default" means it's possible to get a defaulted argument followed 
by a non-defaulted argument. But we also don't have to encourage writing 
positional arguments like that; they can use options objects for that.

>>> foo(3, undefined);
>> 
>> 3, 2, 2
>> 
>>> Default values are for when arguments are not passed,
>> 
>> Stated without evidence!
> 
> C++, python, ...

That's precedent, but not an actual argument about *why* it should be done one 
way or another. (Also, the decision is utterly different in a statically typed 
language, so C++ isn't relevant.)

> This makes it impossible for me to distinguish between passing undefined as 
> an argument and not passing an argument.

That's right. In that case, you should not use the x=expr default syntax. But 
this is an uncommon case. The semantics you advocate is optimizing for the 
wrong cases.

> If i've written:
> 
> foo(undefined)
> 
> There's a very clear expectation that i have selected undefined as the value 
> i want to be passed.

You can just as easily say that if you've written:

    foo(getOptionalValue())

there's a very clear expectation that if getOptionalValue() returns undefined, 
you don't want the value to be passed.

> Yet you're saying this should be interpreted as foo() (only with a shorter 
> arguments.length).

Longer argument.length, but yes.

Dave

_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to