为什么我看到使用alert()与不使用alert的JavaScript逻辑行为循环不一致
Why am I seeing inconsistent JavaScript logic behavior looping with an alert() vs. without it?
我有类似于在对象数组中过滤条目的代码:
var filterRegex = new RegExp(".*blah.*","ig");
if (filterRegex.test(events[i].thing) && events[i].show) {
console.log("SUCCESS: filtering thing " + i + " " + events[i].thing);
events[i].show = false;
numevents--;
}
我得到了与此if条件不一致的结果(使用Firebug进行检查,两个条件分别为true,但有时整个表达式的计算结果为false)。然而,如果我真的把一个调用的alert()
放在这个if语句中(如第4行),它就会变得一致,并且我得到了我想要的结果。
你能看出这个逻辑有什么错误吗?告诉我为什么它不总是产生预期的结果?
好的,我现在看到了。问题的关键是使用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);
上面的例子创建了一个非常简单的regex的实例:它匹配字符串中任何地方的大写或小写"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标志,生活很容易:
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表达式单独计算为true,但在组合时不计算为true。
你确定这两个表达式每次都会产生一个布尔值吗?(好吧,让regex.test()
不产生布尔值是很困难的,但event.show
呢。这有时可能是未定义的吗?
你说event[0].show
时指的是正确的索引吗?你不是说event[i].show
吗?
这似乎是事件数组面临某种竞争条件的原因,这就是为什么当您使用alert()时,一切都很好。
- 只有当alert()在带有AJAX的internet explorer中使用时,Javascript才会更新UI
- Javascript仅适用于alert()和Debug模式
- Javascript alert()在没有const字符串的情况下不显示
- C# WebView 不理解 JavaScript 调用 alert()(Windows 8 XAML 应用程序)
- Javascript表单if have alert停止重定向save.php
- 为什么不应该't我在JavaScript中使用Alert
- 如果我在其中使用alert,Javascript代码就可以工作,否则它'It’不起作用
- 我如何模仿Javascript中的alert()功能来阻止页面
- 自定义Javascript Alert Popup onclick svg路径
- Javascript问题,脚本只能100%使用alert();到位ODD
- 在我执行alert()之前,Javascript array.length为0
- Javascript alert() 在弹出窗口中
- 在 Javascript 中使用警报时出错(对象的属性“alert”不是函数)
- JavaScript 中的 alert(status) 总是导致 null
- echo php javascript alert?
- Alert innerHTML of element with javascript
- Asp.Net Page JavaScript alert 命令可更改程序行为
- 在 JavaScript alert() 中打印 EL 字符串 “RP” 会导致 JS 错误“'RP'
- view php msg in alert javascript
- 如果变量为真,DON'T SHOW alert?Javascript