为什么下面从去true到false;
var r = /e/gi;
r.test('e'); // true
r.test('e'); // false
Run Code Online (Sandbox Code Playgroud)
然后继续切换true,false,true,false......
因为g旗帜.它开始记住匹配的最后一个索引,当你r.test下次做的时候,它从那个索引开始.这就是它true和之间交替的原因false.试试这个
var r = /e/gi;
console.log(r.test('e'));
# true
console.log(r.lastIndex);
# 1
console.log(r.test('e'));
# false
console.log(r.lastIndex);
# 0
console.log(r.test('e'));
# true
console.log(r.lastIndex);
# 1
console.log(r.test('e'));
# false
Run Code Online (Sandbox Code Playgroud)
引用MDN文档RegExp.lastIndex,
它
lastIndex是正则表达式的读/写整数属性,指定开始下一个匹配的索引....仅当正则表达式使用"g"标志指示全局搜索时才设置此属性.以下规则适用:
- 如果
lastIndex大于字符串的长度大,test()并且exec()失败,则lastIndex设置为0.- 如果
lastIndex等于字符串的长度,并且正则表达式与空字符串匹配,则正则表达式匹配从开始的输入lastIndex.- 如果
lastIndex等于字符串的长度,并且正则表达式与空字符串不匹配,则正则表达式与输入不匹配,并lastIndex重置为0.- 否则,
lastIndex设置为最近一次匹配后的下一个位置.
上面的粗体文字回答了您观察到的行为.在第一次匹配之后e,将lastIndex设置为1,以指示应尝试下一次匹配的索引.根据上面的第三点,由于lastIndex它等于字符串的长度并且正则表达式与空字符串不匹配,因此它返回false并重置lastIndex为0.