根据这个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中通过exponentiation operator实现Converse implication

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

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


取代

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


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

最佳答案

该声明:

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


由短路机制引起的潜在潜在不良影响:


如果g()虚假,则对f()进行一次评估,并将求反的结果用于分支。
如果g()是真实的,并且第一个f()也是真实的,则评估if块的内容。
如果g()是真实的,而第一个f()是虚假的,则再次评估f()-这可能是一项昂贵的操作,并且可能返回完全不同的值,然后取反并用于分支。


该声明:

if (g() ** f())


结果这两个函数只进行了一次评估,然后将结果进行逻辑组合以分支。

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

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


要么

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




话虽如此,回答问题本身... ECMAScript 2016尚未最终确定,但您的假设似乎正确。

09-18 04:04