表达式文字所做的对象是否共享一个实例?

时间:2015-01-28 03:03:42

标签: javascript

以下代码片段(来自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",但是遇到了一堆错误。

1 个答案:

答案 0 :(得分:3)

不,他们没有分享。来自spec on Regular Expression Literals

  

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

然而,这改变了ES5。 Old ECMAScript 3有不同的行为:

  

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

这应该在评估中共享正则表达式引擎的编译结果,但显然导致了buggy progams

你应该扔掉你的书并获得更新的版本。