要在ES6中创建地图,您应该说Map()
还是new Map()
?
两者似乎都在node --harmony
中正常工作。
规范草案说:“Map构造函数是%Map%内在对象和全局对象的Map属性的初始值。当Map作为函数而不是构造函数调用时,它初始化它的这个值支持Map.prototype内置方法所必需的内部状态。“这也似乎表明他们都应该工作。
鉴于此,Map()
似乎更好,因为更短,但这是一种主观判断;客观上他们似乎可以互换?
答案 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
:
- 让 map 为此值。
- 如果Type( map )不是Object,则抛出 TypeError 异常。
- 如果 map 没有[[MapData]]内部广告位,则抛出 TypeError 例外。
- 如果 map 的[[MapData]]内部插槽未定义,则抛出 TypeError 异常。
醇>
通常在构造函数中,应该创建的对象是this
。它要求传递的对象是Map
的实例,并且尚未初始化([[MapData]]
必须未定义)。
显然这是因为it hinders the subclassing of native constructors,这在ES6中是可能的。
答案 1 :(得分:3)
从ECMAScript 2015(第6版)开始,将 Map 作为一个函数调用(即没有 new )会引发错误:
Map不打算作为函数调用,而是抛出一个 以这种方式调用时的异常。
后人的原始答案。
鉴于:
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)的情况下调用也不是一个好主意,所以它可能会在将来