Javascript逻辑运算符和'if'条件

时间:2017-05-17 07:59:37

标签: javascript logical-operators

if条件中,我检查num1num2是否可以将它们除以2以确定它们是否为奇数。正如您所看到的,我正在检查是否除以2,num1num2的答案是否为0。当我将true参数作为偶数输入时,我不确定为什么评估为num2

function areBothOdd(num1, num2) {
  if(num1 % 2 === 0 && num2 % 2 === 0){
    return false;
  }
  else {
    return true;
  }
}

var output = areBothOdd(7, 4);
console.log(output); // --> true

为什么我会收到true

为什么这段代码评估为假?

function areBothOdd(num1, num2) {
  if(num1 % 2 !== 0 && num2 % 2 !== 0){
    return true;
  }
  else {
    return false;
  }
}

var output = areBothOdd(7, 4);
console.log(output); // --> false

6 个答案:

答案 0 :(得分:1)

您需要逻辑OR ||,而不是逻辑AND。

您的测试

num1 % 2 === 0

为偶数返回true,因为偶数除0之后的余数为2

function areBothOdd(num1, num2) {
    if (num1 % 2 === 0 || num2 % 2 === 0) {
        return false;
    } else {
        return true;
    }
}

console.log(areBothOdd(7, 4)); // --> false
console.log(areBothOdd(7, 5)); // --> true
console.log(areBothOdd(4, 4)); // --> false

对于逻辑AND的检查,您需要否定部分并将逻辑运算符从OR更改为AND,因为De_Morgan's laws描述了转换。

num1 % 2 === 0 || num2 % 2 === 0    both parts 
num1 % 2 !== 0 && num2 % 2 !== 0    are equal
         ^^^^  ^^          ^^^

function areBothOdd(num1, num2) {
    if (num1 % 2 !== 0 && num2 % 2 !== 0) {
        return false;
    } else {
        return true;
    }
}

console.log(areBothOdd(7, 4)); // --> false
console.log(areBothOdd(7, 5)); // --> true
console.log(areBothOdd(4, 4)); // --> false

答案 1 :(得分:0)

它总是评价为真,因为什么&&运算符的作用是检查两个条件,如果两个条件都为真,则块将被执行,否则块将被执行。

%将返回永远不会为零的余数。在你的情况下,计算模块,即7%2将导致1。 要么你需要使用逻辑!!操作员或您可以改变您的状况。



function areBothOdd(num1, num2) {
  if(num1 % 2 === 0 && num2 % 2 === 0){
    return false;
  }
  else {
    return true;
  }
}

var output = areBothOdd(7, 4);
console.log(output);






var x = 7%2;
document.getElementById("demo").innerHTML = x;

<span id="demo"></span>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

由于Short-Circuit评估。简而言之,您的num2 % 2 === 0部分条件将不会被评估。 7 % 2不等于零,因此您的函数返回true。就是这样。

引用MDN:

  
      
  • false&amp;&amp; (任何)短路评估为假。
  •   
  • true || (任何)短路评估为真。
  •   
     

请注意,不评估上述表达式的任何部分,   所以这样做的任何副作用都不会生效

答案 3 :(得分:0)

第一案例:

function areBothOdd(num1, num2) {
  if(num1 % 2 === 0 && num2 % 2 === 0){
    return false;
  }
  else {
    return true;
  }
}

var output = areBothOdd(7, 4);
console.log(output); // --> true

此处if condition失败,因为(num1 % 2 === 0 && num2 % 2 === 0)将成为(false && true),因为7是奇数,4是偶数。因此,它将执行else块并且返回true

第二案例:

function areBothOdd(num1, num2) {
  if(num1 % 2 !== 0 && num2 % 2 !== 0){
    return true;
  }
  else {
    return false;
  }
}

var output = areBothOdd(7, 4);
console.log(output); // --> false

此处再次if condition失败,因为(num1 % 2 !== 0 && num2 % 2 !== 0)将成为(真&amp;&amp; false)。因此,它将执行else块并返回false

结论:建议使用logical OR(||),使用logical AND(&&)代替function areBothOdd(num1, num2) { if(num1 % 2 === 0 || num2 % 2 === 0){ return false; } else { return true; } } var output = areBothOdd(7, 4); console.log(output); // --> false

<强>样本

getOriginDestinationList()

答案 4 :(得分:0)

You can change the if condition.In this case,if num1 is odd it doesnot satisfy the if condition and therefore returns true which is else condition.
You can try something like this.
function areBothOdd(int num1,int num2){
    if(num1%2 !==0){
        if(num2%2!==0){
            return true;
        }
        return false;
    }
    return false;
}

答案 5 :(得分:0)

  

当我将true参数作为偶数输入时,我不确定为什么它会评估为num2。为什么我会成真?

有三种可能的条件要考虑:

  1. 两者都很奇怪,
  2. 两者都是偶数,或
  3. 一个是奇数,一个是偶数
  4. 您的第一个示例检查条件2(均为偶数)并仅为此返回false。条件1和3由else语句捕获,并且都返回true(这不是您想要的,您希望条件3返回false)。提供数字74时,这对应于条件3,它说明了函数如何失败。

      

    为什么这段代码评估为假?

    你的第二个例子是正确的,它检查条件1(都是奇数),然后返回true。否则,对于条件2和3,它将返回false,这就是您想要的。

    您的第一个代码示例已评论:

    &#13;
    &#13;
    function areBothOdd(num1, num2) {
      if(num1 % 2 === 0 && num2 % 2 === 0){ // if both are even
        return false;
      }
      else { // otherwise, if one is even or both are odd
        return true;
      }
    }
    
    var output = areBothOdd(7, 4); // one number is even
    console.log(output); // --> true
    &#13;
    &#13;
    &#13;

    (请注意,num % 2 === 0是一种测试偶数的方法,而num % 2 !== 0num % 2num & 1是测试奇数的方法。)

    通过一些小的更改,该函数将按预期工作(对应于您的代码示例2):

    &#13;
    &#13;
    function areBothOdd(num1, num2) {
      if(num1 % 2 && num2 % 2){ // if both are odd
        return true;
      }
      else { // otherwise, if one is even or both are even
        return false;
      }
    }
    
    var output = areBothOdd(7, 4); // one number is even
    console.log(output); // --> false
    &#13;
    &#13;
    &#13;

    或者只是简单地说:

    function areBothOdd(num1, num2) {
      return num1 & 1 && num2 & 1
    }
    

    演示代码和测试:

    &#13;
    &#13;
    function areBothOdd(num1, num2) {
      if(num1 % 2 && num2 % 2){ // if both are odd
        return true;
      }
      else { // otherwise, if one is even or both are even
        return false;
      }
    }
    
    // tests
    
    test(1, 1, true);  // both are odd
    test(2, 2, false); // none are odd
    test(1, 2, false); // only one is odd
    test(2, 1, false); // only one is odd
    
    // test function
    
    function test(num1, num2, expected) {
      console.log(
        areBothOdd(num1, num2) == expected ? 
          'Passes' : 'Fails'
      )
    }
    &#13;
    &#13;
    &#13;