EcmaScript 6 Map()vs new Map()

rwa*_*ace 2 javascript ecmascript-harmony ecmascript-6

要在ES6中创建地图,您应该说Map()还是new Map()

两者似乎都运行良好node --harmony.

规范草案说:"Map构造函数是%Map%内在对象和全局对象的Map属性的初始值.当Map作为函数而不是构造函数调用时,它使用内部状态初始化它的值支持Map.prototype内置方法所必需的." 这也似乎表明他们都应该工作.

鉴于此,Map()虽然这是一种主观判断,但看起来更好,因为更短; 客观地说他们似乎可以互换?

Qan*_*avy 7

虽然目前的浏览器似乎允许使用Map()without new(如@ RobG的回答所示),但这实际上是不正确的.

由于稳定性问题,Node.js v0.10使用旧版本的V8(Node.js中的JavaScript引擎),如果你这样做,它就不会抛出Map().

Node.js v0.10使用V8 v3.14.5,但不抛出的问题Map()仅在v3.20.12中修复.

Chrome使用较新版本的V8,如果您不使用,则会引发错误new.我不确定为什么Firefox不会抛出错误.


根据目前的规范草案,如果Map()没有new:

  1. 地图这个值.
  2. 如果Type(map)不是Object,则抛出TypeError异常.
  3. 如果map没有[[MapData]]内部槽,则抛出TypeError异常.
  4. 如果map的[[MapData]]内部槽未定义,则抛出TypeError异常.

通常在构造函数中,应该创建的对象是this.它要求传递的对象是一个实例Map,并且尚未初始化([[MapData]]必须是未定义的).

显然这是因为它阻碍了本机构造函数的子类化,这在ES6中是可能的.