首先大家看下下面的代码
var reg = /\d/;
console.log( reg.test("1") );
console.log( reg.test("1") );
输出都是true。
好的,接下来我们看这段代码
var reg = /\d/g;
console.log( reg.test("1") );
console.log( reg.test("1") );
一个true,一个false,这是什么情况?
正则对象有一个lastIndex属性,它记录的是下一次匹配开始的位置。
var reg = /\d/g;
console.log( reg.test("1"), reg.lastIndex );
console.log( reg.test("1"), reg.lastIndex );
我们可以看到, 第一次匹配, lastIndex 记录下一次匹配的起始位置,值为 1。
第二次匹配的时候 从 "1" 字符串索引 1 的位置匹配,因为这个字符串只有一个字符,匹配失败,索引值复位,为0。
我们再看下面的代码:
console.log( /\d/g.test("1"), reg.lastIndex );
console.log( /\d/g.test("1"), reg.lastIndex );
为什么两次都是true?
因为/\d/g.test("1")使用的是直接正则字面量,相当于每次都初始化一个正则对象,lastIndex值每次都为初始值0。