就声明而言,Javascript for of 循环中的 let 和 const 之间没有区别吗?
Posted
技术标签:
【中文标题】就声明而言,Javascript for of 循环中的 let 和 const 之间没有区别吗?【英文标题】:Is there no difference between let and const inside for of loop in Javascript in terms of declaration? 【发布时间】:2020-01-25 20:24:28 【问题描述】:我最近遇到了这段代码:
for (const temp of [1,2])
// do something
我认为对temp
使用let
声明会更好,因为这样变量只会被声明一次。但是,我也通过 babel 运行了这个示例以及带有 let
的版本,这就是我所看到的:
for (const p of [1,2])
for (let s of [1,2])
成为:
for (var _i = 0, _arr = [1, 2]; _i < _arr.length; _i++)
var p = _arr[_i];
for (var _i2 = 0, _arr2 = [1, 2]; _i2 < _arr2.length; _i2++)
var s = _arr2[_i2];
所以 babel 对待 const
和 let
是一样的。我想知道 javascript 运行时是否在引擎盖下同样对待这 2 个版本。这样的结论是即使在循环中使用let
声明了一个变量,它仍然会在每次迭代时重新声明?
【问题讨论】:
是的,let
和const
变量的作用域和生命周期是相同的,这通常被认为是一个特性。不要担心“重新声明”是性能问题;这是维护运行时的人的事(他们非常擅长)。
【参考方案1】:
我认为对 temp 使用 let 声明会更好,因为这样变量只会被声明一次。
无论哪种方式,每次循环迭代都会声明一个新版本;这对于解决闭包问题很重要:
const array = [1, 2, 3, 4];
for (const entry of array)
setTimeout(() =>
console.log(entry);
, 0);
如果没有为每次循环迭代创建新变量,则会记录四次相同的值(可能是 4)。
选择let
或const
取决于:
您希望能够在循环中为其分配一个新值吗?
您的个人风格偏好(或您团队的偏好)。
我想知道 Javascript 运行时是否在后台同等对待这 2 个版本。
是的,除此之外,如果您愿意,您可以在循环中为 let
变量分配一个新值。¹例如:
const strings = ["a", "b", "c"];
for (let str of strings)
str = str.toUpperCase();
console.log(str);
例如,唯一的区别是变量是否可变。
¹ 为免生疑问:分配给它的所有操作都是更改该变量的值。它对值来自的数组/可迭代对象没有影响。
【讨论】:
以上是关于就声明而言,Javascript for of 循环中的 let 和 const 之间没有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章
带有游标参数 (LOOP FETCH) 和 For 循环子查询的 PL/SQL 查询出错
es6 javascript的Iterator 和 for...of 循环