5

数日前にClosureCompilerが一見短縮できるように見える特定のコードを短縮しない理由について質問したことは認めますが、その理由はこの場合には当てはまらず、なぜ短縮されないのかよくわかりません。ここ。

私が持っているコードは次のとおりです。

var a = 0;
function b() {
    return a++ >= 3;
}

現在、プリインクリメントとポストインクリメントがあります。違いは戻り値です-それをa++返しa次にそれをインクリメントし、++a最初にそれをインクリメントしてaからそれを返します。

これは、私のコードを(空白の削除を無視して)次のように短縮できるということです。

var a = 0;
function b() {
    return ++a > 3;
}

ただし、ClosureCompilerはこれを変更(または認識)していないようです。

++a >したがって、私の質問は、代わりに使用した場合にどのような副作用が発生する可能性があるa++ >=かということです。

4

3 に答える 3

7

この構成に特定のエッジケースがあります(ただし、3にはありません)。

これは、JavaScriptが数値をIEEE-754浮動小数点64ビットdoubleとして格納し、「のみ」が2 ^ 53までの「正確な」整数表現を保証しているために発生します(ただし、実装にはより高い範囲を設定する余地がある場合がありますが、Iわかりません)。

これはFirefox4にあります。

a = 2e53
a++ >= 2e53 // true

a = 2e53
++a > 2e53 // false

本当の問題は、そのような非常に特別な変革がどのような実現利益をもたらすかということです。:-0

ハッピーコーディング。

于 2011-04-09T19:57:41.120 に答える
2

右オペランド(この3例では)が[-2 52、2 52 ]範囲定数整数である場合は、このサイズ最適化を適用しても安全です。その他の場合(たとえば、右オペランドが小数または非常に大きい場合)、安全ではありません。

Closureは、次の理由でこの最適化を実装していないと思います。

  • 最適化が安全であることを確認するために多くのチェックが必要です。
  • これは、おそらくあまり頻繁に発生しない非常に特殊な状況でのみ適用され、
  • 1文字しか保存されないため、面倒なことはほとんどありません。
于 2011-04-09T20:31:58.763 に答える
1

すべてのエッジコンディションを自分でチェックしてみませんか?

function b(a) {
    return a++ >= 3;
}

function b2(a) {
    return ++a > 3;
}

console.log(b(2) === b2(2))
console.log(b(3) === b2(3))
console.log(b(4) === b2(4))

いずれの場合も出力はtrueです。

于 2011-04-09T19:54:24.097 に答える