就声明而言,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 对待 constlet 是一样的。我想知道 javascript 运行时是否在引擎盖下同样对待这 2 个版本。这样的结论是即使在循环中使用let 声明了一个变量,它仍然会在每次迭代时重新声明?

【问题讨论】:

是的,letconst 变量的作用域和生命周期是相同的,这通常被认为是一个特性。不要担心“重新声明”是性能问题;这是维护运行时的人的事(他们非常擅长)。 【参考方案1】:

我认为对 temp 使用 let 声明会更好,因为这样变量只会被声明一次。

无论哪种方式,每次循环迭代都会声明一个新版本;这对于解决闭包问题很重要:

const array = [1, 2, 3, 4];
for (const entry of array) 
    setTimeout(() => 
        console.log(entry);
    , 0);

如果没有为每次循环迭代创建新变量,则会记录四次相同的值(可能是 4)。

选择letconst 取决于:

    您希望能够在循环中为其分配一个新值吗?

    您的个人风格偏好(或您团队的偏好)。

我想知道 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 查询出错

python学习笔记

es6 javascript的Iterator 和 for...of 循环

JavaScript for in 和 for of 的区别

JavaScript `of` 关键字(for...of 循环)