`throw 'foo'`、`throw Error('foo')`、`throw new Error('foo')` 之间有什么区别?

What is the difference between `throw 'foo'`, `throw Error('foo')`, `throw new Error('foo')`?

我在 JavaScript 中看到了 3 种不同的抛出错误的方法:

throw 'message';
throw Error('message');
throw new Error('message');

它们有什么区别?

注意:我知道类似的问题(1,2,3,等等)。 None 涵盖所有三种情况。

throw 是一个 expression which halts the function and generates an exceptionthrow 之后的任何内容都会在异常中传递。把它想象成一个带有语法糖的函数,所以不用写 throw('message'),而是写 throw 'message'throw new Error('message') 就像 throw 'message' 一样,只是传递的是对象而不是字符串文字。

There is no differencethrow Error('message')throw new Error('message') 之间:许多核心 JavaScript 对象允许在没有 new 构造函数的情况下创建新对象,并且Error恰好是其中之一。

也就是说,您应该始终使用 throw new Error('message')Error 对象包含堆栈跟踪和其他有用的调试信息,这些信息在您使用字符串文字时会丢失。使用 ES6 classes 创建对象需要使用 new,而 extending Error via a class 是保留堆栈跟踪的唯一方法。创建自定义错误 class 使错误处理更加统一。

另请参阅:extremely elaborate illustration