RegExp构造函数和Regex文字测试函数之间的区别?

DRo*_*rtE 8 javascript regex

我对这怎么可能感到困惑......

var matcher = new RegExp("d", "gi");
matcher.test(item)
Run Code Online (Sandbox Code Playgroud)

上面的代码包含以下值

item = "Douglas Enas"
matcher = /d/gi
Run Code Online (Sandbox Code Playgroud)

然而,当我连续运行matcher.test函数时,第一次运行得到true,第二次运行得到false.

matcher.test(item) // true
matcher.test(item) // false
Run Code Online (Sandbox Code Playgroud)

如果我使用regexp文字,如

/d/gi.test("Douglas Enas") 
Run Code Online (Sandbox Code Playgroud)

然后用铬背靠背运行我两次都是真的.对此有解释吗?

在chrome控制台中背对背运行的示例使用构造函数创建正则表达式对象

matcher = new RegExp("d","gi")
/d/gi

matcher.test("Douglas Enas")
true

matcher.test("Douglas Enas")
false

matcher
/d/gi
Run Code Online (Sandbox Code Playgroud)

示例使用文字的背靠背调用

/d/gi.test("Douglas Enas")
true

/d/gi.test("Douglas Enas")
true
Run Code Online (Sandbox Code Playgroud)

这个问题的原因是因为使用RegExp构造函数和测试函数对我失去匹配的值列表...但是使用文字我得到了我期望的所有值

UPDATE

                        var suggestions = [];

                        ////process response  
                        $.each(responseData, function (i, val)
                        {
                            suggestions.push(val.desc);
                        });


                        var arr = $.grep(suggestions, function(item) {
                            var matcher = new RegExp("d", "gi");
                            return matcher.test(item);
                        });
Run Code Online (Sandbox Code Playgroud)

在闭包内移动匹配器的创建包括缺少的结果."d"实际上是一个动态创建的字符串,但为简单起见,我使用了"d".我仍然不确定现在每次进行测试时都会创建一个新的表达式,当我迭代建议数组时会无意中排除结果仍然有点令人困惑,并且可能与匹配测试的进展有关

Nul*_*ion 10

来自RegExp.test():

test 在同一个全局正则表达式实例上多次调用将超过上一个匹配.

所以基本上当你有一个实例时RegExp,每次调用都会test提升匹配器.一旦你找到第一个d,它将超越它并试图寻找另一个 d.好吧,已经没有了,所以它又回来了false.

另一方面,当你这样做时:

/d/gi.test("Douglas Enas") 
Run Code Online (Sandbox Code Playgroud)

RegExp每次都在现场创建一个新实例,因此它将始终首先找到d(然后返回true).