それらは異なるオペレーターです。
x
とy
は数字2で、x | y
はビット単位の OR であり、x + y
は加算です。との一部の値では同じ結果になりますが、それ以外の場合は結果が異なります3。x
y
とにかく、望むものを意味する形を使いましょう1。パフォーマンスの問題がない限り、パフォーマンスについて心配する必要はありません。jsperfは、このための便利なツールです。次に、マイクロベンチマークと本質的に偏りがあり、通常は問題にならないことに気付きます。
1この特定の問題については、正規表現が各 A ~ Z 文字に一致し、関数の結果に置き換えることに注意してください。
したがって、それcharCodeAt(0)
が A..Z の文字コードであることがわかります。文字テーブルを見ると、これらの値が [0x41, 0x5a] の範囲にあり、[0x61, 0x7a] が対応する小文字であることに注意してください。したがって、大文字の文字コードに 0x20 (または 32) を追加することで、{ A, B .. Z } -> { a, b .. z } に移動できます。
また、5 番目のビットが設定されていない数値 ([0x41, 0x5a] の範囲内の数値など) に 32 (または 1 << 5) を追加すると、ビット単位または 1 << 5 を使用して達成できることがわかります。 (つまり、x | 32)。これが、ここで|
と+
が交換可能である理由です。32 (つまり x + 0x20) を加算すると、上記の規則の下で両方の演算子が同等に動作しますが、ほぼ間違いなくより明確になります。
いずれにせよ、いずれかのアプローチのパフォーマンスへの影響に興味がある場合は、関連/ターゲット環境でコード全体(およびコンテキスト) のベンチマークを実行してください。
2演算子x | y
は常にビット単位の or ([ToInt]
変換による) ですがx + y
、文字列連結の場合もあります。
3結果が同じになるのは、 x
とy
が両方とも数値である場合 (またはどちらも文字列ではない場合)、 を介して変換可能であり、共通の設定ビット[ToInt]
がなく、約 [0, 2^32) の範囲内にある場合のみです。 .