在外部作用域中定义的正则表达式在 JavaScript 中会产生不同的结果



我在这里举个例子:

var reg = /s+/g;
function testfn() {
  // reg = /s+/g;
  var res = reg.test('mike ross');
  var showEle = document.querySelector("#show");
  showEle.innerHTML = res;
}
<button onclick="testfn()">click</button>
<span id="show"></span>

因为您可以单击该按钮,并且会发现在以下情况下有不同的结果你一次又一次地点击。

但是在内部函数中定义了正则表达式(注释内部的行),然后你发现它像以前一样工作。

为什么???

使用 g 标志的正则表达式对象具有状态,以便您可以遍历字符串中的所有匹配项。当您再次使用同一对象时,它会从上次中断的位置继续。当您每次创建一个新函数(通过在函数中创建它)时,它每次都从头开始。

状态位于 lastIndex 属性中,该属性(尽管名称)表示下次从何处开始匹配。下面是重用同一全局对象的示例,并在每个操作后显示lastIndex

var reg = /s+/g;
function testfn() {
  var str = "Matching starting at " + reg.lastIndex;
  var res = reg.test('mike ross');
  var showEle = document.querySelector("#show");
  showEle.innerHTML = str += ", res = " + res;
}
<button onclick="testfn()">click</button>
<span id="show"></span>

Vs. 每次创建一个新对象:

function testfn() {
  var reg = /s+/g;
  var str = "Matching starting at " + reg.lastIndex;
  var res = reg.test('mike ross');
  var showEle = document.querySelector("#show");
  showEle.innerHTML = str += ", res = " + res;
}
<button onclick="testfn()">click</button>
<span id="show"></span>

这是因为g修饰符。这个修饰符使正则表达式记住它上次匹配的位置,每次你使用它时,它都会寻找之后的下一个匹配项。

使用全局变量时,只有一个RegExp对象,它会记住它在对函数的所有调用中的位置。

使用局部变量,每次调用函数时都会重新创建RegExp对象,因此它从字符串的开头开始查找。

最新更新