正则表达式文字所做的RegExp对象共享一个实例?

时间:2013-11-27 02:06:57

标签: javascript regex

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8">
    <title>chap07</title>
    <script>
    function make_a_matcher(){
        return /a/gi;
    }

    var x = make_a_matcher();
    var y = make_a_matcher();

    x.lastIndex = 10;

    document.writeln('<div>x.global : '+x.global+'<div>');
    document.writeln('<div>x.ignoreCase : '+x.ignoreCase+'<div>');
    document.writeln('<div>x.lastIndex : '+x.lastIndex+'<div>');
    document.writeln('<div>x.multiline : '+x.multiline+'<div>');
    document.writeln('<div>x.source : '+x.source+'<div>');

    document.writeln('<div>y.global : '+y.global+'<div>');
    document.writeln('<div>y.ignoreCase : '+y.ignoreCase+'<div>');
    document.writeln('<div>y.lastIndex : '+y.lastIndex+'<div>');
    document.writeln('<div>y.multiline : '+y.multiline+'<div>');
    document.writeln('<div>y.source : '+y.source+'<div>');
    </script>
</head>
<body>
</body>
</html>

我正在使用&#34; JavaScript学习JavaScript#Good Parts&#34;由Douglas Crockford撰写。 他描述了由正则表达式文字构成的RegExp对象共享一个实例和上面的例子。

本书的结果是y.lastIndex : 10。但我的结果是y.lastIndex : 0

如果你告诉我这种不同结果的确切原因,我将不胜感激。

4 个答案:

答案 0 :(得分:0)

Crockford的信息不正确(或不是最新的),任何简单的测试都会验证每次调用函数时都会得到一个新的不同的对象。

如果您希望它们返回相同的对象,您可以这样做:

var make_a_matcher = (function() {
    var regex = /a/gi;
    return function() {
        return regex;
    }
})();

演示:http://jsfiddle.net/jfriend00/FaDwP/

答案 1 :(得分:0)

请参阅this SO question及其答案。特别是其中一个答案引用了ECMA-262规范,§7.8.5正则表达式文字,其中指出:

  

正则表达式文字是一个输入元素,每次评估文字时都会转换为RegExp对象(见15.10)。

因此,每次调用函数make_a_matcher时,都会创建一个新的regexp对象。如果不这样说的话,看起来克罗克福德先生的书可能已经过时了。

答案 2 :(得分:0)

当你这样做时,

function make_a_matcher(){
  return /a/gi;
}

var x = make_a_matcher();
var y = make_a_matcher();

您正在创建单独的实例。它与:

相同
function make_a_matcher(){
  return new RegExp('a', 'gi');
}

如果在创建make_a_matcher()之前创建实例,它应该可以正常工作,

var agi = /a/gi;
function make_a_matcher(){
  return agi;
}

虽然没有必要,因为你可以只使用那个变量。

答案 3 :(得分:0)

在我的电脑中,y也等于0; 因为make_a_matcher函数返回一个名为RegExp对象的对象,而x,y是RegExp对象的不同实例,这意味着x,y是分开的!

function make_a_matcher() {
return /a/gi;
}
var x = make_a_matcher();
var y = make_a_matcher();
x.lastIndex = 10;
console.log(y.lastIndex);

enter image description here

在下图中我们可以看到x,y是RegExp的不同实例,但不相等。 enter image description here