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

时间:2019-10-21 09:09:27

标签: javascript ecmascript-6 for-of-loop

使用for for循环时,这两个选项均允许并起作用:

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循环时,通常会使用{{1} }。也许let有一个我没有看到的缺点?浏览器错误?

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

4 个答案:

答案 0 :(得分:3)

在没有修改循环体中的值并了解const / let的即使是经验丰富的开发人员/教程制造商中,for(let i而不是for(const i的普遍原因也很简单。

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

循环中的变量(至少在JavaScript基于的大多数类似C的语法语言中)是更改MOST的变量。在所有for循环中,没有什么比它的i值变化多的了。 “ i”通常最终是CPU本身(而不是RAM)中的“寄存器变量”,因此它可以“更快地更改”。自从它以'var'开始以来,在JavaScript中甚至都是如此,当您执行简单的for(let i=0;i<50;i++)时仍然如此。即for(const i=0;i<50;i++)会引发错误。

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

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

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

我会谦虚地建议,如果您确实使用const,请不要在{item”中使用i,因为i与一个递增的整数变量相关联。至少如果您使用诸如item之类的好名字,将其视为仅存在一次的单个事物会更舒服。我谦虚地建议,如果您使用'let',出于相同的原因,也不要使用let i ofi仅用于实际增加的项目。即使用for(让项目项)或for(让i = 0; i

答案 1 :(得分:2)

  

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

如果循环主体中没有分配给标识符,则基本上使用样式是使用let还是const

如果希望循环主体中的标识符为只读,请使用const(例如,如果有人稍后修改代码以添加分配,则在严格模式下这是一个主动错误)。如果要分配给let,请使用for-of(因为您的代码中有分配,或者希望某人以后可以添加一个而不更改声明)。

您可以使用for-infor循环来做到这一点。 for循环的控制变量不能为常量,因为它在"use strict"; for (let str of ["a", " b", " c "]) { str = str.trim(); // ^^^^^----- assignment to the identifier console.log(`[${str}]`); }循环的“ update”子句中进行了修改。


为清楚起见,这是一个在循环体内分配的示例:

const

如果在以上str中使用"use strict"; for (const str of ["a", " b", " c "]) { str = str.trim(); // ^^^^^----- Error console.log(`[${str}]`); },则会出现错误:

-E

答案 2 :(得分:0)

答案 3 :(得分:0)

我认为for内的const不是必需的,例如,当变量在for内不变时使用const。

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

如果必须修改变量,可以使用let

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

但是我更喜欢使用此正弦波的数组

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