4

次のことを考慮してください:(
編集:関数を少し修正して、三項演算子の使用または中括弧を削除しました)

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

問題:

someFunction(1,10,2) 
//step IS defined, shortcut logical OR || should kick in, 
//step should return 2 BUT it returns 1

これは、中括弧を使用して簡単に修正できることを認識しています。

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

質問:||この場合、オペレーターが近道に ならないのはなぜですか?

2 項論理条件演算子の中で論理 OR の優先順位が最も低いことは承知していますが、条件付き 3 項演算子よりも優先順位が高いと思いましたか?

Operator precedence の MDN ドキュメントを読み間違えていますか?

4

2 に答える 2

1

JavaScript は緩やかに型付けされています。つまり、演算子またはステートメントが特定のデータ型を想定している場合、JavaScript はデータをその型に自動的に変換します。

他のタイプにどのように変換されるか、いくつかのシナリオを見てみましょう

例 1。

if() ステートメントはブール値を想定しているため、角かっこで定義したものはすべてブール値に変換されます。

JavaScript の値は、そのような変換の結果 (つまり、真または偽) に応じて、「真」または「偽」と呼ばれることがよくあります。

偽であることがわかっていない限り、値が真であるかどうかを覚えておいてください。

幸いなことに、falsey は 6 つしかありません -

  1. 偽(もちろん!)
  2. 未定義
  3. ヌル
  4. 0 (数字のゼロ)
  5. "" (空文字列)
  6. NaN (非数)

例 2。

var x = 動物園 || 星 ;

Zoo が true と評価された場合は、zoo の値が返されます。それ以外の場合は、star の値が返されます。

例 3。

var str = '1' || '2';

'1' は falsey ではないため、'1' が返されます。 result : str = '1';

例 4。

var str = '1' || (true) ? '2' : '3';

まず、||(論理 OR) 演算子の優先順位が ?(条件付き) 演算子よりも大きい

最初に ( '1' || (true) ) が最初に評価されます

「1」は false ではないため、「1」が返されます

中間結果: str = '1' ?' 2' : '3'

「1」は真実ではないため、「2」が返されます

最終結果: str = '2'

例 5。

var str = '1' || (false) ? '2' : '3';

まず、||(論理 OR) 演算子の優先順位が ?(条件付き) 演算子よりも大きい

最初に ( '1' || (false) ) が最初に評価されます

「1」は false ではないため、「1」が返されます

中間結果: str = '1' ?' 2' : '3'

「1」は真実ではないため、「2」が返されます

最終結果: str = '2'

これで、シナリオを理解するのは非常に簡単になります:)

于 2018-06-18T21:40:09.700 に答える