Page 118 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 118
Если необходим результат логического исключающего OR (XOR) двух
переменных, х и у, вы можете воспользоваться эквивалентным выра
жением (х 1 1 у) & & х ! == у.
Вы ч и с ление по сокращенной схеме
Если вы просмотрите таблицу истинности для оператора AND (см. табл. 5.2), то
обратите внимание, что возможно сокращение: если х - ложь, рассматривать зна
чение у уже не нужно. Точно так же, если вы вычисляете х 1 1 у и х - истина, то
вычислять у уже не нужно. Именно это и делает JavaScript в ходе вычисления по со
к р ащенной схеме (short-circuit evaluation).
Почему так важно знать о вычислении по сокращенной схеме? Потому что, если
у второго операнда есть побочные эффекты (side effect), при сокращении вычисле
ния их не будет. Очень часто термин "побочный эффект" применяется для описания
чего-то плохого, но в программировании это не всегда так: если побочный эффект
вызван намеренно, то это неплохо.
В выражении побочные эффекты могут явиться результатом инкремента, декре
мента, присваивания и вызова функции. Мы уже рассматривали операторы инкре
мента и декремента, поэтому давайте приведем пример.
const skipit true ;
let х = О ;
const result s k ipit 1 1 х+ + ;
В третьей строке этого примера получается очевидный результат, сохраняе
t
мый в переменной result. Этим значением будет r ue, поскольку первый операнд
s
( k ipit) - это r ue. Интересно, тем не менее, то, что из-за вычисления по сокра
t
щенной схеме выражение инкремента не вычисляется, оставляя х значение О. Если
изменить значение skipit на false, то обе части выражения будут вычислены и ин
кремент выполнится: здесь инкремент - это побочный эффект. То же самое отно
сится к оператору И.
const doi t = false ;
let х = О ;
const result = doi t && х++;
Здесь JavaScript снова не станет вычислять второй операнд, который содержит
инкремент, поскольку первым операндом AND будет false. Таким образом, resul t
содержит fals e , а х остался без инкремента. Что будет, измени вы doit на t r ue?
JavaScript должен вычислить оба операнда; таким образом, инкремент произойдет
и resul t будет О. Не ожидали? Почему константа resul t содержит значение О, а не
false? Ответ на этот вопрос плавно переводит нас к следующей теме.
Операторы AND , OR и NOT 1 1 7

