由表达式文字生成的正则表达式是否共享单个实例?

Geo*_*rge 2 javascript regex instance literals ecmascript-3

以下代码片段(来自 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
Run Code Online (Sandbox Code Playgroud)

问题:这与其他文字一样吗?我尝试修改上面的代码以使用字符串"string",但出现了一堆错误。

Ber*_*rgi 5

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

正则表达式文字是一个输入元素,每次计算该文字时都会将其转换为 RegExp 对象(请参阅 15.10) 。程序中的两个正则表达式文字计算结果为正则表达式对象,即使这两个文字的内容相同,它们也不会相互比较为 ===。

然而,随着 ES5 的出现,这种情况发生了变化。旧的 ECMAScript 3有不同的行为:

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

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

你应该扔掉你的书并购买更新版本。