Как выполняется следующий код?
if(a=2 && (b=8))
{
console.log(a)
}
OUTPUT
a=8
Как выполняется следующий код?
if(a=2 && (b=8))
{
console.log(a)
}
OUTPUT
a=8
Это не имеет ничего общего с оператором if
, но:
if(a=2 && (b=8))
Здесь последний, (b=8)
, фактически возвращает 8, так как назначение всегда возвращает назначенное значение, поэтому оно то же, что и запись
a = 2 && 8;
И 2 && 8
возвращает 8
, так как 2 является правдивым, поэтому он так же, как и запись a = 8
.
Как правило, плохой идеей делать присваивание переменных внутри инструкции if
вроде этого. Однако в этом конкретном случае вы по существу делаете это:
if(a = (2 && (b = 8)));
Часть (b = 8)
возвращает 8
, поэтому мы можем переписать ее как:
if(a = (2 && 8))
Оператор &&
возвращает значение правой стороны, если левая сторона считается истинной, поэтому 2 && 8
возвращает 8
, поэтому мы можем переписать еще раз:
if(a = 8)
Он называется приоритетом оператора
(a=2 && (b=8))
В примере . то результаты оцениваются по сравнению с основным & знак.
(a=2 && (b=8)) evaluated to a = 2 && 8
So 2 && 8 return a = 8
Вы устанавливаете (не сравниваете) a
на 2 && (b=8)
. Поскольку 2
является tru-ish, вторая половина выражения будет выполнена, то есть a = true && (b = 8)
, то есть a = (b = 8)
, то есть a = 8
.
Ваше утверждение интерпретируется как
a = (2 && (b=8))
когда вы используете оператор &&
, тогда возвращается последнее истинное значение оператора. Здесь (b = 8) будет значение 8
, которое является истинным и последним оператором.
Чтобы понять, что происходит, обратитесь к диаграмме приоритетов и диаграмм ассоциативности операторов. Выражение a = 2 && (b = 8)
оценивается следующим образом:
&&
оценивается до =
, поскольку он имеет более высокий приоритет
2
, которое является правдивымb = 8
(b
становится 8
и возвращается 8
)8
возвращаетсяa = 8
оценивается (a
становится 8
и возвращается 8
)Наконец, предложение if
проверяется на 8
.
Обратите внимание, что 2
не играет никакой роли в этом примере. Однако, если мы используем некоторое значение фальшивки, результат будет совершенно другим. В этом случае a
будет содержать это значение фальши и b
останется нетронутым.