2012-01-21 7 views
5

質問:JavaScriptで等価性や同一性を評価する際にオペランドの順序が違いますか?JavaScriptで等価性や同一性を評価する際、オペランドの順序は何か違いはありますか?

コードでは、(0 == value)(value == 0)より速く、正確ですか?の場合も同様です。この質問は、同一性のあるID演算子の場合はです。

等価演算子と識別演算子の両方が可換であるため、オペランドの順序が評価のパフォーマンスに影響しないとは思えません。等価アルゴリズム自体の計算において左辺のリテラルに利益をもたらす。私は疑問に思う唯一の理由は、私は最近、いくつかのJavaScriptを煮詰めるために、GoogleのClosure Compilerを使用し、

if (array.length == 0 && typeof length === 'number') {

if(0 == b.length && "number" === typeof c) {にコンパイルされていたことに気づいたということです。

どちらの等価式でも、1つ緩いと1つの厳密な閉包が、それぞれの式の左側にNumberリテラルとStringリテラルを配置して、自分のオペランドの順序を逆にしました。

これは私を不思議に思った。

は私がECMAScript 5.1 Language Specification(セクション11.9、頁80-82)と平等アルゴリズムは最初の左側のオペランドを調べることによって開始している間、それは高速ですという兆候がないことがわかったかの平等演算子セクションを読んでそのオペランドとしてリテラルを使用する方がよいでしょう。

リテラルの最適な検査を行うECMAScriptのタイプチェックについては何かありますか? Closureコンパイラでいくつかの最適化が可能だろうか?あるいは、ECMAScriptの等価アルゴリズムの古いバージョンの実装の詳細は、この新しいバージョンの仕様では無効になっていますか?

+1

が、私はこの「エラー」はどのようにGoogleのパーサの副作用として来て、あなたのコードを再構築し、副作用またはの正しいネスとは何の関係もないと思うエラーがスローされますオペランドの順序 – Raynos

+0

スピードをチェックするには、[JS Perf](http://jsperf.com)でテストを実行します。これはもちろん、理論的/「客観的」評価を提供するのではなく、作成したテストケースを実行しているブラウザを測定するだけです。 –

答えて

1

http://jsperf.com/lr-equality

私は本当にあなたに説明を与えることはできませんが、数字を確認することができます。彼らは平等に見える(今)。

+0

こんにちは、私は 'より大きい/より小さい'演算子について興味深い理論を持っています。あなたもそれらを追加することができれば面白いかもしれません。例:「< 5 and 5 > a」 – ajax333221

+0

数字は比類のないので、生データを参照してください:http:// jsperf。com/lr-equality – Blender

+0

ありがとうございます。私はパフォーマンステストも行ってきましたが、JavaScriptのパフォーマンスがより大きな傾向を示す可能性があるため、アルゴリズムの理由があるかどうか疑問に思っていました。基本的には、パフォーマンスの違いの原因があるのか​​、習慣を変えることで他のパフォーマンス上の利点が得られるのかどうかを判断しようとしています。しかし、私は入力を感謝します! – piersadrian

2

多くの人が、スタイルコンベンションとして変数を右端にコーディングしています。重大なコーディングでエラーを捕捉できる主な理由。

次のコードはおそらくバグですが、if文はtrueと評価されます。

if(n = 1) { } 

、これは

if(1 = n) { } 
+2

@PiersMainwaring彼は、バグのために*本当に評価しているとは言わなかった - 彼はそれが書かれているときにはバグであり、比較は意図されていたと主張した。彼はあなたの質問に答えています。それはパフォーマンスの問題ではなく、エラーの1つのクラスを減らす方法です。 –

+0

@DaveNewtonああ、分かりました。私は平等問題に焦点を合わせ、答えを間違っていました。謝罪いたします。 – piersadrian

+0

それで、Closure Compilerが何らかのQAツールを意図していることを暗示していますか? – katspaugh