for of loop in Javascript中的let和const在声明方面没有区别吗?
Is there no difference between let and const inside for of loop in Javascript in terms of declaration?
我最近遇到了这段代码:
for (const temp of [1,2]) {
// do something
}
我认为对 temp
使用 let
声明会更好,因为这样变量只会被声明一次。但是,我也 运行 这个例子以及 let
通过 babel 的版本,这就是我看到的:
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 运行时是否在幕后以相同方式对待这两个版本。结论是即使在循环内用 let
声明变量,它仍会在每次迭代时重新声明?
I thought that it'd be better to use let declaration for temp because this way the variable would be declared only once.
无论哪种方式,都会为每个循环迭代声明一个新版本;这对于解决循环闭包问题很重要:
const array = [1, 2, 3, 4];
for (const entry of array) {
setTimeout(() => {
console.log(entry);
}, 0);
}
如果没有为每个循环迭代创建新变量,那将记录相同的值(可能是 4)四次。
选择 let
或 const
归结为:
您希望能够在循环中为其分配一个新值吗?
您的个人风格偏好(或您团队的偏好)。
I'm wondering if Javascript runtime treats the 2 versions identically under the hood.
是的,除此之外,您可以根据需要在循环内为 let
变量分配一个新值。¹ 例如:
const strings = ["a", "b", "c"];
for (let str of strings) {
str = str.toUpperCase();
console.log(str);
}
例如,唯一的区别是变量是否可变。
¹ 为避免疑义:赋值给它所做的只是更改该变量的值。它对值来自的 array/iterable 没有影响。
我最近遇到了这段代码:
for (const temp of [1,2]) {
// do something
}
我认为对 temp
使用 let
声明会更好,因为这样变量只会被声明一次。但是,我也 运行 这个例子以及 let
通过 babel 的版本,这就是我看到的:
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 运行时是否在幕后以相同方式对待这两个版本。结论是即使在循环内用 let
声明变量,它仍会在每次迭代时重新声明?
I thought that it'd be better to use let declaration for temp because this way the variable would be declared only once.
无论哪种方式,都会为每个循环迭代声明一个新版本;这对于解决循环闭包问题很重要:
const array = [1, 2, 3, 4];
for (const entry of array) {
setTimeout(() => {
console.log(entry);
}, 0);
}
如果没有为每个循环迭代创建新变量,那将记录相同的值(可能是 4)四次。
选择 let
或 const
归结为:
您希望能够在循环中为其分配一个新值吗?
您的个人风格偏好(或您团队的偏好)。
I'm wondering if Javascript runtime treats the 2 versions identically under the hood.
是的,除此之外,您可以根据需要在循环内为 let
变量分配一个新值。¹ 例如:
const strings = ["a", "b", "c"];
for (let str of strings) {
str = str.toUpperCase();
console.log(str);
}
例如,唯一的区别是变量是否可变。
¹ 为避免疑义:赋值给它所做的只是更改该变量的值。它对值来自的 array/iterable 没有影响。