EcmaScript 6 Map()vs new Map()

时间:2014-08-15 08:07:36

标签: javascript ecmascript-harmony ecmascript-6

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

两者似乎都在node --harmony中正常工作。

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

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

2 个答案:

答案 0 :(得分:7)

虽然目前的浏览器似乎允许在没有Map()的情况下使用new(如@ RobG&#39}中所示),但这实际上是不正确的。

由于a stability issue,Node.js v0.10使用旧版本的V8(Node.js中的JavaScript引擎),如果执行Map(),则不会抛出。

Node.js v0.10使用V8 v3.14.5,但the issue with Map() not throwing仅在v3.20.12中修复。

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


根据目前的规范草案,如果没有Map(),则无法拨打new

  
      
  1. map 值。
  2.   
  3. 如果Type( map )不是Object,则抛出 TypeError 异常。
  4.   
  5. 如果 map 没有[[MapData]]内部广告位,则抛出 TypeError 例外。
  6.   
  7. 如果 map 的[[MapData]]内部插槽未定义,则抛出 TypeError 异常。
  8.   

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

显然这是因为it hinders the subclassing of native constructors,这在ES6中是可能的。

答案 1 :(得分:3)

修改

从ECMAScript 2015(第6版)开始,将 Map 作为一个函数调用(即没有 new )会引发错误:

  

Map不打算作为函数调用,而是抛出一个   以这种方式调用时的异常。

ECMA-262 ed 6 §23.1.1

后人的原始答案。

鉴于:

if (typeof Map != 'undefined') {
  var x = Map();
  var y = new Map();

  // x and y have same [[Prototype]]
  console.log(Object.getPrototypeOf(x) === Object.getPrototypeOf(y)); // true

  // x and y have same constructor
  console.log(x.constructor === y.constructor); // true

  // x [[Prototype]] is Map.prototype
  console.log(Object.getPrototypeOf(x) === Map.prototype); // true

  // x.constructor is Map
  console.log(x.constructor === Map); // true
}

在支持 Map 的浏览器中返回 true ,它似乎都会返回 Map 的实例,尽管规范可能已经超出了用更简单的语言来怀疑。

当提供参数时,似乎差别很明显:当作为函数调用时,参数应该是可迭代对象,而如果作为构造函数调用,则可以提供多个参数,并且内部[[Construct]]方法是调用。

修改

鉴于ES6仍处于草案状态(可能已有一段时间),此行为可能会发生变化。在2013年7月25日的TC39会议上讨论了允许构造函数表现得像构造函数,即使在没有 new Anti–pattern to call a constructor without new)的情况下调用也不是一个好主意,所以它可能会在将来