Что оператор |= делает в JavaScript?
Я нашел следующий код в проекте JS:
var a = new Array();
a[0] = 0;
for (var b = 0; b < 10; b++) {
a[0] |= b;
}
Что это |=
сделать в теле цикла for?
Пример кода сомнителен, но был представлен здесь V8 для примера улучшенной производительности.
Обновленный пример
Приведенный выше пример эквивалентен var a = [15];
для большинства намерений и целей. Более реалистичный пример для |=
оператор должен был бы установить двоичные флаги в одной переменной, например, на объекте разрешения:
//Set up permission masks
var PERMISSION_1_MASK = parseInt('0001',2);
var PERMISSION_2_MASK = parseInt('0010',2);
..
//Set up permissions
userPermissions = 0;
userPermissions |= hasPermissionOne && PERMISSION_1_MASK;
userPermissions |= hasPermissionTwo && PERMISSION_2_MASK;
..
//Use permissions
if(userPermissions & PERMISSION_1_MASK){
..//Do stuff only allowed by permission 1
}
4 ответа
a[0] |= b
в основном
a[0] = a[0] | b
"|" является или побитовым оператором (кстати: документы MDN действительно хорошо написаны и действительно понятны. Если OP хочет писать и понимать JS, документы MDN являются отличным ресурсом.)
Обновить когда a[0]
назначен 0
, a[0]
в двоичном есть 0000
, В петле,
б = 0
a[0] = 0 (base 10) = 0000 (base 2) b = 0 (base 10) = 0000 (base 2) --------------- a[0] | b = 0000 (base 2) = 0 (base 10)
б = 1
a[0] = 0 (base 10) = 0000 (base 2) b = 1 (base 10) = 0001 (base 2) --------------- a[0] | b = 0001 (base 2) = 1 (base 10)
б = 2
a[0] = 1 (base 10) = 0001 (base 2) b = 2 (base 10) = 0010 (base 2) --------------- a[0] | b = 0011 (base 2) = 3 (base 10)
б = 3
a[0] = 3 (base 10) = 0011 (base 2) b = 3 (base 10) = 0011 (base 2) --------------- a[0] | b = 0011 (base 2) = 3 (base 10)
б = 4
a[0] = 3 (base 10) = 0011 (base 2) b = 4 (base 10) = 0100 (base 2) --------------- a[0] | b = 0111 (base 2) = 7 (base 10)
б = 5
a[0] = 7 (base 10) = 0111 (base 2) b = 5 (base 10) = 0101 (base 2) --------------- a[0] | b = 0111 (base 2) = 7 (base 10)
б = 6
a[0] = 7 (base 10) = 0111 (base 2) b = 6 (base 10) = 0110 (base 2) --------------- a[0] | b = 0111 (base 2) = 7 (base 10)
б = 7
a[0] = 7 (base 10) = 0111 (base 2) b = 7 (base 10) = 0111 (base 2) --------------- a[0] | b = 0111 (base 2) = 7 (base 10)
б = 8
a[0] = 7 (base 10) = 0111 (base 2) b = 8 (base 10) = 1000 (base 2) --------------- a[0] | b = 1111 (base 2) = 15 (base 10)
б = 9
a[0] = 15 (base 10) = 1111 (base 2) b = 9 (base 10) = 1001 (base 2) --------------- a[0] | b = 1111 (base 2) = 15 (base 10)
В конце цикла значение a[0]
является 15
x |= y;
эквивалентно
x = x | y;
где |
обозначает побитовое ИЛИ.
Как и в большинстве операторов присваивания, это эквивалентно повторному применению оператора с использованием левого значения:
a |= b
a = a | b
Как
a += b
a = a + b
Посмотрите на Moz Dev Net для получения дополнительной информации.
[Редактировать: мозг ломается, перепутал | и || Нужно больше кофе. Изменено ниже]
поскольку |
является побитовым оператором ИЛИ, результатом a|b
будет целым числом, представляющим цепочку битов со всеми 1 битами a
а также b
, Обратите внимание, что javascript не имеет встроенных типов int или bitstring, поэтому он сначала приведёт a
а также b
в int, затем сделать побитовое ИЛИ на битах. Итак, 9 | 2 в двоичном виде - 1001 | 0010 = 1011, то есть 11, но 8|2 = 8.
Эффект состоит в том, чтобы добавить биты флага b
в a
, Так что если у вас есть флаг WEEVILFLAG=parseInt(00001000,2)
:
// a = parseInt(01100001,2)
if(isWeevilish(a))
a |= WEEVILFLAG;
// now a = parseInt(01101001,2)
установит этот бит в 1 в.
Возвращает единицу в каждой битовой позиции, для которой соответствующие биты одного или обоих операндов являются единицами.
Код: результат = а | б;
^
является побитовым оператором XOR, который возвращает единицу для каждой позиции, где один (не оба) из соответствующих битов его операндов равен единице. Следующий пример возвращает 4 (0100):