Почему оператор 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");
}
Почему одно утверждение правильно, но другое утверждение неверно?
Ответы
Ответ 1
=
имеет более низкую операционную точность, чем как &&
, так и ==
, что означает, что ваше первое присваивание превращается в
if ((a == b && a) = 1) {
Поскольку вы не можете назначить выражение таким образом, это приведет к ошибке.
Ответ 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
.