0

私はこのコードを持っていますが、実行順序がわかりません:

var enabled = item.get_property('Quantity') > 0 && item.get_property('UnitPrice') > 0 || item.get_id() === null

Mozilla はここで、&&operator の優先順位の方が よりも高いと述べている||ので、次のようになると思います。

  1. item.get_property('Quantity') > 0本当ですか?はいの場合は、先に進みます
  2. item.get_property('UnitPrice') > 0本当ですか?はいの場合は、先に進みます
  3. item.get_id() === null本当ですか?はいの場合は、yes を返します

しかし、明らかにそれは機能する方法ではありません。item.get_id() === nulltrueに等しい場合は「true」を返します。

4

2 に答える 2

2

それはまさにそれが言うように機能します。

優先順位が高いほど、演算子が最初に評価されます。JavaScript は可能な限り短絡します。

この式を次のように読む必要があります (最も優先順位の高い演算子に最初に括弧を適用します)。

var enabled = (item.get_property('Quantity') > 0 && item.get_property('UnitPrice') > 0) 
              || item.get_id() === null

実行順序に関しては、item.get_id() の前に item.get_property() が評価されるかどうかについては、JavaScript エンジンの実装に依存する可能性が高いため、一般的には何も言えないと思います。item.get_id() === null一部の実装では、メソッド呼び出しが少ないという意味で「作業が少なくて済む」ため、おそらく最初に評価されますが、実行順序に関係なく演算子の優先順位を尊重する必要があります。

于 2013-10-07T11:21:44.393 に答える
1

axbyc のような式があり、x と y が演算子である場合、x の優先順位が高いということは、式が ((axb) yc) と同等であることを意味します。ご覧のとおり、x と || を && に置き換えると、y の場合、インタプリタは a && b を評価します。つまり、a が false の場合は false にショートカットしますが、true の場合は b のブール値をチェックします。(a && b) が true の場合、インタープリターは true にショートカットしますが、そうでない場合は c をチェックし、true と評価された場合にのみ true を返します。

次の表は、考えられるすべてのシナリオをまとめたものです。

a    b    c    Evaluates    Result
0    0    0    a,c          0
0    0    1    a,c          1
0    1    0    a,c          0
0    1    1    a,c          1
1    0    0    a,b,c        0
1    0    1    a,b,c        1
1    1    0    a,b          1
1    1    1    a,b          1
于 2013-10-07T11:25:45.947 に答える