Подтвердить что ты не робот

Оправдан ли порядок операндов в равенстве? (например, 1 == x vs x == 1)

Итак, я пытаюсь выполнить компилятор Google Closure, и я заметил, что он переключает все мои параметры равенства, так что переменные всегда находятся в правой части сравнения.

Итак, вместо typeof XMLHttpRequest=="undefined" у меня есть "undefined"==typeof XMLHttpRequest, а if(null!==a) вместо if(a!==null), как и некоторые примеры.

Я знаю, что они выполняют одно и то же, но это не стиль, к которому я привык. Есть ли какая-то польза, которую вы получаете за то, что они переключались? Я не вижу, как это будет.

Может кто-нибудь объяснить мне, почему компилятор Closure решает это сделать? Это просто предпочтение того, кто написал эту часть "Закрытия"?

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

4b9b3361

Ответ 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

Просто дешевая замена статического анализа частного случая общей ошибки/