loading...

re: Declaring JS Variables in 2019 VIEW POST

TOP OF THREAD FULL DISCUSSION
re: Since I've switched to using const, I find that I almost never use let. In fact, the rarity of let makes it stand out in the code when it is used; ...

I'm glad to hear you're on the same page as me! I like the shining beacon analogy.

For me, both those examples often warrant extracting behavior to some helper function, but I understand how you're using them there, too.

That sounds like a solid approach. I’m surprised that const works fine in (the header of) for-of statements but not in for.

Yeah, the difference seems to be that in a for ... of loop like this:

for (const thing of myThings) { /*...*/ }

you're essentially grabbing an iterator at the start of the loop, i.e. myThingsIter = myThings[Symbol.iterator](), then at the beginning of each loop running const thing = myThingsIter.next(). It seems to desugar to something like this:

const myThingsIter = myThings[Symbol.iterator]()
while (true){
  const {done, value: thing} = myThingsIter.next();
  if (done) break;

  /* ... */
}

You're always assigning a whole new value to the loop variable as opposed to modifying the loop variable as is typical in a classic for (let i=0; i<n; i++) loop.

Really the only reason you need a let in that loop is because you're reassigning the value with i++, equivalent to i = i+. In theory you can use a const if you're doing something super unusual, like using an object as your loop variable and modifying a property of it:

for (const o = {count: 0}; o.count < n; o.count++) {
    /* ... */
}

I don't know why anyone would ever want something like this, and there would undoubtedly be cleaner ways to write the code, but it works. You're never reassigning o, so no problem with it being a const.

code of conduct - report abuse