在JS中检查typeof错误

在JS中,似乎无法检查传递给函数的参数实际上是types“错误”还是错误实例。

例如,这是无效的:

typeof err === 'error'

因为只有6种可能的types(以string的forms):

typeof运算符以stringforms返回types信息。 typeof返回有六个可能的值:“number”,“string”,“boolean”,“object”,“function”和“undefined”。

MSDN

但是如果我有这样一个简单的用例呢?

 function errorHandler(err) { if (typeof err === 'error') { throw err; } else { console.error('Unexpectedly, no error was passed to error handler. But here is the message:',err); } } 

那么确定参数是否是Error的一个实例的最好方法是什么?

是任何帮助的运营商的instanceof吗?

你可以使用instanceof操作符。

 var myError = new Error('foo'); myError instanceof Error // true var myString = "Whatever"; myString instanceof Error // false 

我问原来的问题 – 特罗特的答案肯定是最好的。

然而,由于JS是一种dynamic语言,并且存在如此多的JS运行时环境,所以instanceof运算符在跨越边界(如iframe)时可能会失败,特别是在前端开发中。 请参阅: https : //github.com/mrdoob/three.js/issues/5886

如果你可以用鸭子打字,这应该是好的:

 let isError = function(e){ return e && e.stack && e.message; } 

我个人比较喜欢静态types的语言,但是如果你使用的是dynamic语言,最好是使用一种dynamic语言来代替它,而不是像静态types语言那样行事。

如果你想要更精确一些,你可以这样做:

  let isError = function(e){ return e && e.stack && e.message && typeof e.stack === 'string' && typeof e.message === 'string'; }