2

は、次のことを考えてみましょう:
(編集:私は三項演算子で使用または中括弧を削除するには、わずかに機能を改正しました)優先順位:論理や三項演算子対

function someFunction(start,end,step){ 
    var start = start || 1, 
     end = end || 100, 
     boolEndBigger = (start < end); // define Boolean here 
     step = step || boolEndBigger ? 1:-1; 
    console.log(step); 
} 

someFunction() 
// step isn't defined so expect (1<10) ? 1:-1 to evaluate to 1 

someFunction(1,10) 
// again step isn't defined so expect to log 1 as before 

問題:


私はこれは簡単に中括弧を使用して固定されていることを承知している:

function range(start,end,step){ 
    var start = start || 1, 
     end = end || 100, 
     step = step || ((start < end) ? 1:-1); 
    console.log(step); 
} 

質問: はなぜ||オペレータがこのような場合には、短いカットされません。 ?

私は論理ORはバイナリ 論理条件演算子の中で最も低い優先度を持っていることを承知しているが、それは条件付きの三項演算子よりも優先さ 高いを持っていると思いましたか?

私はMDN docs for Operator precedenceを誤読していますか?

+4

"より高い優先度"は、コードが評価されていることを意味します(ステップ||(開始<終了))? 1:-1' –

+0

"優先順位が高い"とは、最初に '||'が評価されることを意味します。 (開始<終了) 'が最初に評価されます。 – Xufox

+0

@NiettheDarkAbsol:これは、三元項の優先順位が高いことを意味します。 MDNのドキュメントはそうでなければ言う... – Pineda

答えて

5

はい、||演算子は条件付き?:演算子よりも優先順位が高くなります。これは最初に実行されることを意味します。あなたがリンクしているページから:

オペレータの優先順位は、演算子が評価される順序を決定します。優先度の高い演算子が最初に評価されます。 (MDN)

enter link description hereだが、ここですべての操作を見てみましょう:

step = step || (start < end) ? 1:-1; 

優先順位が最も高いオペレータは()グループ化操作です。ここでは、falseになり:

step = step || false ? 1 : -1; 

次に高い優先順位は、論理OR演算子です。 stepは真実ですから、結果はstepとなります。

step = step ? 1 : -1; 

ここでは、残っているのは3つの操作です。ここでも、stepは真実であるため、最初のオプションが実行されます。

step = 1; 
+1

私はこれを手に入れます。私が得られないのは、この場合、左の条件が真であるときに '||'がショートカットされないのはなぜですか? – Pineda

+2

@ピネダです。その左のオペランドは「ステップ」であり、その右のオペランドは「偽」である。 'false'は決して実行されません。 – lonesomeday

+0

'step = step ||偽ですか? 1:-1; 'なぜ'偽ですか? 1:-1'はここで実行されますが、 'step = step || (false?1:-1);「 – Pineda

関連する問題