为了我自己的利益,我正在浏览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
在可迭代项上进行迭代,这就是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]"
。这与在映射中插入新的键/值对不同:它在对象上定义了一个与映射内容完全独立的新属性。