"Exception: parameter(s) with default followed by parameter without default"

Brendan Eich brendan at mozilla.org
Wed Oct 10 10:25:59 PDT 2012


Oliver Hunt wrote:
> On Oct 10, 2012, at 9:12 AM, Allen Wirfs-Brock <allen at wirfs-brock.com 
> <mailto:allen at wirfs-brock.com>> wrote:
>> On Oct 10, 2012, at 6:39 AM, David Bruant wrote:
>>
>>> 2012/10/10 Keith Cirkel <es-discuss at keithcirkel.co.uk 
>>> <mailto:es-discuss at keithcirkel.co.uk>>
>>>
>>>     You /are/ actually passing in a second argument though, your
>>>     second argument is `undefined`. Default arguments aren't meant
>>>     to replace `undefined` values, they're meant to
>>>     be permissible for omission.
>>
>>
>> No, that isn't what the draft specification now says.  It was 
>> originally that way, but TC39 based upon discussions here, decided 
>> that an explicit undefined argument value triggers default value 
>> initialization.
>
> I still disagree with this decision, but from an implementation 
> standpoint the cost difference is fairly minimal (there is of course 
> an additional runtime performance cost, but i suspect it would be 
> negligible).

The reason for treating undefined (and only undefined) as the sentinel 
value that triggers defaulting may not be clear to everyone. It is so 
that delegation layers do not have reproduce all the defaulting logic 
just to call the target function with the right number of parameters:

   function foo(a, b, c) {
     log(stuff, a, b, c);
     return bar(a, b, c);
   }
   function bar(a = da, b = db, c = dc) {
     ...
   }

Without this, foo(1) and foo(2,3) calls would need to be special-cased 
in foo's body to call bar with only 1 or 2 arguments.

> I guess it depends on whether the committee feels that we should be 
> encouraging the use of null over undefined in new syntactic constructs.

What has null to do with your disagreement with there being a default 
sentinel? Or did you mean that you disagreed with only undefined being 
that sentinel?

/be


More information about the es-discuss mailing list