Tips & Tricks in JS
Сегодня не про задачки, а про трюки в JS. Пример, как можно сократить запись Math.ceil и Math.floor. Не то, чтобы это круто, но в чужом коде, особенно в NPM пакетах такое может встречаться. Чтобы это не вызывало вопросов и не было ощущения что тут какая-то магия(а тут нет никакой магии, просто нужно знать как работают операторы). Где-то такой код генерится “машиной”, всякими обфускаторами и минификаторами. А где-то люди сами пишут такой код.
Math.ceil
Метод
Math.ceil()
возвращает наименьшее целое число, большее, либо равное указанному числу.
Побитовое НЕ (NOT)
Оператор “~” — заменяет каждый бит операнда на противоположный. Используем совместно с мнусом, так как NOT инвертирует знак числа.
-~number === Math.ceil(number)
// Примеры:
Math.ceil(8.1) === -~8.1 // 9
Math.ceil(4.9) === -~4.9 // 5
Math.floor
Метод
Math.floor()
возвращает наибольшее целое число, которое меньше или равно данному числу.
Побитовое ~
Используем двойное преобразование.
~~number === Math.floor(number)
// Примеры:
Math.floor(8.1) === ~~8.1 // 8
Math.floor(4.9) === ~~4.9 // 4
Побитовое ИЛИ (OR)
Ставит 1 на бит результата, для которого хотя бы один из соответствующих битов операндов равен 1.
0|number === Math.floor(number)
number|0 === Math.floor(number)
// Примеры:
0|8.1 === Math.floor(8.1)
4.9|0 === Math.floor(4.9)