最可靠的方法是使用 Object.prototype.toString.call() 判断,它能准确识别原生 RegExp 实例,不受跨 iframe 或 polyfill 干扰;返回形如 "[object RegExp]" 的字符串并严格比对即可。

最可靠的方法是使用 Object.prototype.toString.call() 判断,它能准确识别原生 RegExp 实例,不受跨 iframe 或 polyfill 干扰。
推荐:用 toString.call() 检测
这是 ECMAScript 规范定义的标准方式,兼容性好、结果稳定:
- 对任意值调用
Object.prototype.toString.call(value),返回形如"[object RegExp]"的字符串 - 严格比对返回值是否等于
"[object RegExp]"
示例:
function isRegExp(value) {
return Object.prototype.toString.call(value) === '[object RegExp]';
}
isRegExp(/abc/); // true
isRegExp(new RegExp('x')); // true
isRegExp('abc'); // false
isRegExp({}); // false
注意:instanceof 不够安全
value instanceof RegExp 在多数情况下可行,但有明显局限:
立即学习“Java免费学习笔记(深入)”;
- 如果正则对象来自其他 iframe 或 window 环境,
instanceof会返回false(因构造函数不同) - 某些打包工具或 polyfill 可能修改原型链,导致误判
补充:可结合 typeof 和 constructor(不推荐单独使用)
typeof value === 'object' && value.constructor === RegExp 看似直观,但:
- constructor 属性可被篡改,不可靠
- 同样存在跨环境失效问题
- 不如
toString.call()简洁通用
实际项目中建议封装为工具函数
例如在 Lodash 中 _.isRegExp() 就是基于 toString.call() 实现的;自己写时也应优先复用该模式,避免自行造轮子。


















