for...of loop. Should I use const or let?

Tom*_*ica 26 javascript ecmascript-6 for-of-loop

When using a for of loop, both of these are allowed and work:

const numbers = [1,2,3];
// works
for(let number of numbers) {
    console.log(number);
}
// also works
for(const number of numbers) {
    console.log(number);
}
Run Code Online (Sandbox Code Playgroud)

I always use const since I annot fanthom changing the number variable in any context, but when I see a for...of loop in other people's code, it often uses let. Maybe there's a drawback to const that I didn't see? Browser bugs?

为什么在循环中使用const以及何时使用?letfor...of

T.J*_*der 27

为什么在循环中使用const以及何时使用?letfor...of

如果循环体内的标识符没有赋值,则基本上是使用let或的样式问题const

使用const,如果你想在循环体中的标识符为只读(这样,例如,如果有人修改了代码后添加一个任务,这是一个积极的误差)。使用let,如果你希望能够分配给它(因为你在你的代码有一个任务,或者你希望有人能够在以后添加一个没有改变的声明)。

你可以用for-offor-in循环来做到这一点。一个for循环的控制变量通常不是恒定的(因为在正常情况下,你的“更新”子句中更新for;如果你不这样做,for可能是错误的循环中使用),所以您通常使用let它。


为清楚起见,这是一个在循环体中进行赋值的示例:

for (let str of ["a", " b", " c "]) {
    str = str.trim();
//  ^^^^^----- assignment to the identifier
    console.log(`[${str}]`);
}
Run Code Online (Sandbox Code Playgroud)

如果你在上面使用constfor str,你会得到一个错误:

for (const str of ["a", " b", " c "]) {
    str = str.trim();
//  ^^^^^----- Error
    console.log(`[${str}]`);
}
Run Code Online (Sandbox Code Playgroud)

  • 我会争论“完全是风格问题”部分。`const` 提供额外的保护。我已经看到很多次为了显示目的而修改循环变量,但下面的代码仍然依赖于原始值。 (3认同)
  • @Craig - 在大多数情况下,您不能在“for”循环中使用“const”(尽管在某些情况下可以),因为循环的“增量”部分。例如,在“for (let i = 0; i < 10; ++i)”中,在迭代和测试之后,在执行“++i”部分时,引擎会为新迭代创建新的“i”,为其分配旧“i”的值,然后执行增量部分:“++i”,这会修改新的“i”。因此,您只能在控制变量不会改变的“for”中使用“const”,例如“for (const x = start(); !x.done(); x.next()) { console.log(const)”。日志(x.current()); }` *(续)* (2认同)
  • ...这足够不寻常,也足够小,以至于我怀疑它是否是引擎实施者的优化目标。作为一种习惯,我确实将“const”与“for-in”和“for-of”循环一起使用,因为我几乎不想修改块内的每次迭代变量,我怀疑(但不*知道*)如果您在循环体内创建函数可能会有一些好处。不过,正如你所说,如果有的话,我怀疑这些好处是否显着。:-) (2认同)

Awo*_*ing 10

有一个简单的理由的患病率for(let i,而不是for(const i即使是有经验的开发者/教程厂商谁没有在循环体内修改的价值和了解常量/让之一。

许多人将 const 视为永远不会改变的“常量”。曾经。(当然它永远不会改变)。但他们进一步感到尴尬“重新定义多个具有相同名称的常量”。例如, const server = 'fun.example.com'在一个地方拥有,const server = 'boring.example.com'在另一个地方拥有将是“令人反感的”。

循环中的变量(至少在 JavaScript 所基于的大多数类 C 语法语言中)是变化最大的变量。在所有 for 循环中,没有什么比 'i' 更能改变它的值了。“i”通常最终成为 CPU 本身(不在 RAM 中)上的“寄存器变量”,以便它可以“更快地改变”。这在 JavaScript 中甚至是正确的,因为它是从 'var' 开始的,当你执行一个简单的for(let i=0;i<50;i++). 即for(const i=0;i<50;i++)抛出错误。

因此,当您遍历列表时,您可以开始看到每秒可能更改(或重新定义)数千次的“i”与for(const i. 所以for(const i...“看起来”或“感觉”i只会有它被分配的第一个值。这似乎是“错误的”,const i..在下一行代码中,i每次“通过循环”可能是完全不同的值。即使您“知道”您正在“为循环中的每次运行重新定义它”,对于某些开发人员来说,这本身也是有问题的。

出于这个原因,许多开发人员更喜欢const在 JavaScript 中保留“定义一次并在整个“程序的整个执行过程”或至少“类中的所有内容”中代表单个值的值。

因此,您的“标题”(我应该使用)中问题的答案可能是“继续使用 const,因为您有理由并且这对您有意义”。您对“为什么是 for(让我如此普遍”)的疑问的答案也是我在这里回答的。对于某些人来说,他们只是习惯了,for(let因为它适用于“for 循环”和“遍历列表” . 对于其他人来说,这是一个有意识的选择,因为他们不喜欢一遍又一遍地“重新定义常量”。

我谦虚地建议,如果您确实使用,const请不要使用i“项目”,因为 i 与递增的整数变量如此相关。至少,如果你使用像 item 这样的好名字,将它视为只存在一次的单一事物会感觉更舒服。我谦虚地建议,如果您使用“让”也不要let i of出于同样的原因使用。使用i只为实际增加的项目。即使用 for(let item of items) 或 for(let i=0;i<y;i++)

  • 这应该是公认的答案。它直接回答问题,而不是解释“const”和“let”之间的区别,而提问者显然已经理解了这一点。 (9认同)
  • @AwokeKnowing 这与我的经验不符,无论是来自 JS/TS 还是其他语言。你可能需要做一些更多的函数式编程来理解心态,但这绝对不是为了“炫耀”,而是为了传达意图。人们使用 `const` 是因为 `let` 不会“一样好”,它会更糟。 (6认同)
  • 这可能确实是原因,但推理毫无意义。当调用函数或创建类时,创建多个具有相同名称的变量总是会发生。人们会避免在函数作用域中使用“const”声明吗?不。 (4认同)