请帮助我理解为什么以下代码有效:
<script>
var re = RegExp('\\ba\\b') ;
alert(re.test('a')) ;
alert(re.test('ab')) ;
</script>
第一行没有 new
运算符。
据我所知, JavaScript 中的一个构造函数是一个初始化由运算符 new 创建的对象的函数,它们并不返回任何内容。
最佳答案
一般来说,如果某个东西被记录为构造函数,请对其使用 new
。但在本例中,RegExp
对于您将其作为函数调用的情况具有定义的“工厂”行为。请参阅 ECMAScript (JavaScript) specification 第 15.10.3 节(链接到即将发布的规范;新规范中的部分编号相同,您可以从 ECMA front page [右侧] 下载;我不想直接链接到 ~4MB PDF 文件):
15.10.3 The RegExp Constructor Called as a Function
15.10.3.1 RegExp(pattern, flags)
If pattern is an object R whose [[Class]] property is "RegExp" and flags is undefined, then return R unchanged. Otherwise call the RegExp constructor (15.10.4.1), passing it the pattern and flags arguments and return the object constructed by that constructor.
您实际上可以定义自己的 JavaScript 构造函数,以允许省略 new
关键字(通过检测它们已被作为函数调用,然后转身并正确调用自身),但我不会不建议这样做,因为它会导致误导性代码。 (而且你不能使用 class
语法来做到这一点,你必须使用旧的、更笨重的 function
语法。)
关于JavaScript:使用不带运算符的构造函数 'new',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1928342/