/ regex / Literals总是RegExp对象吗?

时间:2009-08-25 06:24:42

标签: javascript

基本上,我的问题是关于Javascript如何处理正则表达式文字。

与数字,字符串和布尔形成对比,其中文字是原始数据类型,对应的数字,字符串和布尔对象存在无缝类型转换,是正则表达式文字的RegExp对象的匿名实例,或者这是正则表达式被视为原始的情况无缝类型转换为RegExp的数据?

“完整的参考Javascript,第2版,Powell和Schneider(MH)”自相矛盾 - 在一个地方,作者说/ regex /会在需要时被自动转换为RegExp,而在另一个地方他们说/ regex /是只是一个RegExp的实例!

编辑:请提供可靠来源的参考

3 个答案:

答案 0 :(得分:13)

以下是the spec所说的内容:

  

正则表达式文字是一个输入元素,在扫描时会转换为RegExp对象。在评估包含程序或函数开始之前创建对象。对文字的评价产生对该对象的引用;它不会创建新对象。程序中的两个正则表达式文字计算为正则表达式对象,即使两个文字的内容相同,它们也永远不会相互比较为===

没有原始正则表达式类型以与stringnumber相同的方式自动装箱到对象。

但请注意,并非所有浏览器都实现“每个文本实例化一次”行为,包括Safari和IE6(以及可能更晚),因此可移植代码不应依赖于它。失败的ECMAScript 4草案would have changed the behavior与这些浏览器相匹配:

  

在ES3中,正则表达式文字如/a*b/mg表示在评估期间第一次遇到文字时创建的单个唯一RegExp对象。在ES4中,每次在评估期间遇到文字时都会创建一个新的RegExp对象。

此外,某些浏览器(Firefox <3Safari)将typeof /regex/报告为"function",因此可移植代码应该避免在typeof上运行RegExp实例 - 坚持使用{ {1}}。

答案 1 :(得分:6)

是的,以下两个表达式是等效的:

var r1 = /ab+c/i,
    r2 =new RegExp("ab+c", "i");

两者的构造函数属性指向RegExp构造函数:

(/ab+c/i).constructor === RegExp // true
r2.constructor === RegExp // true

regexp文字是RegExp的一个实例:

 /ab+c/i instanceof RegExp // true

基本区别在于使用构造函数定义正则表达式允许您从字符串构建和编译表达式。这对于构造将被重用的复杂表达式非常有用。

答案 2 :(得分:1)

是的,新的RegExp(“某事”,“g”) / something / g

相同