为什么我看到不一致的JavaScript逻辑行为在alert()中循环而没有它?
这个问题在这里已经有了答案:
好的,我现在看到它。 解决问题的关键是使用g
(全局匹配)标志:当为正则表达式指定时,它将被设置为可以多次执行,每次从它最后一次停止的地方开始执行时间。 它在lastIndex
属性中保存了一系列“书签”:
var testRegex = /blah/ig;
// logs: true 4
console.log(testRegex.test("blah blah"), testRegex.lastIndex);
// logs: true 9
console.log(testRegex.test("blah blah"), testRegex.lastIndex);
// logs: false 0
console.log(testRegex.test("blah blah"), testRegex.lastIndex);
上面的例子创建了一个非常简单的正则表达式的实例:它匹配字符串中任何位置的“blah”,大写或小写,并且可以匹配多次( g
标志)。 第一次运行时,它匹配第一个“blah”,并将lastIndex
设置为4(第一个“blah”之后的空间索引)。 第二次运行在lastIndex
处开始匹配,匹配第二个blah,并将lastIndex
设置为9 - 一个超过数组末尾。 第三次运行不匹配 - lastIndex
是假的 - 并将lastIndex
设置为0.第四次运行因此将具有与第一次相同的结果。
现在,你的表情比我的表情更加贪婪:它会匹配“blah”之前或之后的任意数量的任何字符。 因此,不管你测试什么字符串,如果它包含“blah”,它将始终匹配整个字符串,并将lastIndex
设置为刚刚测试的字符串的长度。 意思是,如果你要两次调用test()
,第二次测试总是失败:
var filterRegex = /.*blah.*/ig;
// logs: true, 9
console.log(filterRegex.test("blah blah"), filterRegex.lastIndex);
// logs: false, 0
console.log(filterRegex.test("blah blah"), filterRegex.lastIndex);
幸运的是,由于您在调用test()
之前立即创建了regex,并且绝不会多次调用test()
,所以您将永远不会遇到意外的行为...... 除非您使用的调试器允许您添加另一个调用在侧面test()
。 对。 使用Firebug运行时,包含您对test()
调用的监视表达式会导致在您的代码或监视结果中显示间歇的false
结果,具体取决于哪一个首先获取它。 慢慢地让你疯狂......
当然,没有g标志,livin很容易:
var filterRegex = /.*blah.*/i;
// logs: true, 0
console.log(filterRegex.test("blah blah"), filterRegex.lastIndex);
// logs: true, 0
console.log(filterRegex.test("blah blah"), filterRegex.lastIndex);
建议
我无法想象有两种JavaScript表达式单独计算为真的情况,但是在组合时没有。
你确定这两个表达式每次都会产生一个布尔值吗? (好吧,要使regex.test()
不产生布尔值是很困难的,但是event.show
怎么event.show
?可能有时候不确定吗?
当你说event[0].show
,你是不是指event[i].show
?
看起来你正面临事件数组的一些竞争条件,这就是为什么当你使用alert()时一切正常。
链接地址: http://www.djcxy.com/p/76777.html上一篇: Why am I seeing inconsistent JavaScript logic behavior looping with an alert() vs. without it?