闭包编译器 - 可以a ++> = 3成为++ 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++ >=
时,有什么副作用?     
已邀请:
这个结构有一个特殊的边缘情况(但不适用于3)。 之所以会发生这种情况,是因为JavaScript将数字存储为IEEE-754浮点64位双精度数,并且“仅”存储数据保证“精确”整数表示最多为2 ^ 53(尽管实现可能具有更高范围的背景,I不知道)。 这是在Firefox 4上:
a = 2e53
a++ >= 2e53 // true

a = 2e53
++a > 2e53 // false
真正的问题是这种非常特殊的变革会带来什么样的实现? :-0 快乐的编码。     
如果右操作数(在您的示例中为
3
)是[-252,252]范围内的常量整数,则应用此大小优化是安全的。在任何其他情况下(例如,如果右操作数是小数或非常大),则不安全。 我想,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
。     

要回复问题请先登录注册