1

私はAngularJSフレームワークを調べていました。彼らは|演算子を使用して物事を追加していたことがわかりました。+演算子と演算子を使用する場合の違いは何|ですか?

それはパフォーマンスに関係していますか?もしそうなら、どのように?

要求されたコードは次のとおりです:-

var manualLowercase = function(s) {
    return isString(s)
        ? s.replace(/[A-Z]/g, function(ch) {
            return String.fromCharCode(ch.charCodeAt(0) | 32);
    }): s;
};
4

4 に答える 4

5

それらは異なるオペレーターです。

xyは数字2x | yビット単位の OR であり、x + yは加算です。との一部の値では同じ結果になりますが、それ以外の場合は結果が異なります3xy

とにかく、望むものを意味する形を使いましょう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結果が同じになるのは xyが両方とも数値である場合 (またはどちらも文字列ではない場合)、 を介して変換可能であり、共通の設定ビット[ToInt]なく、約 [0, 2^32) の範囲内にある場合のみです。 .

于 2013-03-09T05:48:21.243 に答える
4

+は加算演算子、|はビット演算子です。しかし、あなたが「それはパフォーマンスに関係しているのですか?」と言うので。だから私はあなたの手段が2つ以下の間でより良いと思います:

x = 0 | '5';

また

x = + '5';

算術演算子のMDNページによると:

単項プラスは、何かを数値に変換するための最速で好ましい方法です。

さらに、ここで私の答えに対するコメントを読んでください。一部のブラウザは、|代わりにパフォーマンスが向上します。

wikiも読む:ビット演算

単純な低コストのプロセッサでは、通常、ビット単位の演算は除算よりも大幅に高速で、乗算よりも数倍高速であり、加算よりも大幅に高速な場合があります。

ここにあなたのための興味深いリンク「jsperf」があります。

于 2013-03-09T05:49:59.447 に答える
1

私はjavascriptを学び始めたばかりです。これまで、2 つの文字列値または 2 つの値を加算するために使用される "+" 演算子について聞いたことがあります。数値と文字列を追加すると、文字列の結果のみが提供されます。両方の数値を指定すると、2 つの数値を加算した結果が得られます。

于 2013-03-09T06:13:46.720 に答える
-1

バイナリ変数で操作する場合、プラス(+)演算子の代わりにor(|)を使用できます。同じ結果が得られます。バイナリ演算について知りたいと思うかもしれません。グーグルだけで、良い検索に出くわすでしょう。

于 2013-03-09T05:56:16.087 に答える