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
   113   114   115   116   117   118   119   120   121   122   123