为何无法在JavaScript的Map对象上使用for/in循环?
为什么
for/in循环遍历Map没有输出? 这是个非常典型的ES6集合类型和传统对象遍历的混淆点,我来给你理清楚背后的原因:
1. for/in循环的本质是什么?
for/in循环的作用是遍历普通JavaScript对象的可枚举属性——包括对象自身的自有属性,以及原型链上继承来的可枚举属性。它只认挂载在对象本身(比如obj.key = value这种形式)的属性,对Map这种特殊集合完全不适用。
2. Map的键值对存储逻辑和普通对象不同
Map是ES6专门设计的键值对集合类型,它的键值对并不是作为对象的属性存储的。你可以把Map看作一个独立的“黑盒容器”,它的键和值都保存在内部的专用结构里,不会暴露为map对象的可枚举属性。所以当你用for/in遍历map时,自然找不到任何可以遍历的属性,也就没有输出了。
3. 你的代码里其他方法能工作的原因
for/of循环:Map实现了ES6的可迭代协议,它的默认迭代器会返回每一组键值对组成的数组(比如[1,1]、["two","two"]),所以for/of能正常遍历。forEach方法:这是Map实例自带的遍历方法,专门为遍历它的键值对设计,会依次传入每个值、键和Map本身的副本,所以也能正常输出。
额外小提示
如果想单独遍历Map的键、值或者键值对,可以用Map提供的专用方法:
map.keys():返回所有键的可迭代对象map.values():返回所有值的可迭代对象map.entries():返回所有键值对的可迭代对象(和for/of默认遍历的内容一致)
比如这样用:
for (let key of map.keys()) { console.log(`Key: ${key}`); }
内容的提问来源于stack exchange,提问作者lindsaymacvean
相关产品推荐
相关产品推荐

