为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我不能在地图对象上使用 for in 循环

为什么我不能在地图对象上使用 for in 循环

九州编程 2023-09-14 17:51:03
为了我自己的利益,我正在浏览 Javascript 中的每个内置结构化对象,特别是我正在尝试每个基本的“for”循环,以便我了解什么在哪里工作。就 Map 而言,我注意到 for/in 循环是静默的。我希望它返回映射中每个条目的键值。let map = new Map([[1, 1], ["two", "two"]]);map.set("three", 3); // Instead of addconsole.log(`map has three = ${map.has("three")}`);console.log(`map has size ${map.size}`);// no 'for loop' because map uses keys instead of index numbersfor (let key in map) console.log(`for key ${key} in map ${map}`); // <<< This does not return??for (let value of map) console.log(`for ${value} of ${map}`); map.forEach((value, key, localScopeCopyOfMap) => console.log(`forEach value ${value} in map ${[...localScopeCopyOfMap]}`));为什么这不返回任何内容?
查看完整描述

1 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

for...in迭代对象的可枚举属性。映射中的键不是可枚举属性(尽管映射与所有对象一样可以具有可枚举属性)。一方面,它们可以是任何类型,而不仅仅是字符串,就像历史上代表地图的 JavaScript 对象一样。

for...of迭代可迭代对象,这就是Map迭代产生其键/值的方式。

关于这个声明...

for (let key in map) console.log(`for key ${key} in map ${map}`); // <<< This does not return??

您的评论“不返回”实际上没有意义。这些都没有“返回”,它们调用块零次或多次。在本例中,为零,因为映射没有可枚举的属性。

如果这样做map.foo = "bar",那么for...in将迭代一次,并打印出来"for key foo in map [object Map]"。这与将新的键/值对插入到映射中不同:它在对象上定义了一个新属性,该属性完全独立于映射的内容而存在


查看完整回答
反对 回复 2023-09-14
  • 1 回答
  • 0 关注
  • 45 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信