[英]EcmaScript 6 Map() vs new Map()
要在ES6中创建地图,您应该说Map()
还是new Map()
?
两者似乎在node --harmony
工作正常。
规范草案说:“Map构造函数是%Map%内在对象和全局对象的Map属性的初始值。当Map作为函数而不是构造函数调用时,它使用内部状态初始化它的值支持Map.prototype内置方法所必需的。“ 这也似乎表明他们都应该工作。
鉴于此, Map()
似乎更好,因为它更短,尽管这是一种主观判断; 客观地说他们似乎可以互换?
虽然目前的浏览器似乎允许使用没有new
的Map()
(如@ 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()
:
- 设map 为此值。
- 如果Type( map )不是Object,则抛出TypeError异常。
- 如果map没有[[MapData]]内部槽,则抛出TypeError异常。
- ’s [[MapData]] internal slot is not undefined, then throw a TypeError exception. 如果的[[MapData]]内部槽未定义,则抛出TypeError异常。
通常在构造函数中,应该创建的对象是this
。 它要求传递的对象是Map
一个实例,并且它尚未初始化( [[MapData]]
必须是未定义的)。
显然这是因为它阻碍了本机构造函数的子类化 ,这在ES6中是可能的。
从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的情况下调用 ( 反模式来调用没有new的构造函数 )也不是一个好主意,因此将来可能会进行修改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.