最可靠的方式是使用 Object.prototype.toString.call(value) === '[object RegExp]',因其能准确识别正则字面量和RegExp实例,且不受跨iframe、多全局环境或构造函数篡改影响。

JavaScript 中判断一个值是否为正则表达式类型,最可靠的方式是使用 Object.prototype.toString.call(),配合严格类型识别。
用 toString() 判断正则对象
正则字面量(如 /abc/)和 RegExp 构造函数创建的实例,在内部都属于 [object RegExp] 类型。直接用 typeof 不行(它返回 "object"),而 instanceof RegExp 在跨 iframe 或不同全局环境时可能失效。
推荐写法:
function isRegExp(value) {
return Object.prototype.toString.call(value) === '[object RegExp]';
}
// 示例
console.log(isRegExp(/abc/)); // true
console.log(isRegExp(new RegExp('x'))); // true
console.log(isRegExp('abc')); // false
console.log(isRegExp({})); // false
注意构造函数与跨环境问题
如果确定代码只在单个全局环境运行,且不涉及 iframe、Web Worker 或模块沙箱,可用 value instanceof RegExp,但需留意以下情况:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- iframe 中创建的正则对象,对主页面的
RegExp构造函数返回false - ES6 模块或某些打包工具可能引入多个
RegExp副本,导致instanceof失效 -
typeof /a/ === "object",不能用于区分正则和其他对象
兼容旧版浏览器的小技巧
极少数老环境(如 IE8)中 toString.call() 可能被篡改,可加一层兜底:
function isRegExp(value) {
if (value && typeof value === 'object') {
const tag = Object.prototype.toString.call(value);
if (tag === '[object RegExp]') return true;
}
return false;
}
不过现代项目基本无需考虑此兼容性。
别用这些方式
以下方法都不推荐:
-
typeof value === 'regexp'——typeof没有'regexp'类型,永远是false -
value.constructor === RegExp—— 构造函数可被覆盖,且跨环境失效 -
value.test && value.exec && typeof value.test === 'function'—— 鸭子类型不可靠,伪造对象也能满足
核心就一条:用 Object.prototype.toString.call(value) === '[object RegExp]',准确、安全、无依赖。

















