为什么以下内容从true
转到false
;
var r = /e/gi;
r.test('e'); // true
r.test('e'); // false
然后继续切换true
,false
,true
,false
......
答案 0 :(得分:6)
因为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
上引用MDN文档
lastIndex
是正则表达式的读/写整数属性,指定开始下一个匹配的索引。 ...仅当正则表达式使用“g”标志指示全局搜索时才设置此属性。以下规则适用:
- 如果
lastIndex
大于字符串的长度,test()
和exec()
失败,则lastIndex
设置为0.- 如果
lastIndex
等于字符串的长度,并且正则表达式与空字符串匹配,则正则表达式匹配从lastIndex
开始的输入。- 如果
lastIndex
等于字符串的长度,并且正则表达式与空字符串不匹配,则正则表达式输入不匹配,lastIndex
重置为0。 强>- 否则,
醇>lastIndex
将设置为最近一次匹配后的下一个位置。
上面的粗体文字回答了您观察到的行为。在第一次匹配e
后,lastIndex
设置为1
,以指示应尝试下一场比赛的索引。根据上面的第三点,由于lastIndex
等于字符串的长度而正则表达式与空字符串不匹配,因此返回false
并将lastIndex
重置为0