当使用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
,何时在for...of
循环中使用let
?
4条答案
按热度按时间yxyvkwin1#
为什么要使用
const
,何时在for...of
循环中使用let
?如果循环体中的标识符没有赋值,那么使用
let
还是const
就是一个风格问题。如果希望循环体中的标识符是只读的,则使用
const
(这样,例如,如果有人稍后修改代码添加赋值,则这是一个主动错误);如果希望能够对其进行赋值,则使用let
(因为您的代码中有赋值,或者您希望有人稍后能够添加一个赋值,而无需更改声明)。你可以在
for-of
和for-in
循环中做到这一点。for
循环的控制变量通常不是常量(因为在正常情况下,你在for
的“update”子句中更新它;如果不这样做,for
可能是错误的循环),所以通常使用let
。为了清楚起见,下面是一个在循环体中进行赋值的示例:
如果您在上面的代码中使用
const
作为str
,则会出现错误:0vvn1miw2#
for(let i
而不是for(const i
在有经验的开发者/教程制作者中流行的原因很简单,他们没有修改循环体中的值,并且理解const/let。许多人认为const是一个永远不应该改变的'常量'。永远。(当然它永远不会改变)。但是他们进一步感到尴尬的是'重新定义多个同名的常量'。例如,在一个地方有
const server = 'fun.example.com'
,而在另一个地方有const server = 'boring.example.com'
将是'objectionable'。循环中的变量(至少在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
在每次“通过循环”时可能是完全不同的值。即使你“知道”你是在“为每次通过循环重新定义它”,对一些开发人员来说,这本身就值得怀疑。出于这个原因,许多开发人员更喜欢在JavaScript中保留
const
,用于定义一次的值,并在整个程序执行过程中表示单个值,或者至少是类中的所有内容。所以你“头衔”里问题的答案(我应该使用)可能是“继续使用const,因为你有一个理由,它对你有意义”。对于你所怀疑的“为什么是for(让我这么常见)”,我在这里也给出了答案。对一些人来说,他们只是习惯使用
for(let
,因为它对“for循环”和“通过列表迭代”都有效。对另一些人来说,这是一个有意识的选择,因为他们不喜欢一遍又一遍地“重新定义常量”。我建议如果你使用
const
,请不要用i
来表示“item”,因为i与一个递增的整型变量联系在一起。至少如果你使用一个像item这样的好名字,把它当作一个只存在过一次的单一事物会感觉更舒服。我建议如果你使用“let”,也不要用“t出于同样的原因使用let i of
。i
仅用于实际递增的项目。即用于(让项目的项目)或用于(让i=0;i〈y;i++)u4vypkhs3#
You can use let instead of const if you reassign the variable inside the block.
xu3bshqb4#
我认为for中的const是不必要的,当变量在for中不发生变化时就使用const:
如果必须修改变量,可以使用let:
但我更喜欢使用以下语法迭代数组: