On 09/12/2016 05:32 PM, Danielle McLean wrote:
In current ECMAScript, it is legal to place a variable declaration inside the
initialiser of a `for` loop, as well as to declare the variable used by a
`for...in` or `for...of` loop within the declaring expression:

     for (let i = 0; i < 5; ++i) console.log(i);
     for (let item of collection) process(item);

When this syntax is used with `let` or `const`, the resulting variable is
scoped to the loop and is not visible to the rest of the surrounding block.

I propose that this syntax be extended, making it legal to place a variable
declaration within the condition of an `if` or `while` statement. Any truthy
value will cause the `if` block to run or `while` loop to repeat, as usual -
the advantage is that the particular truthy value is bound to a variable and
can be used inside the conditional block.

My initial reaction was positive, but now I don't think it works.

First, other places in the grammar do not restrict let/const to a single variable. Should

  if (let a=0, b=1, c=0) { ... }

execute the if block or not? The obvious solution is to require a single variable, which means the grammar for these let/consts is different from others. What about

  x = { a: 1 };
  if (let {a} = x) { ... }

Second, that previous example makes it unclear to me at first glance what the intended semantics *should* be. I could imagine this printing either 1 or 2:

  h = { foo: 0};
  if (let {bar=1} = h) {
    print(1);
  } else {
    print(2);
  }

Is the conditional based on the variable's final value, or on whether or not the destructuring found a match? I could argue for either one, so even if there's a natural way to resolve my first problem, I think the code looks ambiguous to the eye.

  if (let { children } = node) {
    print("interior node");
  } else {
    print("leaf node");
  }

Again, the simplest way to resolve this is to restrict it to "let/const IDENTIFIER = expression", but it feels weird to have different rules for this particular case. for(let...) on the other hand, does not attempt to use the let expression as a value, so it does not encounter any of these problems.

As a minor issue, it also feels a little awkward to special-case this conditional expression. I can do

  if (let x = foo()) print(x)

but not

  (let x = foo()) && print(x)

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to