1

このリンクごとに、私たちは知っています

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 含意を実装できると思います。exponentiation operator

function の戻り値が与えられ、f()g()ですboolean。したがって、この単純なコードを使用できます

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

交換する

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

いくつかのテスト コードはこちらにあります。ES7で有効ですか?

4

2 に答える 2

2

ステートメント:

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

短絡メカニズムに起因する、いくつかの潜在的に悪い影響があります。

  1. g()が偽の場合は、f()一度評価され、否定された結果が分岐に使用されます。
  2. g()真で、最初の f()ものも真である場合、ifブロックの内容が評価されます。
  3. ifg()が true で、最初 f()が falseの場合、f()再度評価されます。これはコストのかかる操作であり、まったく異なる値を返す可能性があり、否定されて分岐に使用されます。

ステートメント:

if (g() ** f())

両方の関数が 1 回だけ評価され、結果が論理的に結合されて分岐します。

必要な副作用や評価順序に応じて、次のいずれかを使用する必要があります。

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

または

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

そうは言っても、質問自体に答えるために... ECMAScript 2016はまだ完成していませんが、あなたの仮定は正しいようです。

于 2015-11-23T10:21:18.063 に答える