Generalization of destructuring assignment, has this been discussed before?

David Herman dherman at mozilla.com
Wed Sep 21 05:54:22 PDT 2011


I've never liked these kinds of proposals because they confuse the declarative and imperative. Binding is static in JS (usually, anyway), and destructuring binding is a static form. If you introduce dotted forms you turn what looks like a binding form into purely a data-structure-mutating operation.

Dave

On Sep 21, 2011, at 5:35 AM, Lasse Reichstein wrote:

> 
> 
> On Wed, Sep 21, 2011 at 10:27 AM, Brendan Eich <brendan at mozilla.com> wrote:
> On Sep 21, 2011, at 12:17 AM, Lasse Reichstein wrote:
> 
>> Destructuring allows, e.g.,
>>   var o = {};
>>   [o.x, o.y] = [1, 2];
>> I.e., a generic LValue as a Field.
>> 
>> Could this be generalized to working outside of array/object braces in declarations, e.g.:
>>   var o.x = 42;   // Declared non-configurable
>>   const o.x = 37;  // Declared non-Wrtiable and non-configurable
> 
> o must denote an object already, right? Just checking -- some might want o if unbound to magically be bound to a fresh object, which would be deeply wrong.
> 
> Agree, it must be an LValue, which in ES is any expression evaluating to a Reference (is this how LValue is meant in the destructuring proposal?). If o isn't declared, then o.x isn't a Reference (just a "ReferenceError" :), and if it's null or undefined, the Reference is there, but assignment will fail.
>  
>> and the *real* reason for suggesting it, a highly convenient shorthand:
>>   function Foo.prototype.bar() { ... }
> 
> This is an oldie, we talked about it in ES1 days, IIRC JScript supported (supports?) it.
> 
> 
>> I think I have seen this suggested before, but it might just be Crockford's web pages at some point (perhaps the one suggesting "::" as abbreviation for ".prototype."). Has it been suggested for ES?
> 
> "::" is wanted for guards. http://disnetdev.com/blog/2011/09/20/Contracts.coffee-Works-In-Node.js/ extends CoffeeScript to use :: for guard-ish contracts while leaving Coffee's use of :: intact. Yes, significant whitespace.
> 
> Not suggesting to use ::, just trying to remember where I saw it :)
> 
>> There doesn't seem to be any syntactic ambiguity (but it can foil look-ahead on functions if function 
>> calls are allowed as LValues, since "function foo()()()()()()()() { ... } " won't know which parenthesis
>> starts the arguments until it sees the end of them). 
> 
> I don't see how function foo()() is legal unless you are thinking of an extension such as ES4/JS1.8+ "expression closures" where the body can be an expression.
> 
> The problem is that I was suggesting allowing 
>   function <any LValue>(x) {}
> but in ES, a function call can return a Reference, so it would allow  
>   function foo(x)(x) {}
> which is both confusing and will cause the parser to need arbitrary lookahead in order to know which "(x)" are calls and which is the declaration. Using "const foo() {} " for declarations is actually even worse, so I guess there is an ambiguity.
>  
>> Ofcourse, "classes" might remove the usecase for "in place function declaration" above.
> 
> Sure, but I've never understood why people want to write
> 
> Foo.prototype.m1 = function (...){...};
> Foo.prototype.m2 = function (...){...};
> Foo.prototype.m3 = function (...){...};
> ...
> 
> instead of
> 
> Foo.prototype = {
>   m1: function (...){...},
>   m2: function (...){...},
>   m3: function (...){...},
>   ...
> };
> 
> Needless adherence to tradition would require the prototype to have a .constructor property, so you have to write that too.
> I.e., I agree.
>  
> The exact grammar for the dotted expression is unclear. Would you allow any member expression, even one with bracketed index expressions? Side effects? Where to draw the line?
> 
> I would. And that's a good point. If it has side effects, when would those be evaluated? It seem that declarations on the form "function o.x(){}" would just be equivalent to "o.x = function x(){}" (except that it's not configurable). I.e., the saving is minuscule.
>  
> In light of all this, I don't see a strong argument for allowing declarations to have dotted expressions instead of identifiers.
> 
> I agree. There are too many corner cases, and not enough advantage.
> 
> /L 
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20110921/93e046ef/attachment.html>


More information about the es-discuss mailing list