簡體   English   中英

Closure Compiler - a ++> = 3會變成++ a> 3嗎?

[英]Closure Compiler - can a++ >= 3 become ++a > 3?

我承認我問過一個問題,為什么Closure Compiler不會縮短幾天前一見鍾情的某些代碼,但是這個原因並不適用於這種情況,我不確定為什么它沒有縮短這里。

我的代碼是:

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

現在有預增量和后增量。 不同之處在於返回值 - a++返回a 然后遞增它, ++a第一個遞增a 然后返回它。

這歸結為我的代碼可以縮短為(忽略空白刪除):

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

但是,Closure Compiler似乎沒有改變(或認識)這一點。

因此我的問題是:當使用++a >而不是a++ >=時,有什么副作用?

一個特定的邊緣的情況下對這個構建體(但不為3)。

之所以會發生這種情況,是因為JavaScript將數字存儲為IEEE-754浮點64位雙精度數,並且“僅”存儲數據保證“精確”整數表示最多為2 ^ 53(盡管實現可能具有更高范圍的背景,I不知道)。

這是在Firefox 4上:

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

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

真正的問題是這種非常特殊的變革會帶來什么樣的實現 :-0

快樂的編碼。

如果右操作數(在您的示例中為3 )是[-2 52,2 52 ]范圍內的常量整數 ,則應用此大小優化是安全的。 在任何其他情況下(例如,如果右操作數是小數或非常大),則不安全。

我想,Closure沒有實現這種優化,因為:

  • 它需要大量檢查以確保優化是安全的,
  • 它只適用於可能不經常出現的特定情況,並且
  • 它只保存一個字符,這似乎不值得打擾。

為什么不親自檢查所有邊緣條件?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM