Что такое оператор "двойная тильда" (~~) в 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?
Как определить нажатие клавиши Esc?
Как проверить, содержит ли массив строку в TypeScript?
Ссылка и выполнение внешнего JavaScript-файла, размещенного на GitHub
Как остановить Babel от трансформации 'this' в 'undefined' и добавления "use strict"