基本上,我的问题是关于Javascript如何处理正则表达式文字.
与数字,字符串和布尔形成对比,其中文字是原始数据类型,对应的数字,字符串和布尔对象存在无缝类型转换,是正则表达式文字的RegExp对象的匿名实例,或者这是正则表达式被视为原始数据与无缝的情况类型转换为RegExp?
"完整的参考Javascript,第2版,Powell和Schneider(MH)"自相矛盾 - 在一个地方,作者说/ regex /会在需要时被自动转换为RegExp,在另一个地方他们说/ regex /只是一个RegExp的实例!
编辑:请提供可靠来源的参考
Mil*_*les 13
这是规范必须说的:
正则表达式文字是一个输入元素,在扫描时将转换为RegExp对象.在评估包含程序或函数开始之前创建对象.对文字的评价产生对该对象的引用; 它不会创建新对象.程序中的两个正则表达式文字计算为正则表达式对象,
===即使两个文本的内容相同,也不会相互比较.
没有原始正则表达式类型以与stringor 相同的方式自动装箱到对象number.
但请注意,并非所有浏览器都实现了"每个文本实例化一次"行为,包括Safari和IE6(以及可能更晚),因此可移植代码不应依赖于它.无效的ECMAScript 4草案会改变行为以匹配这些浏览器:
在ES3中,正则表达式字面值
/a*b/mg表示在评估期间第一次遇到文字时创建的单个唯一RegExp对象.在ES4中,每次在评估期间遇到文字时,都会创建一个新的RegExp对象.
此外,一些浏览器(Firefox <3,Safari)报告typeof /regex/为"function",因此便携式代码应避免typeof在RegExp实例上坚持使用instanceof.
是的,以下两个表达式是等效的:
var r1 = /ab+c/i,
r2 =new RegExp("ab+c", "i");
Run Code Online (Sandbox Code Playgroud)
两者的构造函数属性都指向RegExp构造函数:
(/ab+c/i).constructor === RegExp // true
r2.constructor === RegExp // true
Run Code Online (Sandbox Code Playgroud)
regexp文字是RegExp的一个实例:
/ab+c/i instanceof RegExp // true
Run Code Online (Sandbox Code Playgroud)
基本区别在于使用构造函数定义正则表达式允许您从字符串构建和编译表达式.这对于构造将被重用的复杂表达式非常有用.