繁体   English   中英

EcmaScript 6 Map()vs new Map()

[英]EcmaScript 6 Map() vs new Map()

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

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

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

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

虽然目前的浏览器似乎允许使用没有newMap() (如@ 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不会抛出错误。


根据当前的规范草案,不应该在没有new情况下调用Map()

  1. map 为此值。
  2. 如果Type( map )不是Object,则抛出TypeError异常。
  3. 如果map没有[[MapData]]内部槽,则抛出TypeError异常。
  4. ’s [[MapData]] internal slot is not undefined, then throw a TypeError exception. 如果的[[MapData]]内部槽未定义,则抛出TypeError异常。

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

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

编辑

从ECMAScript 2015(编辑6)开始,将Map作为函数(即没有new )调用应该抛出一个错误:

Map不应该作为函数调用,并且在以这种方式调用时会抛出异常。

ECMA-262第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的情况下调用反模式来调用没有new的构造函数 )也不是一个好主意,因此将来可能会进行修改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM