Array comprehension syntax

Tab Atkins Jr. jackalmage at
Fri Sep 21 18:40:33 PDT 2012

On Fri, Sep 21, 2012 at 4:32 PM, Jason Orendorff
<jason.orendorff at> wrote:
> 1.  It seems simpler and more general to accept arbitrary sequences
>     of 'for' and 'if' clauses:
>         [x if x !== undefined]
>         [g for u of users if u.isAdmin() for g of u.groups()]
>     In the current draft only [Expr ForClause+ IfClause?] is allowed.

I assume this is meant to match Python's syntax.

> 2.  These comprehensions are permitted:
>         [EXPR for x of obj if a, b, c]
>         [EXPR for x of obj if x = 3]
>     The first is surprising to me for two reasons: first, because
>     commas in an array literal usually separate array elements,
>     whereas these are sequencing commas; second, it's odd that
>     commas are not permitted in the EXPR part of the comprehension
>     but are permitted in the if-condition.

No strong opinion, but I'd be fine with your suggested change.
Sequencing commas in an if statement are weird anyway.

>     The second is not so surprising, but it occurs to me that
>     unparenthesized assignment in this context will usually be a
>     mistake, so it might be nice to make that a syntax error.

Again, no strong opinion, but this kind of thing is occasionally
useful, despite the hazard.

> 3.  SpiderMonkey already supports this nonstandard syntax:
>         [x for each (x in obj)]
>     A paren-free ES6 array comprehension could begin with a function
>     call, like this:
>         [x for each(x in obj).y of z]
>     Currently SpiderMonkey treats 'each' as a keyword when it
>     appears after the 'for' keyword.
>     The two syntaxes are distinguishable in all cases, right?
>     It's a little painful to get NotIn right in this case, but we can
>     hack it.  As long as the syntax is unambiguous.

I assume that they're always distinguishable due to the
presence/absence of a space after "each", yes.


More information about the es-discuss mailing list