for...of 循环。我应该使用 const 还是 let?

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

当使用 for of 循环时,这两种方法都是允许的并且有效:

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

我总是使用 const 因为我无法理解在任何上下文中更改 number 变量,但是当我在其他人的代码中看到 for...of 循环时,它经常使用 let。也许 const 有一个我没有看到的缺点?浏览器错误?

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

You can use let instead of const if you reassign the variable inside the block.

const iterable = [10, 20, 30];

for (let value of iterable) {
  value += 1;
  console.log(value);
}
// 11
// 21
// 31

我觉得for里面的const不是必须的,const是在for里面的变量不变的时候用的例子

let tmp = 0;
for(const num of numbers){
 tmp += num;
}

如果一定要修改变量可以使用let

for(let num of numbers){
 num += 5;
}

但我更喜欢使用此语法的数组

numbers.forEach(num => {
  console.log(num)
});

Why use const and when to use let in for...of loops?

如果循环体内没有对标识符的赋值,那么使用 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}]`);
}

如果你在上面用const代替str,你会得到一个错误:

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

for(let i 而不是 for(const i 的流行有一个简单的原因,即使是有经验的 devs/tutorial 制造商也不会修改循环体中的值并且理解 const/let.

许多人将 const 视为 'constant',永远不应该改变。曾经。 (当然它永远不会改变)。但他们进一步感到尴尬'redefining multiple constants with the same name'。例如,在一个地方有 const server = 'fun.example.com',在另一个地方有 const server = 'boring.example.com' 将是 'objectionable'.

循环中的变量(至少在 JavaScript 所基于的大多数类 C 语法语言中)是变化最多的变量。在所有 for 循环中,没有什么比 'i' 更能改变它的价值了。 'i' 通常最终成为 CPU 本身(不在 RAM 中)的 'register variable',因此它可以 'change faster'。这在 JavaScript 中甚至是正确的,因为它是从 'var' 开始的,并且当您执行简单的 for(let i=0;i<50;i++) 时仍然如此。即 for(const i=0;i<50;i++) 抛出错误。

因此,您可以开始看到 'i' 和 for(const i 之间的不协调,后者在您遍历列表时可能每秒更改(或重新定义)数千次。所以 for(const i... 'looks' 或 'feels' 像 i 将永远只有分配给它的第一个值。似乎 'wrong' 说 const i.. 并且在下一行代码中,i 每次 'through the loop' 可能是完全不同的值。即使你 'know' 你是 'redefining it for each run through the loop',对一些开发者来说,这本身就是有问题的。

出于这个原因,许多开发者更喜欢在 JavaScript 中保留 const 用于定义一次并代表整个 'whole execution of the program' 或至少 'everything in a class'.

所以你 'title' 中问题的答案(我应该使用)可能是 'keep using const since you have a reason and it makes sense to you'。我在这里也回答了您对“为什么(让我如此常见)”的疑问的答案。对于某些人来说,他们只是养成 for(let 的习惯,因为它对 'for loops' 都有效和 'iterations through list'。对于其他人来说,这是一个有意识的选择,因为他们不喜欢一遍又一遍地 'redefining a const'。

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