【问题标题】:Converse implication logic using exponentiation operator in ES7?在 ES7 中使用幂运算符的逆蕴涵逻辑?
【发布时间】:2016-02-25 09:18:57
【问题描述】:

据此link,我们知道

console.log(false ** false == true);  // true
console.log(false ** true == false);  // true
console.log(true ** false == true);  // true
console.log(true ** true == true);  // true

我认为我们可以在 ES7 中实现 Converse implicationexponentiation operator

给定函数f()g()的返回值为boolean。所以我们可以使用这个简单的代码

if (g() ** f()) { 
   // 
}

替换

if ((g() && f()) || !f()) {
    //
}

一些测试代码是here。在 ES7 下是否有效?

【问题讨论】:

  • 就算是有效的,用它有什么意义呢?我看不出它使表达更有效,也更清晰。
  • 改用g() || !f(),它的可读性更强。试试看:[[false, false], [false, true], [true, false], [true, true]].map(function(a) { return a[0] || !a[1]; })

标签: javascript boolean-logic boolean-expression short-circuiting ecmascript-2016


【解决方案1】:

声明:

if ((g() && f()) || !f()) {

由于短路机制,有几个潜在的不良影响:

  1. 如果g() 是假的,f() 被评估一次,取反的结果用于分支。
  2. 如果g() 为真,并且第一个 f() 也为真,则评估if 块的内容。
  3. 如果g() 为真,而第一个 f() 为假,则再次评估f() - 这可能是一个代价高昂的操作,并且可能返回一个完全不同的值,然后否定并用于分支。

声明:

if (g() ** f())

两个函数的结果都只计算一次,然后将结果逻辑组合到分支。

根据所需的副作用和/或评估顺序,您应该使用:

let gVal = g(), fVal = f();
if(gVal || !fVal) { ... }

或者

if(g() || !f()) { ... }

说了这么多,回答这个问题本身... ECMAScript 2016 尚未最终确定,但您的假设似乎是正确的。

【讨论】:

    【解决方案2】:

    是的,在 ES6 中,幂运算可用于逆蕴涵。

    你可以验证这个here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      相关资源
      最近更新 更多