Edit
As of ECMAScript 2015 (ed. 6), calling Map as a function (i.e. without new) should throw an error:
Map is not intended to be called as a function and will throw an
exception when called in that manner.
ECMA-262 ed 6 §23.1.1
Original answer for posterity.
Given that:
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
}
returns true in browsers that support Map, it would seem both return an instance of Map, though the specification could have put that beyond doubt with much simpler language.
It seems the difference is evident when arguments are supplied: when called as a function, the argument should be an iterable object, whereas if called as a constructor, multiple arguments can be provided and the internal [[Construct]]
method is called.
Edit
Given that ES6 is still in draft (and may be for some time) this behaviour may change. At the 25 July 2013 TC39 meeting it was discussed that allowing constructors to be behave like constructors even when called without new (Anti–pattern to call a constructor without new)was not a good idea, so it may well be modified in future.