On May 31, 2014, at 8:59 PM, Nicholas C. Zakas <[email protected]> 
wrote:

> I've been playing around with using destructuring as function arguments and 
> have come across some odd behaviors that I'm not sure are intentional (or 
> perhaps, not to spec).

Argument binding initialization takes place as part of 
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-functiondeclarationinstantiation
 
The actual initialization takes place in steps 24-25, essentially treating the 
entire parameter list as an array-like restructuring

Note that there has been significant tweaks to this section in each of the 3 
latest spec. drafts.  You favorite implementation may not match the current 
spec. text.

> For context, consider the following function:
> 
> ```
> function setCookie(name, value, { secure, path, domain, expires }) {
>    console.log(secure);
>    // ...
> }
> 
> // called as
> setCookie("type", "js", {
>    secure: true
> });
> ```
> 
> What happens here:
> * `secure === true`
> * `path === undefined`
> * `domain === undefined`
> * `expires === undefined`
> 
> I'd say all of that behavior is as expected. However, if I omit the third 
> argument completely, things get a bit strange:
> 
> ```
> setCookie("type", "js");   // throws error at console.log
> ```
> 
correct, this should throw a TypeError exception because desctructuring 
patterns (in any context) require an object value to restructure.  Since you 
did not pass a third argument there is no object to restructure into {secure, 
path, domain, expires}


> What happens here is that none of `secure`, `path`, `domain`, `expires` are 
> defined. I can use `typeof` on them to protect against this, but then I end 
> up with some lousy looking code:

not really, the thrown exception while processing the arguments should 
terminate the function and you should never start executing the function body 
> 
> ```
> function setCookie(name, value, { secure, path, domain, expires }) {
> 
>    if (typeof secure !== "undefined") {
>        // use it
>    }
> 
>    if (typeof path !== "undefined") {
>        // use it
>    }
> 
>    if (typeof domain !== "undefined") {
>        // use it
>    }
> 
>    if (typeof expires !== "undefined") {
>        // use it
>    }
> 
>    // ...
> }
> ```
> 
> My first thought was that this behavior made sense, since no destructuring 
> can happen on undefined. However, the workaround for dealing with that 
> behavior seems a bit heavy-handed.
> 
> I thought perhaps I could assign a default value, and that would solve the 
> problem:
> 
> ```
> function setCookie(name, value, { secure, path, domain, expires } = {}) {
>    console.log(secure);
>    // …

yes the above is exactly what you are expected to do.  Or you could include 
some defaults in the default object:

{secure, path, domain, expires } = {secure: false}



> }

> ```
> 
> Unfortunately, that resulted in a syntax error in Firefox. Traceur seems to 
> have no problem with it.

that sounds like a Firefox bug
> 
> So I really have two questions:
> 
> 1. Who is right about assigning a default value to a destructured parameter, 
> Firefox or Traceur?

Traceur
> 2. Is the behavior of not having any bindings for destructured parameter 
> properties correct? And if so, is it desirable?

no, it is supposed to throw as discussed above.

Allen




> 
> Thanks.
> 
> -- 
> ___________________________
> Nicholas C. Zakas
> http://www.nczonline.net
> 
> _______________________________________________
> 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

Reply via email to