destructuring: as patterns?

Herby Vojčík herby at mailbox.sk
Wed Apr 18 10:59:59 PDT 2012



Allen Wirfs-Brock wrote:
> 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
> }

But the 'let {b:b, b:{x,y}}' is different beast, it is:
{
   let b = {x:1,y:2};
   let {x,y} = {x:1,y:2};
}
and there is, imo, no conflict in this.

>
 > 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

But, AFAICT, this should be allowed. The 'b:' from destructuring is 
different from 'b' from let. Is the previous code disallowed in current 
state?

 > specify the static semantics.
 >
 > Allen

Herby


More information about the es-discuss mailing list