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

Ind*_*ing 6 javascript error-handling throw

我见过 3 种在 JavaScript 中抛出错误的不同方式:

throw 'message';
throw Error('message');
throw new Error('message');
Run Code Online (Sandbox Code Playgroud)

它们之间有什么区别?

注意:我知道类似的问题(123等)。它们都没有涵盖所有三种情况。

Ind*_*ing 9

throw是一个停止函数并产生异常表达式。紧随其后的任何内容都在异常中传递。把它想象成一个带有语法糖的函数,所以不要写你写. 就像传递一个对象而不是字符串文字一样。throwthrow('message')throw 'message'throw new Error('message')throw 'message'

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

话虽如此,您应该始终使用throw new Error('message'). 该Error对象包含堆栈跟踪和其他有用的调试信息,这些信息在您使用字符串文字时会丢失。使用 ES6 类创建对象需要使用类new通过类进行扩展Error是保留堆栈跟踪的唯一方法。创建自定义错误类使错误处理更加统一。

另请参阅:极其精细的插图