javascript for...of循环,我应该用const还是let?

mwg9r5ms  于 2023-02-21  发布在  Java
关注(0)|答案(4)|浏览(237)

当使用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

yxyvkwin

yxyvkwin1#

为什么要使用const,何时在for...of循环中使用let
如果循环体中的标识符没有赋值,那么使用let还是const就是一个风格问题。
如果希望循环体中的标识符是只读的,则使用const(这样,例如,如果有人稍后修改代码添加赋值,则这是一个主动错误);如果希望能够对其进行赋值,则使用let(因为您的代码中有赋值,或者您希望有人稍后能够添加一个赋值,而无需更改声明)。
你可以在for-offor-in循环中做到这一点。for循环的控制变量通常不是常量(因为在正常情况下,你在for的“update”子句中更新它;如果不这样做,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}]`);
}
0vvn1miw

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 ofi仅用于实际递增的项目。即用于(让项目的项目)或用于(让i=0;i〈y;i++)

u4vypkhs

u4vypkhs3#

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
xu3bshqb

xu3bshqb4#

我认为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)
});

相关问题