为什么我不能迭代 ES6 Map 的属性?

str*_*gee 1 javascript dictionary node.js ecmascript-6

在 Node.js REPL 中:

> var map = new Map();
undefined
> map['foo'] = 'bar';
'bar'
> map['bar'] = 'baz';
'baz'
> map
Map { foo: 'bar', bar: 'baz' }
> map.forEach(console.log);
undefined
Run Code Online (Sandbox Code Playgroud)

如您所见,foobar键在 中明确定义map,但是当我尝试使用 迭代它们时Map.prototype.forEach,没有任何反应 - 但根据 MDN,它应该. 还要注意,这Map.prototype.forEach 是定义的,所以不仅仅是这个方法还没有实现。我也尝试过使用for ... of ...循环,结果相同 - 我提供的每次迭代运行的代码实际上并没有运行,即使它应该.

我在 Node.js v4.4.4 上。我在网上搜索了“javascript 地图不是可迭代节点”等内容,但没有成功。

这里发生了什么?

fro*_*sty 5

不是100%肯定的,但我认为你需要使用map.setMaps

var map = new Map();
map.set('foo', 'bar');
map.set('bar', 'baz');
map.forEach(console.log);
Run Code Online (Sandbox Code Playgroud)

这将注销您正在查找的每个项目。因为Map.prototype.forEach正在寻找可迭代的属性,所以需要使用该set()函数来设置那些可迭代的属性。

  • 因为地图是一个“对象”,你可以将任何你想要的属性放在上面。就像你可以说 `[].foo = "bar"` 一样,你可以用一个 Map 或一个函数来做同样的事情。因此,当您尝试这样做时它没有出错。然而,Maps 使用 ES6 中的 `Iterator` 功能,这意味着为了让可迭代的东西工作,你需要使用 `.set()` 来设置值,而不是使用 dotNotation 或 rackNotation 来设置值。这就是地图的工作方式。 (6认同)
  • 原来如此。这是因为我在 Map 上设置了一个属性,而 `map.set` 正在设置 Map _inside_ 键......如果这有意义的话。 (2认同)