为啥 const 在 JavaScript 的某些 for 循环中起作用?

Posted

技术标签:

【中文标题】为啥 const 在 JavaScript 的某些 for 循环中起作用?【英文标题】:Why does const work in some for-loops in JavaScript?为什么 const 在 JavaScript 的某些 for 循环中起作用? 【发布时间】:2017-04-25 08:48:57 【问题描述】:

知道为什么 const 在 for 循环中不起作用。我们需要创建一个新范围并将一个值复制到其中。所以这不会飞。

for(const i = 0; i < 5; i++) console.log(i);

而这会。

for(let i = 0; i < 5; i++) console.log(i);

但是,我注意到它们在循环这样的对象的属性时都可以工作。

for(let property in thingy) console.log(property);
for(const property in thingy) console.log(property);

我不知道为什么。

【问题讨论】:

【参考方案1】:

for (const property in object) 之所以有效,是因为每次迭代都会获得一个新变量,该变量仅适用于该迭代。您可以通过在循环中使用闭包轻松检查:

for (const property in a: 1, b: 2) 
  setTimeout(() => 
    console.log(property);
  , 100);

这会记录ab,但如果您将const 更改为var,则会记录两次b

【讨论】:

对。但是当谈到let vs const(不是var)时,这里没有区别,对吧? @KonradViltersten 在这种情况下没有区别。 但如果没有 setTimeout,这与 var 一起工作! : for (var property in a: 1, b: 2) console.log(property); ;结果是 "a" "b" ?? @PhilippeOceangermanique 因为该值在更改之前立即被记录。使用setTimeoutvar,它会在循环完成后运行,因此每个console.log(property) 都会访问名为property单个 变量,该变量在循环完成后具有b 的值。对于letconst,有多个不同的变量称为property,每个变量都在一个单独的范围内,每次迭代都有一个范围。【参考方案2】:

在您的第一个示例中,i 是通过 i++ 修改的。 const 不能修改,所以会出错。

在第二个示例中,propertyfor 循环的每次迭代重新定义(每个实例超出范围并创建一个新实例,而不仅仅是重新分配给同一个变量)。由于您实际上是在重新定义而不是修改值,所以 const 工作得很好。

【讨论】:

所以,基本上,在这种特殊情况中,constlet 之间没有区别,对吧? @KonradViltersten - 除了let 允许您在for 循环内修改propertyconst 不应该。 哦,对了!所以实际上这里最好使用const,那么。我从不想要/需要更改属性名称的值。酷!

以上是关于为啥 const 在 JavaScript 的某些 for 循环中起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥许多javascript示例仍然使用'var'而不是'const'和'let'? [关闭]

为啥我不能将 const 左值引用绑定到返回 T&& 的函数?

编写高质量javascript代码(1-10)

ES6学习笔记之let/const

为啥我们不能在 TypeScript 类中定义一个 const 字段,为啥静态只读不起作用?

为啥允许在这里用非 const 初始化静态变量?