最可靠的方式是使用 instanceof 或 Object.prototype.toString.call();instanceof 简洁直观但跨 iframe 失效,后者不受执行上下文影响且兼容性好;应避免 typeof、constructor.name 和 name 属性判断。

直接使用 instanceof 或 Object.prototype.toString.call() 是最可靠的方式,避免依赖 typeof(它对所有对象都返回 "object")或 constructor.name(可能被篡改)。
用 instanceof 判断(推荐,简洁直观)
适用于大多数场景,包括原生 Error 及其子类(如 SyntaxError、TypeError):
-
err instanceof Error返回true表示是Error实例或其派生类实例 - 注意:跨 iframe 或不同全局环境创建的 Error 对象,
instanceof可能失效(因构造函数引用不同)
用 Object.prototype.toString.call() 判断(最稳妥)
不受执行上下文影响,适合严格环境或跨 frame 场景:
Object.prototype.toString.call(err) === '[object Error]'- 该方法返回内部 [[Class]] 值,对所有标准 Error 实例都稳定返回
'[object Error]' - 兼容性好,ES3 起就支持
不推荐的方式及原因
以下方法存在明显缺陷,应避免:
立即学习“Java免费学习笔记(深入)”;
-
typeof err === 'object' && err !== null && typeof err.message === 'string'—— 仅靠属性判断不可靠,普通对象也可拥有message属性 -
err.constructor === Error—— 构造函数可能被重写或继承覆盖 -
err.name === 'Error'——name可被随意修改,且子类如ReferenceError的name是'ReferenceError'
实用封装函数示例
可直接复用的判断函数:
function isError(value) {
return value instanceof Error ||
Object.prototype.toString.call(value) === '[object Error]';
}
// 使用示例:
isError(new Error('oops')); // true
isError(new TypeError()); // true
isError({ message: 'fake' }); // false
isError(null); // false


















