【问题标题】:Closure Compiler - can a++ >= 3 become ++a > 3?闭包编译器 - a++ >= 3 可以变成 ++a > 3 吗?
【发布时间】:2011-08-02 04:57:06
【问题描述】:

我承认我问了一个问题,为什么 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++ >= 会产生什么副作用?

【问题讨论】:

  • 你为什么要它这样做?我看不出它将如何以任何方式提高性能。
  • 不是因为性能,而是因为代码长度。 Closure Compiler 可以通过删除空格等来缩短代码,因此a++>=3 可以缩短为++a>3。不是很令人兴奋,但我只是想知道。
  • 你需要满足2个条件,而且收获很少,所以他们可能甚至没有浪费时间或者专注于更重要的事情......
  • 可能是这样,但它们两个表达式彼此相等是否正确?

标签: javascript google-closure-compiler post-increment pre-increment


【解决方案1】:

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

我想 Closure 没有实现这个优化是因为:

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

【讨论】:

    【解决方案2】:

    这个结构有一个特殊的边缘情况(但不是 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
    • 在 Chrome 中也是如此,但是 Number.MAX_VALUE + 1e308 === Infinity。 Chrome 似乎也上升到了e+308
    【解决方案3】:

    为什么不自己检查所有的边缘条件?

    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 会忽略它。
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2018-07-01
    • 2019-05-31
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    相关资源
    最近更新 更多