[英]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.