Что такое оператор "двойная тильда" (~~) в JavaScript?
Проблема
Я столкнулся с кодом, в котором используется оператор ~~
, и у меня нет понятия о том, что он делает. Вот этот фрагмент:
var jdn = function(y, m, d) {
var tmp = (m <= 2 ? -1 : 0);
return ~~((1461 * (y + 4800 + tmp)) / 4) +
~~((367 * (m - 2 - 12 * tmp)) / 12) -
~~((3 * ((y + 4900 + tmp) / 100)) / 4) +
d - 2483620;
};
Что означает оператор ~~
в данном контексте?
2 ответ(ов)
В JavaScript операция побитового отрицания (~
) выполняется следующим образом:
~(5.5)
: Результат будет-6
. Операция побитового отрицания применяется к числу, что приводит к преобразованию его в целое значение с использованием операцииMath.floor
илиMath.trunc
. В этом случае 5.5 будет преобразовано в 5, и после применения~
мы получаем-(5 + 1)
, что равняется-6
.~(-6)
: Результатом будет5
. Здесь-6
превращается в5
, так как сначала происходит преобразование к целому числу (в данном случае уже целое) и затем побитовое отрицание. Таким образом, мы имеем-(-6 + 1)
, что равняется5
.~~5.5
: Результат будет5
, так как оператор~~
можно представить как два последовательных примененияMath.trunc
, что эквивалентно отбрасыванию дробной части.~~(-5.5)
: Результат будет-5
. В данном случае-5.5
аналогично будет округлен до-5
с помощьюMath.trunc
, однако стоит отметить, что это не то же самое, чтоMath.floor(-5.5)
, который вернул бы-6
.
Таким образом, операции ~
и ~~
служат для манипуляции с числами, позволяя эффективно округлить их и изменять знак.
Для получения дополнительной информации вы можете посетить: Dreaming in JavaScript.
Разница очень проста:
Длинная версия
Если вам важна читаемость кода, используйте Math.floor
. Если же вы хотите сократить его, используйте тильду ~~
.
В интернете можно встретить множество источников, утверждающих, что Math.floor
быстрее, но иногда бывает и наоборот с ~~
. Не стоит слишком зацикливаться на производительности, так как разница в скорости выполнения не будет заметна при обычном запуске кода. Возможно, в тестах это и проявится, но обычный человек не увидит разницы. Для более быстрого времени загрузки предпочтительнее использовать ~~
.
Короткая версия
~~
короче и занимает меньше места. Math.floor
улучшает читаемость. Иногда тильда быстрее, иногда Math.floor
, но это не заметно.
Где найти документацию по форматированию даты в JavaScript?
В чем разница между String.slice и String.substring?
Проверка соответствия строки регулярному выражению в JS
Как создать диалог с кнопками "Ок" и "Отмена"
Как определить нажатие клавиши Esc?