Page 122 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 122

n++         11  двоичный  доп.  код:   1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0
       n  >>  1    11                    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1
       n  >>>  1   11                    01 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1
          Если только вы не взаимодействуете с аппаратными средствами или не собирае­
       тесь лучше узнавать, как числа представляются на компьютере, вам вряд ли приго­
       дятся побитовые операторы (зачастую этот процесс игриво называют "жонглирова­
       нием битами"). Один из не связанных с аппаратными средствами случаев их приме­
       нения - это использование битов для эффективного хранения "флагов" (логических
       значений).
          Рассмотрим, например, установку прав доступа к файлу в системах Unix: на чте­
       ние (read), на запись (write) и на выполнение (execute). Пользователь может задать
       любую  комбинацию этих трех параметров, что делает их идеальными для флагов.
       Поскольку имеется три флага, необходимо три бита для хранения информации.
       const  FLAG  READ  1   / /   ObOOl
                                 1
       const  FLAG  WRITE  2   / /   ОЬ0 0
       const  FLAG  EXECUTE  4  / /   ОЫ ОО
          Используя побитовые операторы мы можем объединять, переключать и возвра­
       щать значения отдельных флагов, которые хранятся в едином числовом значении.

       let  р  =  FLAG_READ  1  FLAG  WRITE ;   1 1   ObO l l
       l e t   hasWrite  =  р  &  FLAG_WRITE ;   11  ОЬ01 0  - истина
       let  hasExecute  =  р  &  FLAG  EXECUTE ;  11  оьооо  - ложь
       р   р  л  FLAG_WRITE ;            11  ObOOl  -- переключение  флага  write
                                         11  (теперь  он  сброшен)
       р   р   л  FLAG  WRITE ;          11  ObOl l   -- переключение  флага  write
                                         11  (теперь  он установлен)

       1 1    мы  можем  определить  значение  даже  нескольких  флагов
       11  с  помощью  одного  выражения:
       const  hasRead.AndExecute  =  р  &  ( F LAG_READ  1  FLAG_EXECUTE ) ;
          Обратите внимание, что для hasReadAndExecute мы должны были использовать
       оператор группировки; у оператора AND приоритет более высокий, чем у OR, а нам
       нужно было выполнить OR до AND.

       Оператор typeof

          Оператор typeof возвращает строку, представляющую тип его операнда. К со­
       жалению, этот оператор не обеспечивает точного соответствия семи типам данных
                              l
       JavaScript (undefined, nu l , логический, число, строка, символ и объект), что стапо
       причиной бесконечной критики и затруднений.
          У  оператора  t y p e o f   есть  одна  причуда,  которую  обычно  называют  ошиб­
       кой:  y peof  nu l   возвращает " o b j ect" .   Конечно, null - никакой не объект (это
                      l
            t

                                                           Оператор группировки   121
   117   118   119   120   121   122   123   124   125   126   127