4

为什么 Chrome 的控制台会显示/(?:)/RegExp 的原型?

console.log(RegExp.prototype);
console.log(/a/.__proto__);

这是特定于实现的东西吗?IE 正在显示//.

这只是出于好奇而提出的问题。当我遇到这个时,我试图在javascript中查看正则表达式的所有原型方法。当然,我找到了查找这些方法的其他方法,但这让我想知道为什么会显示此结果。

我希望这个问题以前没有被问过——在 Stackoverflow 上没有找到任何东西。谢谢!

4

1 回答 1

6

规范中的相关部分

RegExp 原型对象本身就是一个正则表达式对象;它的 [[Class]] 是“RegExp”。RegExp 原型对象的数据属性 (15.10.7) 的初始值被设置为好像该对象是由表达式 new RegExp() 创建的,其中 RegExp 是具有该名称的标准内置构造函数。

然后我们转到new RegExp()section,这与使用空字符串调用它相同。所以现在我们有一个空的正则表达式对象作为原型。

字符串表示定义为

返回由字符串“/”、此 RegExp 对象的源属性的字符串值和“/”连接形成的字符串值;如果全局属性为真,则加“g”,如果 ignoreCase 属性为真,则加“i”,如果多行属性为真,则加“m”。

注意返回的 String 具有 RegularExpressionLiteral 的形式,其计算结果为另一个具有与此对象相同行为的 RegExp 对象。

它最终归结为.source属性(在新的 RegExp 部分中解释),只要它在用作正则表达式时行为相同,它就是实现定义:

令 S 为等价于 P 的 Pattern 形式的字符串,其中某些字符被转义,如下所述。S可能与P或pattern相同也可能不同;但是,将 S 评估为 Pattern 所产生的内部过程的行为必须与构造对象的 [[Match]] 内部属性给出的内部过程相同。

由于new RegExp("(?:)")new RegExp("")行为相同,chrome 和 IE 都正确遵循规范。该规范甚至以这种特定情况为例:

如果 P 是空字符串,则可以通过让 S 为 "(?:)" 来满足此规范

Chrome 的方式可以被认为是“更好的”,因为它似乎也可以作为正则表达式文字工作:/(?:)/是一个有效的正则表达式文字,而//开始一个单行注释。

于 2013-08-19T13:00:24.937 回答