5

我承认我问了一个问题,为什么 Closure Compiler 不缩短某些乍一看似乎可以缩短的代码几天前,但这个原因在这种情况下不适用,我不确定为什么它没有缩短这里。

我的代码是:

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

现在有前置增量和后置增量。不同之处在于返回值 -a++返回a然后递增它,首先递增然后返回它。++aa

这归结为我的代码可以缩短为(忽略空格删除):

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

然而,闭包编译器似乎并没有改变(或识别)这一点。

++a >因此,我的问题是:使用而不是会产生什么副作用a++ >=

4

3 回答 3

7

这个构造有一个特殊的边缘情况(但不是 3)。

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

这是在 Firefox 4 上:

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

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

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

快乐编码。

于 2011-04-09T19:57:41.120 回答
2

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

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

  • 它需要大量检查以确保优化是安全的,
  • 它仅适用于可能不经常出现的非常特殊的情况,并且
  • 它只保存一个字符,这似乎不值得费心。
于 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 回答