【问题标题】:Boolean equality布尔等式
【发布时间】:2014-10-31 21:19:25
【问题描述】:

我从考试题中得到了这个,但无法理解解决方案的工作原理。如果“x”和“y”值相等,该函数应该返回“true”,否则返回 False。

解决办法:

function equal_boolean (x , y) {
  return x ? y : y ? x : true;
}

为什么会这样?据我所知,结果是评估 X 是否为真。如果 X 为真,它将返回 Y。X 应该如何为“真”?

如果不是,它将评估 Y 是否为真,如果为真,则返回 X,如果不是,则返回 True。

我的理解有问题吗?

【问题讨论】:

  • 只是:return x === y;
  • @dfsq 他的问题是为了理解一个练习,而不是如何提高效率。
  • 这里要知道的重要一点是,在 javascript 的条件表达式中(例如三元组的第一部分),独立的引用或文字被隐式转换为布尔值。然后三元更明确地读取!! x ? y : !! y ? x : true;。这不是一个有效的相等测试,但您可以在此处看到:jsfiddle.net/7wamf2x9/1(返回类型既不是布尔值,也不是正确的结果)。

标签: javascript boolean logic


【解决方案1】:
return x ? y : y ? x : true;

解析为

if x
   return y       // if y is true, then x == y. if y is false, then x != y
else (x is false)
   if y
      return x    // x is false and y is true, y != x, return false
   else
      return true // x is false and y is false, return true

这当然是表达布尔相等的一种非常复杂的方式(又名Logical biconditional 又名iff)。更自然的是这样的表达:

 (x && y) || (!x && !y)

【讨论】:

  • 比我的好多了。 :( ... :)
  • 谢谢!这个真的有帮助! :D
【解决方案2】:

您应该做的第一件事是将三元运算符组合在一起:

(x ? y : (y ? x : true))
  • 如果xtrue,则返回y,它的值也告诉你xy是否相等
  • 如果xfalse,那么从第二个三元开始:
    • 如果ytrue,则返回x (false),因为两者不相等
    • 如果yfalse,那么xy相等,所以返回true

【讨论】:

    【解决方案3】:

    让我们尝试扩展一下:

    var myBool = x ? y : (y ? x : true)
    
    return myBool;
    

    第一块

    x ? y : ...
    

    如果 X 为真,则返回 Y 的值。如果 Y 恰好为真,则两者相等。否则返回 false(不匹配)。

    如果 X 为假,则第二块:

    y ? x : true
    

    如果 Y 为真,则返回 X。X 为假,因此返回假(不匹配) 如果 Y 为假,则返回真 - 两个值都是假的。

    【讨论】:

      【解决方案4】:
      • 首先识别表达式

        return x ? y : y ? x : true;
        //turns into
        return x ? y : (y ? x : true);
        
      • if 语句替换?: 三元运算符

        if (x) {
            return y;
        } else {
            //here x is false, so we will be able to replace x by false in the next step
            if (y) {
                return x;
            } else {
                return true;
            }
        }
        
      • 使if 语句更详细,将return x 替换为return false

        if (x == true) {
            return y;
        } else {
            if (y == true) {
                return false;
            } else {
                return true;
            }
        }
        
      • 最后将return y;替换为if (y == true) { return true; } else { return false; },并检查所有可能性

        if (x == true) {
            if (y == true) {
                return true; // x == true and y == true
            } else {
                return false; // x == true and y == false
            }
        } else {
            if (y == true) {
                return false; // x == false and y == true
            } else {
                return true; // x == false and y == false
            }
        }
        

      它有效。 (只要 x 和 y 是布尔值)

      【讨论】:

        猜你喜欢
        • 2011-02-27
        • 2017-12-18
        • 2015-03-18
        • 1970-01-01
        • 1970-01-01
        • 2012-08-08
        • 2018-09-27
        • 2019-11-03
        • 2020-10-23
        相关资源
        最近更新 更多