<div dir="ltr"><div>An alternative to the block which you ended up with is to extract that logic to a function, which provides something which can be tested too. Possibly overkill for oneliners like this though.<br></div><div><br></div><div>However, writing a lot of code like this myself (get a value, if it's truthy do something, else do other), that's a nice idea for an extension that doesn't add extra variable bindings to the containing scope. </div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Sep 13, 2016 at 2:32 AM, Danielle McLean <span dir="ltr"><<a href="mailto:gopsychonauts@gmail.com" target="_blank">gopsychonauts@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">In current ECMAScript, it is legal to place a variable declaration inside the<br>
initialiser of a `for` loop, as well as to declare the variable used by a<br>
`for...in` or `for...of` loop within the declaring expression:<br>
<br>
    for (let i = 0; i < 5; ++i) console.log(i);<br>
    for (let item of collection) process(item);<br>
<br>
When this syntax is used with `let` or `const`, the resulting variable is<br>
scoped to the loop and is not visible to the rest of the surrounding block.<br>
<br>
I propose that this syntax be extended, making it legal to place a variable<br>
declaration within the condition of an `if` or `while` statement. Any truthy<br>
value will cause the `if` block to run or `while` loop to repeat, as usual -<br>
the advantage is that the particular truthy value is bound to a variable and<br>
can be used inside the conditional block. For example, here is the situation<br>
that prompted my writing this proposal:<br>
<br>
    if (const oldValue = _.get(object, 'some.long.path')) {<br>
      object.some.long.path = transform(oldValue);<br>
    }<br>
<br>
As with the existing behaviour of declarations inside `for`, variables declared<br>
using `let` or `const` would be scoped to the individual `if` or `while`<br>
statement, rather than the containing block. In other words, the above syntax<br>
would be equivalent to the following currently-valid form I ended up writing:<br>
<br>
    {<br>
      const oldValue = _.get(object, 'some.long.path');<br>
      if (oldValue) object.some.long.path = transform(oldValue);<br>
    }<br>
<br>
Another use case which C aficianados might recognise:<br>
<br>
    while (const c = getchar()) {<br>
        process(c);<br>
    }<br>
<br>
This syntax is already legal in C++, although not in C - in general this<br>
support is known as "anaphoric if", as it allows the body of the statement to<br>
refer back to the condition value. It's especially helpful in languages with<br>
truthiness, which ECMAScript has, as it allows access to the *specific* truthy<br>
value without further finagling.<br>
<br>
Thoughts?<br>
______________________________<wbr>_________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/<wbr>listinfo/es-discuss</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><span style="color:rgb(136,136,136);font-family:'Droid Sans',arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><div><br></div><div>Dan Peddle</div><div><span style="font-size:x-small"><font color="#333333"><b>tel</b>: +49 157 3918 2066</font></span></div><div><font size="1" color="#333333"><b>email</b>: <a href="mailto:dan@flarework.com" style="color:rgb(103,117,58)" target="_blank">dan@flarework.com</a></font></div><div><font size="1" color="#333333"><b>www</b>: <a href="http://flarework.com/" style="color:rgb(103,117,58)" target="_blank">http://flarework.com</a></font></div><div><font size="1" color="#333333"><b>in</b>: <a href="http://pt.linkedin.com/in/danpeddle" style="color:rgb(103,117,58)" target="_blank">http://pt.linkedin.com/in/danpeddle</a></font></div></span></div></div>
</div>