1

下面的代码片段(来自 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 "string",但出现了一堆错误。

4

1 回答 1

4

不,它们不共享。从正则表达式文字规范

正则表达式文字是一个输入元素,每次计算文字时都会转换为 RegExp 对象(参见 15.10) 。程序中的两个正则表达式文字评估为永远不会相互比较 === 的正则表达式对象,即使这两个文字的内容相同。

然而,这在 ES5 中发生了变化。旧的 ECMAScript 3有不同的行为:

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

应该在评估之间共享正则表达式引擎的编译结果,但显然导致了错误的程序

你应该扔掉你的书,买一个更新的版本。

于 2015-01-28T03:16:36.267 回答