【问题标题】:Why `const` value changed inside of `for...in` and `for...of` loop?为什么 `for...in` 和 `for...of` 循环中的 `const` 值发生了变化?
【发布时间】:2018-04-06 13:37:20
【问题描述】:

Constants 是块范围的,很像使用 let 语句定义的变量。 constant的值不能通过重新赋值改变,也不能是redeclared。

根据MDNconstant的值不能通过重新赋值来改变,也不能是redeclared,所以在@里面987654328@和for...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);
}

【问题讨论】:

标签: javascript ecmascript-6 constants


【解决方案1】:

循环的每次迭代都有自己的块范围。

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

这创建了 10 个单独的范围,这就是它记录 10 个不同数字的原因。因此,您还可以在这些不同的范围内声明常量。

【讨论】:

  • JavaScript const 是我见过的任何使用类似术语的语言中最少不变的const。它不是 C# 或 C++ 中的编译时常量。
  • @james 是的,js 是一种解释型语言。
  • @Jonas 这不是一个真正的论点;甚至 JS 都有编译步骤,即使没有编译步骤,常量可能是不可变的。
  • @deceze 我认为是。与 C++ / C# 相比,Javascript 是非常动态的,那是因为它是被解释的。编译语言不可能是动态的(没有太多开销)
  • PHP 证明它可以被解释并具有常量。我确信其他语言也是如此。这些属性是不相关的。
【解决方案2】:

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

常量是块范围的

每次您绕过for 循环时,您都会到达一个干净块的顶部。对它做的第一件事就是在其中创建一个常量。

【讨论】:

    【解决方案3】:

    在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]);
    }

    【讨论】:

      猜你喜欢
      • 2018-11-14
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      相关资源
      最近更新 更多