为..的循环.我应该使用 const 还是 let?



当使用for of loop时,这两种情况都是允许的并且有效:

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

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

如果在上述情况下使用conststr,则会收到错误:

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

即使在经验丰富的开发人员/教程制作者中,for(let i而不是for(const i流行的原因也很简单,他们没有修改循环体中的值并理解 const/let。

许多人将常量视为一个"常数",永远不应该改变。(当然它永远不会改变(。但他们进一步感到尴尬的是"重新定义具有相同名称的多个常量"。例如,在一个地方有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(let,因为它适用于"for 循环"和"迭代列表"。对于其他人来说,这是一个有意识的选择,因为他们不喜欢一遍又一遍地"重新定义一个常量"。

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

我认为 for 内部的常量是不必要的。当变量在 for:

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

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

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

但我更喜欢使用以下语法遍历数组:

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

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

const iterable = [10, 20, 30];
for (let value of iterable) {
value += 1;
console.log(value);
}
// 11
// 21
// 31

相关内容

最新更新