为多个 for 循环重新定义变量,好的还是坏的做法?
Redefining variables for multiple for loops, good or bad practice?
我在工作中主要使用 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);}
这意味着我通常必须做这样的事情来避免来自编译器的警告(以及来自我的上级关于 "bad practice" 的谴责)。
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)}
当您使用 let
定义变量时,该变量在范围内是局部的。
所以当你这样做时
for (let i:number = 0; i < 3; i++) {console.log(i)}
i
被限定在循环 for.
中
在每个循环中声明 i
并不是一个坏习惯。
例如,如果你在两个不同的数组上循环,你可以创建两个循环来迭代它。
如果你为每个使用一个特定的 iteraztor 名称,你可以有这样的代码:
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
而且就性能而言,人类显然无法察觉差异。
根据评论编辑:
What about in a case where the loop iterates tens of thousands of times?
for ([initialization]; [condition]; [final-expression])
initialization
An expression (including assignment expressions) or variable declaration evaluated once before the loop begins. Typically used to initialize a counter variable. This expression may optionally declare new variables with var or let keywords. [...]. Variables declared with let are local to the statement.
所以初始化只计算一次,即使你的循环迭代数万次。
我在工作中主要使用 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);}
这意味着我通常必须做这样的事情来避免来自编译器的警告(以及来自我的上级关于 "bad practice" 的谴责)。
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)}
当您使用 let
定义变量时,该变量在范围内是局部的。
所以当你这样做时
for (let i:number = 0; i < 3; i++) {console.log(i)}
i
被限定在循环 for.
在每个循环中声明 i
并不是一个坏习惯。
例如,如果你在两个不同的数组上循环,你可以创建两个循环来迭代它。
如果你为每个使用一个特定的 iteraztor 名称,你可以有这样的代码:
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
而且就性能而言,人类显然无法察觉差异。
根据评论编辑:
What about in a case where the loop iterates tens of thousands of times?
for ([initialization]; [condition]; [final-expression])
initialization
An expression (including assignment expressions) or variable declaration evaluated once before the loop begins. Typically used to initialize a counter variable. This expression may optionally declare new variables with var or let keywords. [...]. Variables declared with let are local to the statement.
所以初始化只计算一次,即使你的循环迭代数万次。