为什么我看到不一致的JavaScript逻辑行为在alert()中循环而没有它?

这个问题在这里已经有了答案:

  • 为什么带有全局标志的RegExp会给出错误的结果? 5个答案

  • 好的,我现在看到它。 解决问题的关键是使用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?

    下一篇: Getting parts of a URL (Regex)