规范中的相关部分
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 的方式可以被认为是“更好的”,因为它似乎也可以作为正则表达式文字工作:/(?:)/
是一个有效的正则表达式文字,而//
开始一个单行注释。