Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么RegEx.test会在后续调用中更改结果?_Javascript_Regex - Fatal编程技术网

Javascript 为什么RegEx.test会在后续调用中更改结果?

Javascript 为什么RegEx.test会在后续调用中更改结果?,javascript,regex,Javascript,Regex,为什么以下内容从true变为false var r = /e/gi; r.test('e'); // true r.test('e'); // false 然后它继续切换true,false,true,false,…Its,因为g标志。它开始记住匹配的最后一个索引,下次执行r.test时,它从该索引开始。这就是为什么它在true和false之间交替出现的原因。试试这个 var r = /e/gi; console.log(r.test('e')); # true console.log(r.l

为什么以下内容从
true
变为
false

var r = /e/gi;
r.test('e'); // true
r.test('e'); // false

然后它继续切换
true
false
true
false
,…

Its,因为
g
标志。它开始记住匹配的最后一个索引,下次执行
r.test
时,它从该索引开始。这就是为什么它在
true
false
之间交替出现的原因。试试这个

var r = /e/gi;
console.log(r.test('e'));
# true
console.log(r.lastIndex);
# 1
console.log(r.test('e'));
# false
console.log(r.lastIndex);
# 0
console.log(r.test('e'));
# true
console.log(r.lastIndex);
# 1
console.log(r.test('e'));
# false
引用有关的MDN文档

lastIndex
是正则表达式的读/写整数属性,指定开始下一次匹配的索引。

仅当正则表达式使用“g”标志指示全局搜索时,才设置此属性。以下规则适用:

  • 如果
    lastIndex
    大于字符串长度,
    test()
    exec()
    失败,则
    lastIndex
    设置为0
  • 如果
    lastIndex
    等于字符串的长度,并且如果正则表达式匹配空字符串,则正则表达式匹配从
    lastIndex
    开始的输入
  • 如果
    lastIndex
    等于字符串的长度,并且如果正则表达式与空字符串不匹配,则正则表达式与输入不匹配,并且
    lastIndex
    重置为0。
  • 否则,
    lastIndex
    将设置到最近匹配后的下一个位置
  • 上面的粗体文本回答了您观察到的行为。在第一次匹配后,
    e
    ,将
    lastIndex
    设置为
    1
    ,以指示下一次匹配的索引。根据上面看到的第三点,由于
    lastIndex
    等于字符串的长度,并且正则表达式与空字符串不匹配,因此它返回
    false
    并将
    lastIndex
    重置为0