为什么在“for...in”和“for...of”循环中,常量值会发生改变?

11

常量与使用 let 语句定义的变量类似,都是块级作用域。 常量 的值不能通过重新赋值更改,并且不能被 重新声明

根据 MDN 的解释,常量的值不能通过重新赋值更改,并且不能被重新声明。那么在 for...infor...of 循环中,常量是如何使用的呢?

const data = ['A', 'B', 'C', 'D'];

//Here const key is changed
for (const key in data) {
  console.log('key ',key);
}

//Here const value is changed
for (const value of data) {
  console.log('value ',value);
}


3个回答

9

循环的每一次迭代都有自己的块级作用域。

 for(let i = 0; i < 10; i++)
   setTimeout(() => console.log(i), 1);

这会创建10个不同的作用域,这就是为什么它会记录10个不同的数字。因此,您也可以在这些不同的作用域中声明常量。


JavaScript的const是我见过使用类似术语的任何语言中最不常量的const。它不像C#或C++中的编译时常量那样是一个编译时常量。 - JamesFaix
@james 是的,JavaScript 是一种解释型语言。 - Jonas Wilms
1
@Jonas 这并不是一个真正的论点;即使是JS也有编译步骤,即使没有编译步骤,常量也可以是不可变的。 - deceze
1
@deceze 我认为是这样的。与C++ / C#相比,Javascript非常动态,这是因为它是解释性语言。编译型语言不能那么动态(没有太多开销的情况下)。 - Jonas Wilms
2
PHP证明了它可以被解释并具有恒定常量。我相信其他语言也可以做到。这些属性是不相关的。 - deceze

5

你引用的材料的前三个单词解释了一切。

常量是块级作用域

每次执行 for 循环,都会进入一个干净的块顶部。首先要做的是在其中创建一个常量。


4
for-of-loop 中,这些常量在每次迭代时被声明(在独立的作用域中),而在 for-loop 中,您正在重复使用变量,因此在声明后无法重新分配值。 for-loop 的示例:

const data = ['A', 'B', 'C', 'D'];

for (const i = 0; i < data.length; i++) {
  console.log('value ',data[i]);
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接