为多个 for 循环重新定义变量,好还是坏的做法?

Posted

技术标签:

【中文标题】为多个 for 循环重新定义变量,好还是坏的做法?【英文标题】:Redefining variables for multiple for loops, good or bad practice? 【发布时间】:2020-01-18 03:29:51 【问题描述】:

我主要在工作中使用 AS3 进行编程,其中最低范围是函数而不是执行块。这意味着以下代码可以正常工作

for (var i:int = 0; i < 3; i++) trace(i);

但此代码会导致警告,因为显然 i 正在被重新定义。

for (var i:int = 0; i < 3; i++) trace(i);
for (var i:int = 0; i < 3; i++) trace(i);

这意味着我通常必须做这样的事情来避免编译器的警告(以及我的上级关于“不良做法”的谴责)。

var i:int;
for (i = 0; i < 3; i++) trace(i);
for (i = 0; i < 3; i++) trace(i);

我最近一直在尝试使用 TypeScript,我发现用于定义执行块作用域的 let 概念非常实用。我与一位同事讨论过这个问题,他坚持认为在循环中使用 let 是不好的做法,因为变量在每个循环中都会重新定义。

TypeScript 中以下两种方法在性能方面是否存在根本差异?

for (let i:number = 0; i < 3; i++) console.log(i)
for (let i:number = 0; i < 3; i++) console.log(i)

let i:number
for (i = 0; i < 3; i++) console.log(i)
for (i = 0; i < 3; i++) console.log(i)

【问题讨论】:

注意,typescript 中不存在int 类型,它是number 好点,我会进行编辑。我的大脑仍处于 ActionScript 模式。 【参考方案1】:

当您使用let 定义变量时,该变量是作用域的本地变量。

所以当你这样做时

for (let i:number = 0; i < 3; i++) console.log(i)

i 被限定在 for 循环中。

在每个循环中声明i 并不是一个坏习惯。

例如,如果你在两个不同的数组上循环,你可以创建两个循环来迭代它。

如果您为每个使用特定的迭代器名称,您可以使用如下代码:

 const arrFoo: Array<number> = [0, 1, 2];
 const arrBar: Array<number> = [0, 1, 2];
 for (let iteratorFoo:number = 0; iteratorFoo < arrFoo.length; i++) console.log(iteratorFoo);
 for (let iteratorBar:number = 0; iteratorBar < arrBar.length; i++) console.log(iteratorBar);

在这种情况下,最好声明两个不同的迭代器。


除非你在每个循环中使用相同的i

喜欢:

let i:number
for (i = 0; i < 3; i++) console.log(i) // show 0, 1, 2
for (; i < 6; i++) console.log(i) // show 3, 4, 5

而就性能而言,这种差异显然对人类来说是不明显的。


根据评论编辑:

如果循环迭代数万次怎么办?

for ([initialization]; [condition]; [final-expression])

initialization 在循环开始之前计算一次的表达式(包括赋值表达式)或变量声明。通常用于初始化计数器变量。此表达式可以选择使用 var 或 let 关键字声明新变量。 [...]。用 let 声明的变量是语句的局部变量。

Reference

所以初始化被评估一次,即使你的循环迭代了数万次。

【讨论】:

循环迭代上万次怎么办?

以上是关于为多个 for 循环重新定义变量,好还是坏的做法?的主要内容,如果未能解决你的问题,请参考以下文章

在抽象类中公开静态方法被认为是好还是坏的做法[关闭]

在多个 for 循环中使用相同的变量名是不好的做法吗?

for循环变量声明为 final

Python for循环内变量自增为啥没有效果?

好的做法还是坏的做法?在 getter 中初始化对象

混合 Angular Material 和 Bootstrap。好的做法还是坏的做法?