JavaScript正则踩坑——RegExp.test()和RegExp.lastIndex

RegExp.test()和RegExp.lastIndex

首先感谢同学帮助分析问题,最终才找到问题。

话不多说,直接上代码说问题

  1. 第一版代码
    const result = parent.filter((child: ITree): boolean =>{
      console.log(reg.test(child.name) || reg.test(child.id)); 
      return reg.test(child.name) || reg.test(child.id);
    })
    console.log(result);

// 输出结果 
// true
// true
// [{...}]
  1. 第二版代码
    const result = parent.filter((child: ITree): boolean =>{
      const isMatch = reg.test(child.name) || reg.test(child.id)
      console.log(isMatch); 
      return isMatch;
    })
    console.log(result);

// 输出结果 
// true
// false
// [{...}]

正是这微妙的变化,导致找了半天的问题愣是没找出来。


后查mdn发现有这么一句描述

. 如果正则表达式设置了全局标志,test() 的执行会改变正则表达式 lastIndex属性。连续的执行test()方法,后续的执行将会从 lastIndex 处开始匹配字符串,(exec() 同样改变正则本身的 lastIndex属性值).

那这就是问题所在了,每次test()都会改变下一次的匹配开始位置,怪不得后面的匹配结果是false。


本来以为这是个常用的test()方法,放心大胆的就用了,没想到这个方法还有这么一手!

所以学习方法的时候要全面了解一下,遇到方法出问题了就先去查查文档,免得用错了还毫不知情,找来找去浪费太多时间。

你可能感兴趣的:(JavaScript)