var err1 = Error('message');
var err2 = new Error('message');

有什么不同?在chrome控制台中,它们看起来一模一样。对象上相同的属性和相同的__proto__链。几乎看起来错误就像一个工厂。

哪个是正确的,为什么?


两者都很好;这在规范中有明确的说明:

... 因此,函数调用Error(…)等价于具有相同参数的对象创建表达式new Error(…)。


Error确实像一个工厂一样,就像其他一些本地构造函数:Array, Object等都检查类似if (!(this instanceof Array)){返回新数组(参数);}。(但请注意,String(x)和new String(x)非常不同,Number和Boolean也是如此。)

也就是说,如果出现错误,甚至不需要抛出一个error对象……抛出“糟糕的事情发生了”;你甚至可以抛出一个对象文字来调试:

throw {message:"You've been a naughty boy",
       context: this,
       args: arguments,
       more:'More custom info here'};