Закрывающий компилятор - может ли ++> = 3 стать ++ a> 3? - PullRequest
5 голосов
/ 09 апреля 2011

Я признаю, что задал вопрос о том, почему Closure Compiler не укорачивает определенный код, который выглядит на первый взгляд уже несколько дней назад, но эта причина не применима в этом случае, и я не совсем уверен, почему это не так.здесь не сокращается.

Какой у меня код:

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

Теперь есть предварительное увеличение и последующее увеличение.Разница заключается в возвращаемом значении - a++ возвращает a и , затем увеличивает его, ++a сначала увеличивает a и , затем возвращает его.

Это сводится к тому, что мой код может быть сокращен до (игнорируя удаление пробелов):

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

Однако, Closure Compiler, похоже, не изменяет (или не распознает) это.

Myпоэтому возникает вопрос: какие побочные эффекты могут иметь ++a > при использовании вместо a++ >=?

Ответы [ 3 ]

7 голосов
/ 09 апреля 2011

Там - это конкретный крайний случай для этой конструкции (но не для 3).

Это происходит потому, что JavaScript хранит числа в виде 64-разрядных двойных чисел с плавающей точкой IEEE-754 и «только» имеет гарантированное «точное» целочисленное представление до 2 ^ 53 (хотя реализации могут иметь более высокий путь, чтобы иметь более высокий дальность, я не знаю).

Это на Firefox 4:

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

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

Реальный вопрос в том, какой реализованный выигрыш будет иметь такое специфическое преобразование? : -0

Удачного кодирования.

2 голосов
/ 10 апреля 2011

Безопасно применять эту оптимизацию размера, если правый операнд (3 в вашем примере) представляет собой постоянное целое число в диапазоне [- 2 52 , 2 52 ] .В любом другом случае (например, если правый операнд дробный или очень большой), это небезопасно.

Я бы предположил, что Closure не реализует эту оптимизацию, потому что:

  • это требует много проверок, чтобы убедиться, что оптимизация безопасна,
  • это применимо только в очень специфических обстоятельствах, которые, вероятно, возникают не очень часто, и
  • Это только сохраняетодиночный персонаж, который вряд ли стоит беспокоиться.
1 голос
/ 09 апреля 2011

Почему бы не проверить все граничные условия самостоятельно?

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.

...