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",但出现了一堆错误。
正则表达式文字是一个输入元素,每次计算该文字时都会将其转换为 RegExp 对象(请参阅 15.10) 。程序中的两个正则表达式文字计算结果为正则表达式对象,即使这两个文字的内容相同,它们也不会相互比较为 ===。
然而,随着 ES5 的出现,这种情况发生了变化。旧的 ECMAScript 3有不同的行为:
正则表达式文字是一个输入元素,在扫描时会转换为 RegExp 对象(第 15.10 节)。该对象是在开始计算包含的程序或函数之前创建的。对文字的求值会产生对该对象的引用;它不会创建新对象。程序中的两个正则表达式文字计算结果为正则表达式对象,即使这两个文字的内容相同,它们也不会相互比较为 ===。
这本来应该在评估之间共享正则表达式引擎的编译结果,但显然会导致错误的程序。
你应该扔掉你的书并购买更新版本。