【问题标题】:Why when looping regexObj.test(str) is logging each iteration different result? [duplicate]为什么在循环 regexObj.test(str) 时记录每次迭代不同的结果? [复制]
【发布时间】:2016-12-20 08:34:16
【问题描述】:

下面的运行代码记录了每次迭代的不同结果

var re = /[a-z]+/g;
var str= 'test';

for(var i = 0; i < 5; i++) {

    console.log(re.test(str));

}
// result : first iteration logs `true`, second `false`, third `true` ...

有人可以解释一下,为什么会这样?为什么在删除 /g 全局修饰符时它会起作用?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    如果你检查MDN documentation of test,你会发现它不是一个纯函数,但它有一个副作用,会改变你的re变量:

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

    当使用/.../g 修饰符时,在用尽所有匹配项(即第一次迭代)后,正则表达式位置将位于字符串的末尾,它将不匹配,但似乎有一个未定义的行为会重置正则表达式位置到字符串的开头(根据您在第 3 次迭代中观察到的情况)

    没有全局修饰符,正则表达式可以从开始位置执行多次

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多