代码之家  ›  专栏  ›  技术社区  ›  Gab Royer

javascript行为怪异

  •  1
  • Gab Royer  · 技术社区  · 15 年前

    下面的函数不能像我认为的那样工作。出于某种原因,只要validate函数返回false,循环就会中断。为什么会这样?

    这是我的代码:

    function validateGroup(input) {
        if (!input.value.match(/^[0-9]{0,2}$/)) {
            $(input).addClass("invalidField");
            return false;
        }
        $(input).removeClass("invalidField");
        return true;
    }
    
    function validateClass(input) {
        if (!input.value.match(/^[a-zA-Z0-9-]{0,9}$/)) {
            $(input).addClass("invalidField");
            return false;
        }
        $(input).removeClass("invalidField");
        return true;    
    }
    
    function validateData() {
        var rows = document.getElementsByTagName("tbody")[0].getElementsByTagName("tr");
    
        var valid = true;
    
        for (var i = 0, arrayLength = rows.length; i < arrayLength; ++i) {
            valid = valid && validateClass(rows[i].getElementsByTagName("input")[0]);
            valid = valid && validateGroup(rows[i].getElementsByTagName("input")[1]);
            valid = valid && validateGroup(rows[i].getElementsByTagName("input")[2]);     
        }
        return valid;
    }
    

    谢谢!

    5 回复  |  直到 15 年前
        1
  •  12
  •   Shaun    15 年前

    如果valid为false,则语句valid&validateClass(…)将不会调用validateClass方法。我想你要做的是把他们的顺序改成

    valid = validateClass(rows[i].getElementsByTagName("input")[0]) && valid;
    valid = validateGroup(rows[i].getElementsByTagName("input")[1]) && valid;
    valid = validateGroup(rows[i].getElementsByTagName("input")[2]) && valid;
    

    如果javascript已经知道结果是错误的,那么它就不需要评估表达式的其余部分。

        2
  •  2
  •   Ciarán Walsh    15 年前

    似乎您希望在每次迭代中运行validate函数,即使_valid_已经设置为false。但是,您使用的&操作将短路,因此尽管循环将继续,但在后续迭代中将不会调用validate函数。

    一个非常简单的替代方案,可以按照你想要的方式工作:

    for (var i = 0, arrayLength = rows.length; i < arrayLength; ++i) {
       if(!validateClass(rows[i].getElementsByTagName("input")[0]))  valid = false;
       if(!validateGroup(rows[i].getElementsByTagName("input")[1]))  valid = false;
       if(!vvalidateGroup(rows[i].getElementsByTagName("input")[2])) valid = false;
    }
    
        3
  •  0
  •   Pablo    15 年前

    听起来这就是函数的目的。三行

    valid = valid && validate...
    

    意味着如果任何一个validate函数命中false valid 在循环的其余部分将保持为假。

        4
  •  0
  •   RamboNo5    15 年前

    我想是因为 惰性评价 方案javascript与 && . 尝试一个 & 相反。

    Short-circuit evaluation: Support in common programming languages

        5
  •  0
  •   erikkallen    15 年前

    这叫做短路。快速修复:将每行替换为

    valid = validateClass(rows[i].getElementsByTagName("input")[0]) && valid;