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 01 01 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 01 01
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 01 01
Если только вы не взаимодействуете с аппаратными средствами или не собирае
тесь лучше узнавать, как числа представляются на компьютере, вам вряд ли приго
дятся побитовые операторы (зачастую этот процесс игриво называют "жонглирова
нием битами"). Один из не связанных с аппаратными средствами случаев их приме
нения - это использование битов для эффективного хранения "флагов" (логических
значений).
Рассмотрим, например, установку прав доступа к файлу в системах Unix: на чте
ние (read), на запись (write) и на выполнение (execute). Пользователь может задать
любую комбинацию этих трех параметров, что делает их идеальными для флагов.
Поскольку имеется три флага, необходимо три бита для хранения информации.
const FLAG READ 1 / / ObOOl
const FLAG WRITE 2 / / ОЬ01 0
const FLAG EXECUTE 4 / / ОЫ ОО
Используя побитовые операторы мы можем объединять, переключать и возвра
щать значения отдельных флагов, которые хранятся в едином числовом значении.
l e t р = FLAG_READ 1 FLAG WRITE ; 1 1 ObO l l
l e t hasWrite = р & FLAG_WRITE ; 1 1 ОЬ01 0 - истина
l e t hasExecute = р & FLAG EXECUTE ; 1 1 оьооо - ложь
р р л FLAG_WRITE ; 1 1 ObOOl -- переключение флага wri t e
1 1 (теперь о н сброшен)
р р л FLAG WRITE ; 1 1 ObOl l -- переключение флага wri te
1 1 (теперь о н установлен)
1 1 мы можем определить значение даже нескольких флагов
11 с помощью одного выражения :
const hasRead.AndExecute = р & ( FLAG_READ 1 FLAG_EXECUTE ) ;
Обратите внимание, что для hasReadAndExecute мы должны были использовать
оператор группировки; у оператора AND приоритет более высокий, чем у OR, а нам
нужно было выполнить OR до AND.
Оператор typeof
Оператор typeof возвращает строку, представляющую тип его операнда. К со
жалению, этот оператор не обеспечивает точного соответствия семи типам данных
JavaScript (undefined, nul l, логический, число, строка, символ и объект), что стапо
причиной бесконечной критики и затруднений.
У оператора t yp e o f есть одна причуда, которую обычно называют ошиб
кой: t ypeof nul l возвращает " ob j ect " . Конечно, null - никакой не объект (это
Оператор группировки 121
базовый тип). Причины имеют исторический характер и не особенно интересны,
уже неоднократно предлагалось исправить это, но слишком много существующего
кода уже основано на таком поведении. В результате теперь это увековечено в спец
ификации языка.
Оператор typeof нередко критикуют также за то, что он не способен отличить
объекты, не являющиеся массивами, от массивов. Он корректно идентифицирует
функции (также являющиеся объектами специальных типов), но результатом typeof
[ ] является 11obj ect 11 •
Возможные возвращаемые значения оператора typeof приведены в табл. 5.8.
Таблица 5.8. Возвращаемые значения оператора typeof
Выражение Возвращаемое значение Примечания
Прискорбно, но факт
Typeof undefined 11 unde f ined 11
Нововведение ЕSб
Typeof null 11obj ect 11
Typeof { } {} 11obj ect 11
Typeof t rue 11boolean11
11 nurnЬ e r 11
Typeof 1
Typeof 11 11 11string 11
Typeof SymЬol ( ) 11symЬol 11
Typeof funct ion ( ) " funct ion11
Поскольку typeof - оператор, крутлые скобки не обязательны. Таким
образом, если у вас есть переменная х, можете использовать синтаксис
typeof х вместо typeof ( х ) . Последнее - вполне допустимый син
таксис - круглые скобки лишь создают ненужную группу выражений.
Оператор void
У оператора void есть только одна задача: вычислить свой операнд, а затем воз
вратить undefined. Звучит не очень привлекательно? Да, согласен. Это применяется
для оценки выражения, в котором необходимо возвращаемое значение undefined,
но я никогда не встречался с такой ситуаций в реальной жизни. Единственная при
чина, по которой я включил его в эту книгу, в том, что вы будете иногда встречать
его использование в URL дескриптора HTML <а>, чтобы помешать браузеру перейти
на новую страницу.
<а href= " j ava script : void О " >Ничего не делаем ! </а>
Это не рекомендуемый подход, но время от времени он встречается.
Операторы присваивания
Оператор присваивания прост: он назначает значение переменной. То, что на
ходится слева от знака равенства (иногда называемое [-значением (lvalue)), должно
1 22 Глава 5. Выражения и операторы