8

2つは同一ですか?

あなたが持っていると仮定します:

var x = true;

そして、次のいずれかを持っています。

x && doSomething();

また

if(x) doSomething();

2 つの構文の間に違いはありますか? 素敵な砂糖に出くわしましたか?

4

5 に答える 5

7

厳密に言えば同じ結果になりますが、前者を別の条件として使用すると、異なる結果が得られます。これは、 の場合x && doSomething()doSomething()が成功を示す値を返すためです。

于 2012-09-30T19:22:29.027 に答える
6

いいえ、それらは同一ではありません。whileifステートメントですが、AND演算子はです。

つまり、その結果を他の式で使用できますが、if ステートメントでは使用できません。

var result = x && doSomething();

しかし、あなたの場合、どちらも同じ効果があります。より読みやすく、プログラム構造をより適切に表すものを使用してください。if 文をお勧めします。

于 2012-09-30T19:27:21.847 に答える
3

簡単な答え:いいえ。

長い答え:

@Stevex && doSomething()が述べた A はであり、

一方if(x) doSomething();ステートメントは、

@Daniel Li と @Bergi が示唆するように、次のように考えてください。

  • が計算されます (ここで値を返すことになっています)。

  • ステートメントが宣言されています(ここ値を返すことは想定されていません。副作用を考えてください)。

なぜ混乱するのですか?

  • JSは私たちが書くことを可能にします( thatExpression );
  • JSは私たちが書くことを可能にしますthatExpression;

どちらも何らかのdoNothingWithValueOfステートメントを想定しています。

どのように選択するのですか?

使いますか:

  • doSomething()として
    • 表現、考えIsMyObjectWhatever()、またはMyObjectComputedValue()
    • または声明として、考えてくださいModifyMyObject()

そして、次のように: をx && doSomething()として使用しますか?

あなたはthisStatement( thatExpression );どこにでも似たようなことを考えることになるでしょう、考えてください:

  • ()表現、
  • ;声明。

では、なぜ選択する必要があるのでしょうか。

于 2015-05-03T10:52:05.053 に答える
1

一言で言えば、2 つのステートメントは同じではありませんが、提示した特定の状況では結果は同じです。

x && doSomething();は式です。最初にx評価されます。これは AND であり、xが true であるため、2 番目の引数 ( doSomething()) が評価されます。この場合、これはメソッドが実行されることを意味します。false の場合x、式の結果が true にならないため、doSomething() は実行されません。

if(x) doSomething();は声明です。x の値がチェックされ、真であれば if ステートメントのスコープが実行されます。

私はこのフィドルをデモンストレーションのためにまとめました(わずかな変更を加えて)。

于 2012-09-30T19:49:24.957 に答える
0

探偵をしよう。

最初のアプローチをConditional Arrow Invocationと呼び、2 つ目のアプローチをTraditional If Elseと呼びます。

jsperfで 2 つの個別のケースを作成して、これら 2 つのアプローチがどのように公平であるかを評価します。

条件付きアロー呼び出し

const VALUE = true;
const TEST = false;

//test 1
VALUE && !TEST && (() => {
    console.log('print me!');
})();

オペレーション/秒の結果:

  1. ファイアフォックス: 65,152
  2. クロム: 129,045

従来の If Else

const VALUE = true;
const TEST = false;

//test 2
if(VALUE && !TEST) {
    console.log('print me!');
}

オペレーション/秒の結果:

  1. ファイアフォックス: 65,967
  2. クロム: 130,499

結論

ご覧のとおり、パフォーマンスに関しては大きな違いはありませんが、ほとんどの場合、ごくわずかな差でトラディショナル If Elseが Conditional Arrow Invocation に勝っています。これは、その場で暗黙的な関数を作成することに関係している可能性があります。

また、Chrome の JavaScript は FireFox の JavaScript の実行よりもはるかに高速であることにも気付きました。

これを自分で評価するために実行できる jsperf リンクを次に示します。

https://jsperf.com/conditional-methods-vs-traditional-if-else/1

于 2018-11-20T08:57:26.863 に答える