JavaScript論理または三元演算子優先度による不具合

2669 ワード

最近は一つのプロジェクトを引き継いで、一つのバグを受け取りました.毎回インターフェースから戻ってくるデータは前回の古いデータです.だから、現在のプロジェクトのインターフェース配置ファイルを調べました.
慎重に調べた結果、疑わしいコードが発見されました.大体このようにします.
'12345' || '67890' ? '67890' : ''
このコードは一見して、12345に戻るべきですが、実際には、67890に戻ります.
コードの作者の考えは次の通りだと思います.
  • は、まず12345が存在するかどうかを判断し、存在する場合は、12345
  • に直接戻る.
    '12345' 
    '67890' ? '67890' : ''
    
  • が存在しない場合、右側の三元演算子'67890' ? '67890' : ''
  • に進む.
    '67890' ? '67890' : ''
    
  • 67890が存在すれば、67890に戻り、そうでなければ、‘’
  • に戻る.
    ただし、上記のコードの実際の動作方式は以下の通りである.
  • は、まず1234567890と判断し、12345が存在する場合は12345に戻り、そうでなければ67890に戻るので、以下の両方がtrueであると仮定して、12345
  • に戻る.
    '12345' || '67890'
    
  • は次に12345がtrueであるかどうかを判断し、trueであれば67890に戻り、そうでなければ''
  • に戻る.
    '12345' ? '67890' : ''
    
    したがって、12345がtrueであると予想されたら、そのまま戻ってきますが、12345はtrueで、確かに67890に戻ります.
    解決方法は簡単です.括弧を入れてもいいです.
    '12345' || ('67890' ? '67890' : '')
    
    まとめ:論理または優先度が三要素演算子より大きいと結論できます.