throw Error('msg') vs throw new Error('msg')

2022-08-30 01:04:13
var err1 = Error('message');
var err2 = new Error('message');

有什么区别?在Chrome控制台中查看它们,它们看起来是一样的。对象上的相同属性和同一链。几乎看起来像一个工厂。__proto__Error

哪一个是正确的,为什么?


答案 1

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

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


答案 2

Error确实像工厂一样,像其他一些本机构造函数一样:,,等都检查类似的东西。(但请注意,和 非常不同,对于 和 也是如此。ArrayObjectif (!(this instanceof Array)) { return new Array(arguments); }String(x)new String(x)NumberBoolean

也就是说,如果发生错误,甚至不需要抛出一个对象...... 也可以工作
您甚至可以抛出一个对象文本进行调试:Errorthrow 'Bad things happened';

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