Какой смысл в записи queueSize | 0 ? (javascript)
Я переписываю код javascript на C#. И не могу понять какой смысл записи queueSize | 0 в выражении:
var i = Math.random() * queueSize | 0,
s = queue[i],
j = 0;
| - это Присваиванием с побитовым OR
Побитовый оператор присваивания OR использует двоичное (бинарное) представление обоих операндов, выполняет побитовое ИЛИ для них и присваивает результат переменной.
Оператор: x |= y
Значение: x = x | y
var bar = 5;
bar |= 2; // 7
// 5: 00000000000000000000000000000101
// 2: 00000000000000000000000000000010
// -----------------------------------
// 7: 00000000000000000000000000000111
тут же какое бы не было значение queueSize , выражение queueSize | 0 будет всегда значение queueSize.
В коде это просто лишнее действие или имеет какой то смысл такое выражение queueSize | 0 ?
Не могу понять. javascript изучал давно.
Ответы (2 шт):
Смысл простой что не былo undefined в итоге. Чтоб индекс был адекватным,а не NaN или undefined
console.log(undefined | 0) или console.log(undefined)
console.log(NaN | 0) или console.log(NaN)
Math.random() возвращает число между 0 и 1, которое дальше в коде используется как индекс, который должен быть целым числом. Побитовый | с нулем ничего не делает, но отбрасывает дробную часть. Фактически, это то же самое, что и Math.trunc(n) или parseInt(n)
let queueSize = 10;
let rand = Math.random();
console.log( rand * queueSize );
console.log( rand * queueSize | 0 );
// Побочка: всё, что NaN - превращает в ноль
console.log( undefined | 0 );
console.log( NaN | 0 );
console.log( "moo" | 0 );
Его в первую очередь используют для получения целого числа. Если нужно избавиться только от NaN, обычно используют логическое ИЛИ Math.random() * queueSize || 0;