Оправдан ли порядок операндов в равенстве? (например, 1 == x vs x == 1)
Итак, я пытаюсь выполнить компилятор Google Closure, и я заметил, что он переключает все мои параметры равенства, так что переменные всегда находятся в правой части сравнения.
Итак, вместо typeof XMLHttpRequest=="undefined"
у меня есть "undefined"==typeof XMLHttpRequest
, а if(null!==a)
вместо if(a!==null)
, как и некоторые примеры.
Я знаю, что они выполняют одно и то же, но это не стиль, к которому я привык. Есть ли какая-то польза, которую вы получаете за то, что они переключались? Я не вижу, как это будет.
Может кто-нибудь объяснить мне, почему компилятор Closure решает это сделать? Это просто предпочтение того, кто написал эту часть "Закрытия"?
Изменить: Чтобы уточнить, люди говорят мне, почему это можно считать хорошей практикой кодирования. Это хорошо, но это после компиляции. Есть ли преимущество в производительности или компилятор Closure просто пытается доказать точку?
Ответы
Ответ 1
Компилятор переключает порядок по очень простой причине: он сжимается лучше с помощью gzip. Компилятор не заботится о том, чтобы улучшить понимание или упростить редактирование. Переключая общие сравнения порядка, такие как "if (x == null)... if (y == null)..." стать "if (null == x)... if (null == y)..." Gzip находит ", если (null ==" и может заменить его на один токен. Это не большое улучшение, но оно добавляется в большую базу кода.
Ответ 2
Обычно выполняется на таких языках, как C/С++, поэтому вы не можете случайно сделать
if (a = null) {
// sets a to null and everyone is happy.
// but probably meant to check if a is null or not.
// via (a == null)
}
if (null = a) {
// won't compile
}
Ответ 3
Да, вы не можете назначить константу, а ==
легко ошибаться (иногда вы можете ее забыть и использовать =
).
Например, какая разница между...
if (a == 1) { }
... и...
if (a = 1) { }
? Второй всегда будет оценивать значение true, не важно, что значение a
.
Если вы переверните LHS и RHS, вы увидите непосредственную выгоду...
if (1 == a) { }
... будет работать как ожидалось и...
if (1 = a) { }
... не удастся, так как вы не можете назначить константу.
Ответ 4
Причина, по которой я знаю, делается для предотвращения
if (x = 5) { }
Если вы отмените его на
if (5 = x) { }
Вы получите ошибку компилятора.
Но если вы напишете его как
if (5 == x) { }
Он будет компилироваться отлично.
Ответ 5
Мой мозг анализирует
if( x < y )
немного быстрее, чем
if( y > x )
вероятно, потому, что вещественная ось всегда ориентирована слева направо, что облегчает визуализацию условий.
Однако в java более практично писать
if( "string".equals(x) ) {...
в отличие от "более естественного"
if( x.equals("string") ) {...
чтобы исключить любую возможность для NPE.
Ответ 6
Просто дешевая замена статического анализа частного случая общей ошибки/