Closure Compiler - a++ >= 3 可以变成 ++a > 3 吗?

5

我承认几天前我问过一个关于为什么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++ >=时可能会有什么副作用?


为什么你想让它这样做?我看不出它如何能以任何方式提高性能。 - Håvard
不是因为性能,而是因为代码长度。Closure Compiler 可以通过删除空格和更多内容来缩短代码,因此 a++>=3 可以缩短为 ++a>3。这并不是很令人兴奋,但我只是在想。 - pimvdb
3
您需要满足两个条件,而且收益非常少,所以他们可能甚至没有浪费时间或者专注于更重要的事情... - fazo
这可能是情况,但它们两个表达式是否相等呢? - pimvdb
3个回答

7

这个结构存在一个特殊的边缘情况(但3没有)。

这是因为JavaScript将数字存储为IEEE-754浮点64位双精度,并且仅保证具有“精确”整数表示,最高可达2^53(尽管实现可能具有更高的范围,我不知道)。

这是在Firefox 4上的情况:

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

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

真正的问题是,这样一种非常特殊的转变会带来什么实际的收益呢?:-0

编程愉快。


在 Firebug 中,Firefox 3.6 中的 (Number.MAX_VALUE + 1) === Number.MAX_VALUEtrue - Wayne
在Chrome中,Number.MAX_VALUE + 1e308 === Infinity。此外,Chrome似乎可以达到e+308 - pimvdb

2

如果右操作数(在您的示例中为3)是范围在[-252,252]内的常量整数,那么应用此大小优化是安全的。在其他任何情况下(例如,如果右操作数是分数或非常大),则不安全。

我想Closure没有实现这种优化,因为:

  • 需要进行很多检查以确保优化是安全的,
  • 它只适用于非常特定的情况,可能并不经常出现,
  • 它只能节省一个字符,这似乎不值得麻烦。

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


是的,我的实际问题是为什么Closure Compiler会忽略它。 - pimvdb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接