以下代码片段(来自Crockford的 Javascript:The Good Parts )演示了由正则表达式文字构成的RegExp对象共享一个实例:
function make_a_matcher( ) {
return /a/gi;
}
var x = make_a_matcher( );
var y = make_a_matcher( );
// Beware: x and y are the same object!
x.lastIndex = 10;
document.writeln(y.lastIndex); // 10
问题:这与其他任何文字都一样吗?我尝试修改上面的代码以使用字符串"string"
,但是遇到了一堆错误。
答案 0 :(得分:3)
不,他们没有分享。来自spec on Regular Expression Literals:
正则表达式文字是一个输入元素,每次评估文字时都会转换为RegExp对象(参见15.10) 。程序中的两个正则表达式文字计算为正则表达式对象,这些对象永远不会相互比较为===,即使这两个文字也是如此。内容相同。
然而,这改变了ES5。 Old ECMAScript 3有不同的行为:
正则表达式文字是一个输入元素,在扫描时转换为RegExp对象(第15.10节)。在评估包含程序或函数开始之前创建对象。对文字的评价产生对该对象的引用;它不会创建新对象。程序中的两个正则表达式文字计算为正则表达式对象,这些对象永远不会相互比较为===,即使这两个文字也是如此。内容相同。
这应该在评估中共享正则表达式引擎的编译结果,但显然导致了buggy progams。
你应该扔掉你的书并获得更新的版本。