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)