js正则表达式lastIndex存在有什么用?

比如我测试一个字符窜

    let reg = /\d/g;
    let str = "a1b2c3d4";
    let str2 = "e6f7g8";
    console.log(reg.test(str),reg.lastIndex);
    console.log(reg.test(str),reg.lastIndex);
    console.log(reg.test(str),reg.lastIndex);
    console.log(reg.test(str),reg.lastIndex);
    console.log(reg.test(str2),reg.lastIndex); //期望输出的是true,结果是false
    console.log(reg.test(str),reg.lastIndex);

输出是:

true 2
true 4
true 6
true 8
false 0
true 2

当我传入新的str字符串,reg应该再重头开始匹配,换句话说,lastIndex应该是和str,reg都关联才对。那为什么要在reg中保存这个变量呢?有什么意义呢?如何解决上述情况的问题。

阅读 3k
3 个回答

lastindex是可读写的,也就是可以让你手动配置开始匹配的位置。在某种使用场景下可以加快匹配的速度

换字符串的时候重置为0

如一楼仁兄所说:lastIndex 是正则对象的一个可读写属性,用于标记上次匹配到的字符的位置。
ES3 中同一个正则表达式直接量始终返回一个 RegExp 对象;ES5 中同一个正则表达式直接量每次执行都会返回一个新的 RegExp 对象。
可以尝试每次都信创建一个新的正则对象,解决 reg.test(str2),reg.lastIndex 输出 false 的问题。

function regFun(str) { 
    let reg = new RegExp(/\d/, 'g');
    console.log(reg.test(str), reg.lastIndex);
}
regFun(str);    // true 2
regFun(str);    // true 2
regFun(str);    // true 2
regFun(str);    // true 2
regFun(str2);   // true 2
regFun(str);    // true 2
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题