在ES7中使用求幂运算符转换蕴涵逻辑

Converse implication logic using exponentiation operator in ES7?

本文关键字:转换 运算符 ES7      更新时间:2023-09-26

通过这个链接,我们知道

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中的exponentiation operator来实现Converse蕴涵。

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

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

取代

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

这里有一些测试代码。根据ES7,它是否有效?

语句:

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

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

  1. 如果g()是falsy,则对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尚未最终确定,但您的假设似乎是正确的。

是的,指数可以用于ES6中的逆蕴涵。

您可以在此处验证