Javascript минимизация сравнительных утверждений - PullRequest
5 голосов
/ 13 февраля 2012

Я просматривал один из уменьшенных js-файлов, созданных при закрытии. Я обнаружил, что везде, где я проверяю равенство между переменной и строкой, как,

a == "13" || a == "40"

замыкание заменяет его на

"13" == a || "40" == a

Почему эта модификация сделана? Есть ли здесь какое-то преимущество в производительности?

Ответы [ 2 ]

9 голосов
/ 14 февраля 2012

Это сделано для небольшого преимущества сжатия gzip.Если у вас есть «x == 1» и «1 == x», компилятор переключает его на «1 == x» в обоих случаях, и вы получаете более обычный код, который лучше сжимается.Победа настолько незначительна, что я подумал об удалении кода и сохранении циклов процессора, но пока он включен.Он не имеет ничего общего с предотвращением ошибок программиста, поскольку он никогда не переключит «x = 2» в «2 = x», поскольку это изменит смысл программы.

5 голосов
/ 13 февраля 2012

[ОБНОВЛЕНИЕ: см. @ Ответ Джона, более логично понять, почему минификатор js сделает это, и должен быть принятым ответом]

Как общая концепция, этоэто избежать ошибки программиста.Если вы изменяли код вручную и ставили переменную первой, а константу второй, возможно случайно набрать:

a == '40' || a = '13'

Упс!Мы просто устанавливаем a на '13' вместо сравнения.Помещая константу слева, мы избегаем этой возможности:

'40' == a || '13' = a

Будет сгенерировано исключение, поскольку вы не можете поместить строку константы слева от операции присваивания.

Поэтому в некоторых школах мышления рекомендуется всегда ставить константу слева при сравнении равенства с константой.Похоже, замыкание следует за этой практикой.

Это так называемые "условия йоды".

Обратите внимание, что мое личное предпочтение состоит в том, чтобы фактически в большинстве случаев просто ставить константу справа, потому чтоимеет тенденцию читать лучше, поэтому я не думаю, что компромисс достаточно хорош.Но я вижу логику в условиях йоды.

...