为啥 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);
这会记录a
和b
,但如果您将const
更改为var
,则会记录两次b
。
【讨论】:
对。但是当谈到let
vs const
(不是var
)时,这里没有区别,对吧?
@KonradViltersten 在这种情况下没有区别。
但如果没有 setTimeout,这与 var 一起工作! : for (var property in a: 1, b: 2) console.log(property); ;结果是 "a" "b" ??
@PhilippeOceangermanique 因为该值在更改之前立即被记录。使用setTimeout
和var
,它会在循环完成后运行,因此每个console.log(property)
都会访问名为property
的单个 变量,该变量在循环完成后具有b
的值。对于let
或const
,有多个不同的变量称为property
,每个变量都在一个单独的范围内,每次迭代都有一个范围。【参考方案2】:
在您的第一个示例中,i
是通过 i++
修改的。 const
不能修改,所以会出错。
在第二个示例中,property
为for
循环的每次迭代重新定义(每个实例超出范围并创建一个新实例,而不仅仅是重新分配给同一个变量)。由于您实际上是在重新定义而不是修改值,所以 const
工作得很好。
【讨论】:
所以,基本上,在这种特殊情况中,const
和let
之间没有区别,对吧?
@KonradViltersten - 除了let
允许您在for
循环内修改property
而const
不应该。
哦,对了!所以实际上这里最好使用const
,那么。我从不想要/需要更改属性名称的值。酷!以上是关于为啥 const 在 JavaScript 的某些 for 循环中起作用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥许多javascript示例仍然使用'var'而不是'const'和'let'? [关闭]
为啥我不能将 const 左值引用绑定到返回 T&& 的函数?