22

I do know why const doesn't work in for-loops. We need to create a new scope and copy over a value into that. So this won't fly.

for(const i = 0; i < 5; i++) console.log(i);

Whereas this will.

for(let i = 0; i < 5; i++) console.log(i);

However, I noticed that both of them work when looping though the properties of an object like this.

for(let property in thingy) console.log(property);
for(const property in thingy) console.log(property);

I'm not sure why.

Konrad Viltersten
  • 36,151
  • 76
  • 250
  • 438

2 Answers2

27

for (const property in object) works because with each iteration you get a new variable, which is scoped only to that iteration. You can easily check that by using a closure inside a loop:

for (const property in {a: 1, b: 2}) {
  setTimeout(() => {
    console.log(property);
  }, 100);
}

This logs a and b, but if you change const to var, it logs b twice.

Michał Perłakowski
  • 88,409
  • 26
  • 156
  • 177
  • Right. But when it comes to `let` vs `const` (not `var`), there's no difference here, right? – Konrad Viltersten Dec 09 '16 at 19:54
  • @KonradViltersten In this case there's no difference. – Michał Perłakowski Dec 09 '16 at 19:55
  • but if there is no setTimeout, this work with var !! : for (var property in {a: 1, b: 2}) {console.log(property);} ; result is "a" "b" ?? – oceanGermanique Aug 20 '20 at 10:51
  • 2
    @PhilippeOceangermanique because the value is logged immediately before it can change. With a `setTimeout` and a `var` it runs after the loop has finished and so each `console.log(property)` accesses *the single* variable called `property` which has the value `b` after the loop finished. With a `let` or `const` there are multiple different variables called `property` where each is in a separate scope and there is one scope per iteration. – VLAZ Jan 07 '21 at 08:20
21

In your first example, i is modified via the i++. A const can't be modified, so you get an error.

In the second example, property is re-defined for each iteration (each instance falls out of scope and a new one created rather than just re-assigning to the same variable) of the for loop. Since you're actually re-defining rather than modifying the value, const works just fine.

Justin Niessner
  • 242,243
  • 40
  • 408
  • 536