javascript - 为什么我不能在地图对象上使用 for in 循环
问题描述
为了我自己的利益,我正在浏览 Javascript 中的每个内置结构化对象,特别是我正在尝试每个基本的“for”循环,以便我了解什么在哪里起作用。
在 Map 的情况下,我注意到 for/in 循环是无声的。我本来希望它返回地图中每个条目的键值。
let map = new Map([[1, 1], ["two", "two"]]);
map.set("three", 3); // Instead of add
console.log(`map has three = ${map.has("three")}`);
console.log(`map has size ${map.size}`);
// no 'for loop' because map uses keys instead of index numbers
for (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]}`));
为什么这不返回任何东西?
解决方案
for...in
迭代对象的可枚举属性。映射中的键不是可枚举属性(尽管映射与所有对象一样,可以具有可枚举属性)。一方面,它们可以是任何类型,而不仅仅是字符串,就像 JavaScript 对象一样,它们在历史上代表地图。
for...of
迭代一个iterable,这就是迭代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]"
. 这与向映射中插入新的键/值对不同:它在对象上定义了一个与映射内容完全分开存在的新属性。
推荐阅读
- python - Paragram_300_SL999 Word Embeddings 文件是否损坏?
- spring-boot - 使用 Spring Boot 进行本地开发的 Docker
- laravel - cURL 错误 28:操作在 10000 毫秒后超时
- apache-flink - Flink:在 CLI 上运行 flink 程序时出错
- sql - 同时进行两个 UPDATE 查询
- php - PHP - 优雅地提取数组 a 中不在数组 b 中的数字索引(不是 array_diff_key)
- python - 找不到 gunicorn 命令,但它在我的 requirements.txt 中
- django - 如何在 Django v3 中正确编写自定义用户模型和管理器?
- apollo - apollo 链接在 400 错误上重试的意外行为
- java - 对同一对象的多次引用