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

问题描述 投票:0回答:5

当使用 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
循环中使用
let
以及何时使用
for...of

javascript ecmascript-6 for-of-loop
5个回答
62
投票

为什么在

const
循环中使用
let
以及何时使用
for...of

如果循环体中没有对标识符进行赋值,则使用

let
还是
const
都是风格问题。

如果您希望循环体内的标识符是只读的,请使用

const
(例如,如果有人稍后修改代码以添加分配,则这是一个主动错误)。如果您希望能够对其进行赋值,请使用
let
(因为您的代码中有一个赋值,或者您希望其他人能够在不更改声明的情况下添加一个赋值)。

您可以使用

for-of
for-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}]`);
}


53
投票

即使是经验丰富的开发人员/教程制作者也不会修改循环体中的值并了解 const/let,因此普遍使用

for(let i
而不是
for(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
可能是完全不同的值。即使你“知道”你正在“为每次循环重新定义它”,对于一些开发人员来说,这本身就是有问题的。

因此,许多开发人员更喜欢在 JavaScript 中保留

const
来表示“定义一次并在整个‘程序的整个执行’或至少是‘类中的所有内容’中表示单个值的值。

因此,您的“标题”中问题的答案(我应该使用)可能是“继续使用 const,因为您有理由并且它对您有意义”。你对“为什么 for(让 i 如此常见”) 的疑问的答案也是我在这里回答的。对于某些人来说,他们只是有

for(let
的习惯,因为它适用于“for 循环”和“迭代”对于其他人来说,这是一个有意识的选择,因为他们不喜欢一遍又一遍地“重新定义 const”。

我谦虚地建议,如果您确实使用

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

0
投票

如果在块内重新分配变量,可以使用 let 代替 const。

const iterable = [10, 20, 30];

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

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)
});

0
投票

firefox 51 之前的版本中存在一个错误,即使用

for...of
const
会引发语法错误

如果支持这些较旧的浏览器对您很重要,请始终将

for...of
let
一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.