【问题标题】:if statement checking for multiple boolean conditionsif 语句检查多个布尔条件
【发布时间】:2017-02-21 03:17:57
【问题描述】:

我有一个 if 语句必须为每个条件调用函数 checkEmpty()。

function checkFormFilled(evt){
    var isFilled;
    if(checkEmpty('id1', 'class1') && //condition 1
       checkEmpty('id2', 'class2') && //condition 2
       checkEmpty('id3', 'class3') && //condition 3
       checkEmpty('id4', 'class4')){ //condition 4
       evt.preventDefault();
       isFilled = true;
    }
    return isFilled;
}

问题是当条件 1 为假(任何前面的条件为假)时,跳到 evt.preventDefault() 行,不会调用其他后续 checkEmpty() 函数。

我想在所有条件都返回 true 时调用 evt.preventDefault()。

还有其他方法可以使这项工作吗?

【问题讨论】:

  • 这正是你在做的,有什么问题?
  • 当第一个条件 1 为假时,它跳到 evt.preventDefault() 行。在调用 evt.preventDefault() 行之前,我需要调用所有四个条件。
  • 那是因为 AND 运算符在第一个 false 之后关闭。你需要一个 OR 运算符。
  • @haeminish 这可以进一步优化! .. 是什么?
  • @ibrahimmahrir 这只是一个字符串。

标签: javascript if-statement


【解决方案1】:

尝试逻辑运算符||,即OR

【讨论】:

    【解决方案2】:

    function checkEmpty(val){ return val;}
    function _conditioncheck(e){
        if(checkEmpty(false) && checkEmpty(true) && checkEmpty(true) && checkEmpty(true)){ 
    	console.log('true....');
    	e.preventDefault();
        }
    }	
    <input type="button" id="click" value="Click ME" onclick="_conditioncheck(event);" />	

    它对我有用。

    【讨论】:

      【解决方案3】:

      如果至少有一个条件为 False,则不会进入 IF 块。对于多个 && 语句,一旦收到 FALSE,则不再检查所有其他后续 && 语句并返回 FALSE。

      【讨论】:

        【解决方案4】:

        这叫短路。

        1- 在由 && 组成的条件检查中,如果第一个元素的计算结果为 false,则忽略所有剩余条件,对整个条件返回 false。

        2- 在由 || 组成的条件检查中,如果第一个元素的计算结果为真,则忽略所有剩余条件,为整个条件返回真。


        他编辑了问题。这不再是真的了。我正在制作社区 wiki,留在这里。

        解决此问题的最佳方法是使用|| 或在条件检查中重新排序子条件序列,以便在需要时对其他元素进行测试。

        【讨论】:

          【解决方案5】:

          如果你

          必须为每个条件调用函数 checkEmpty()。

          我想在所有条件都返回 true 时调用 evt.preventDefault()。

          如果您确定 checkEmpty() 返回一个布尔值,您可以使用 bitwise and (&) 运算符:

          function checkEmpty(x) {
            console.log('checkEmpty called for ' + x);
          
            return false;
          }
          if(checkEmpty('..1', '....') & //condition 1
             checkEmpty('..2', '....') & //condition 2
             checkEmpty('..3', '....') & //condition 3
             checkEmpty('..4', '....')){ //condition 4
            console.log('inside if');
          }
          

          输出:

          checkEmpty called for ..1
          checkEmpty called for ..2
          checkEmpty called for ..3
          checkEmpty called for ..4
          

          fiddle demo here

          【讨论】:

          • 注意:如果checkEmpty() 可能返回truefalse 以外的值,请不要使用&,因为它是按位运算符。示例:1 & 10 返回0,如果它是一个逻辑运算符,这不是您所期望的(因为truthy && truthytrue)。
          • OTOH,如果你不知道checkEmpty() 是否总是返回一个布尔值,你可以对它们进行双重否定:if(!!checkEmpty('..1', '....') & !!checkEmpty('..2', '....') ...(注意在每个checkEmpty() 调用之前添加!!)。
          【解决方案6】:

          假设你有一个对象数组,你可以试试every 函数。

          例子

          var array = [];
          
          for (var i = 0; i < 4; i++)
          {
            array.push({
              id: i, bool: true
            });
          }
          
          function check(item)
          {
            return item.bool == true || false;
          }
          
          if (array.every(check))
          {
            console.log("all true");
          }
          else
          {
            console.log("return false instead");
          }
          
          
          
          // Just an example of something that is false
          array[1].bool = false;
          
          if (!array.every(check))
          {
            console.log("something is false");
          }

          【讨论】:

            【解决方案7】:

            您现在对链接的&amp;&amp; 运算符所做的事情是说如果所有这些事情都是真的,那么event.preventDefault。如果你真的需要检查每一个条件并继续,那么你应该使用逻辑OR 运算符||

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-04-01
              • 2015-05-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-12-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多