应使用 object.prototype.tostring.call(value) === '[object regexp]' 判断正则对象,因其基于不可伪造的内部 [[class]] 标签,兼容多上下文且精准;其他方式如 typeof、instanceof、constructor 或鸭子类型均存在误判风险。

判断一个变量是否为正则表达式对象,不能靠字符串匹配或类型转换,必须依赖 JavaScript 原生的类型识别机制。因为正则表达式在 JS 中是独立的内置对象类型(RegExp),它既不是字符串,也不是普通对象,更不是函数——尽管它有 exec、test 等方法。
用 Object.prototype.toString.call() 精准识别
这是最可靠、跨环境兼容的方式。所有内置对象都可通过该方法返回标准内部标签:
-
Object.prototype.toString.call(/abc/)→"[object RegExp]" -
Object.prototype.toString.call(new RegExp('x'))→"[object RegExp]" -
Object.prototype.toString.call('abc')→"[object String]" -
Object.prototype.toString.call({})→"[object Object]"
封装成工具函数可直接复用:
function isRegExp(value) {
return Object.prototype.toString.call(value) === '[object RegExp]';
}
避免误判的常见陷阱
以下方式看似合理,实则不可靠:
-
typeof reg === 'object':正则对象确实返回'object',但数组、日期、普通对象也都是'object',无法区分 -
value instanceof RegExp:在 iframe 或多上下文环境中可能失效(因不同全局环境中的RegExp构造函数不相等) -
typeof value.test === 'function':某些自定义对象也可能有test方法,属于“鸭子类型”误判 -
JSON.stringify(reg)会返回空对象{},完全丢失信息,不能用于判断
结合实际场景的补充校验
仅确认是 RegExp 对象还不够,有时还需验证其有效性(比如是否编译成功):
- 合法正则对象一定有
source(源字符串)、flags(修饰符)属性,且source是字符串 - 可尝试执行
reg.test('')—— 即使空字符串也能安全调用,不会抛错;若报TypeError,说明该对象已被篡改或非标准 RegExp 实例 - 注意:
new RegExp('')是合法的,匹配空字符串;但new RegExp('[')会直接抛SyntaxError,所以构造阶段就失败的对象根本不会进入判断环节
为什么不用 constructor 判断?
value.constructor === RegExp 在多数情况下可行,但存在明显缺陷:
- 如果对象原型被修改(如
obj.__proto__ = null),constructor可能为undefined - 在 ES6 模块隔离或 Web Worker 等多 Realm 场景中,不同上下文的
RegExp不共享引用 - 用户可能手动设置
obj.constructor = RegExp伪造类型,而toString.call读取的是内部[[Class]]标签,不可伪造











