正则 + reduce时遇到的一个坑

新手上路,请多包涵

最近在通过数组的 reduce 方法筛选非字母字符时遇到一个比较迷惑的问题,代码如下:

const s = "ab-cd"
const rule = /[A-Z]|[a-z]/g
const symbols = s.split('').reduce((arr, char, index) => {
    if (!rule.test(char)) {
      console.log(!rule.test(char), '///')
      arr.push({ char, index})
    }
    return arr
  }, [])
console.log(symbols)

运行后的结果如下:
image.png
为什么 false 也能执行 push 。。。。

但是如果把正则改成 /[A-Z]|[a-z]/, 最后的结果就是正确的。

有大佬可以帮忙解惑嘛~~

阅读 1.6k
1 个回答
究其原因,还是lastIndex这个参数导致的。由于g修饰符会触发RegExp对象使用lastIndex变量缓存上一次匹配成功的位置,而这一属性与字符串参数无关。中途更换字符串不能触发重置lastIndex的操作,只有匹配失败之后,才会重置

https://www.cnblogs.com/Bacra...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题