javascriptvariablesfor-of-loop

`let` vs. `const` vs. nothing in a for–of loop


What is the difference in doing the following three constructions in JavaScript:

let dd = [ 1, 2, 3, 4, 5 ];

for(const item of dd) console.log(item);
for(let   item of dd) console.log(item);
for(      item of dd) console.log(item);

It seems they all produce the exact same results so wondering if there are some subtle differences between them, especially when neither let nor const is there, specifically in the context for a forof loop.


Solution

  • Here are some examples that demonstrate the difference:

    let dd = [1, 2, 3, 4, 5]
    
    // identically-named variable in the outer scope
    let item = -1
    
    for (const item of dd) {
        console.log(item) // ok
        // console.log(++item) // can't re-assign - will throw if uncommented
    }
    
    console.log(item) // still -1, as `const` is block-scoped
    
    for (let item of dd) {
        console.log(item) // ok
        console.log(++item) // it's fine to re-assign 🎵
    }
    
    console.log(item) // still -1, as `let` is block-scoped
    
    for (item of dd) {}
    
    console.log(item) // 5, as we've now re-assigned the variable in the outer scope
    // due to not using `const` or `let`