34

当使用 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也许有一个我没有看到的缺点?浏览器漏洞?

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

4

4 回答 4

37

为什么使用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}]`);
}

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

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

于 2019-10-21T09:17:01.960 回答
15

有一个简单的原因,即使是经验丰富的开发人员/教程制作者也没有修改循环体中的值并理解 const/let for(let ifor(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++)

于 2020-07-30T17:45:45.687 回答
0

如果在块内重新分配变量,则可以使用 let 而不是 const。

const iterable = [10, 20, 30];

for (let value of iterable) {
  value += 1;
  console.log(value);
}
// 11
// 21
// 31
于 2019-10-21T09:12:46.880 回答
0

I think the const inside the for is not necessary, the const is used when the variable not change inside the for an example.

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

if you must be modify the variable can be used the let

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

But I preferer with the array using this sintax

numbers.forEach(num => {
  console.log(num)
});
于 2019-10-21T09:16:01.187 回答