destructuring: as patterns?

Allen Wirfs-Brock allen at wirfs-brock.com
Wed Apr 18 09:49:09 PDT 2012


On Apr 18, 2012, at 9:29 AM, Brendan Eich wrote:

> Herby Vojčík wrote:
>> Herby Vojčík wrote:
>>> 
>>> Maybe allowing
>>> let {b, b:{x,y}} = obj;
>>> would be enough. It sort-of comforms to existing syntax as well as
>>> semantics.
>> 
>> BTW, if you use var instead of let, if already works out of the box (in FF11 firebug console; just tried), so why include as if it already is there, albeit in different form? 
> 
> We implemented destructuring years ago to implementor- and user-test ES4 proposals. They did not forbid duplicates. That's all.
> 
> Nothing normative in experimental Firefox implementation features, of course. You cite them as "already [there]" and that's true but it doesn't govern what goes into ES6.

But is also works this way according to the ES6 draft spec.  It works with var because var allows duplicated declarations:

   var a=1;
   var a=2;
   var a=3;

which, from a declaration perspective isn't really any different from 
   var a=1,a=2,a=3;

However let/const does not:

{   //block level duplicate declaration early error
   let b=1;
   let b=2;
}

or just
  let b=1,b=2 ;   //block level duplicate declaration error

var {b,b:{x,y}} = obj;  //fine because var declaration static semantics don't disallow duplicates
{  //avoid any conflicts with the preceeding var
   let {b,b:{x,y}} = obj;  //block level duplicate declaration
}

You might argue that the second b in the destructuring isn't actually introducing a binding for b.  However,  syntactically it looks like one and that is what the static semantic rule is driven off of.  If we allow that, we would also be allowing:
    let b=somethingElse;
    let {b:{x,y})=obj;

If we want to allow that I'll have to some up with a different way to specify the static semantics.

Allen



More information about the es-discuss mailing list