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

Почему оператор Javascript "&&" настолько странный?

a = 1;
b = "1";
if (a == b && a = 1) {
    console.log("a==b");
}

Приведенный выше код Javascript приведет к ошибке в инструкции if в Google Chrome 26.0.1410.43:

Неподключить ReferenceError: Недопустимая левая сторона в присваивании

Я думаю, это связано с тем, что переменная a во второй части инструкции &&, a=1 не может быть назначена. Однако, когда я пытаюсь использовать код ниже, я полностью смущен!

a = 1;
b = "1";
if (a = 1 && a == b) {
    console.log("a==b");
}

Почему одно утверждение правильно, но другое утверждение неверно?

4b9b3361

Ответ 2

Вторая версия анализируется как a = (1 && a == b); то есть результат выражения 1 && a == b присваивается a.

Первая версия не работает, потому что левая сторона присваивания не анализируется, как вы ожидали. Он анализирует выражение так, как будто вы пытаетесь присвоить значение всем справа - (a == b && a) = 1.

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

Ответ 3

Потому что порядок операций - это не то, что вы ожидаете. a == b && a = 1 эквивалентно (a == b && a) = 1, что эквивалентно false = 1.

Если вы действительно хотите выполнить задание, вам нужно использовать круглые скобки: a == b && (a = 1).

Ответ 4

В if (a = 1 && a == b),

Операции, которые должны быть выполнены в первый раз, это 1 && a == b. 1 && выполняется результат a == b. Результат этой операции && присваивается a.