Из учебника здесь,
function notePressed(event) {
if (event.buttons & 1) {
let dataset = event.target.dataset;
if (!dataset["pressed"]) {
let octave = +dataset["octave"];
oscList[octave][dataset["note"]] = playTone(dataset["frequency"]);
dataset["pressed"] = "yes";
}
}
}
Какая польза от event.buttons & 1
? Почему используется побитовое И?
@dai, может быть, это должен быть ответ?
Здесь event.buttons
возвращает целочисленное значение, которое представляет собой нажатую кнопку мыши. Согласно MDN возвращается -
0
: Нет кнопки или не инициализировано1
: основная кнопка (обычно левая кнопка)2
: дополнительная кнопка (обычно правая кнопка)4
: Вспомогательная кнопка (обычно кнопка колесика мыши или средняя кнопка)8
: 4-я кнопка (обычно это кнопка «Назад в браузере»)16
: 5-я кнопка (обычно кнопка «Вперед в браузере»)Итак, в конечном итоге, что мы получаем от этого event.buttons
? Целочисленное значение.
Теперь перейдите к вашему общему фрагменту кода. Что означает строчка if (event.buttons & 1)
? Давайте рассмотрим пример того, что делает & 1
с 32-битным целым числом.
0 & 1 => 0
1 & 1 => 1
2 & 1 => 0
3 & 1 => 1
23 & 1 => 1
46 & 1 => 0
Итак, если мы выполняем & 1
с любым 32-битным целым числом, то для четных чисел возвращается 0
, а для нечетных — 1
. Мы можем легко обнаружить любые нечетные/четные числа, используя побитовую операцию AND 1.
Теперь вы знаете, что 0
— ложное значение, поэтому условие if
никогда не выполняется, если мы получаем 0
из оператора. Итак, if (event.buttons & 1)
проверяет, дает ли event.buttons
нечетное число, затем выполняет блок if
, иначе нет.
Я надеюсь, что смогу очистить его.
«Почему используется побитовое И?» - потому что
event.buttons
является целым числом. Это синтаксически краткий способ проверить, содержит лиevents.buttons
бит1
, поскольку это целое число флагов (битового поля), которое также может быть3
(кнопки 1 и 2), 2 (только кнопка 2) и т. д.