7

Что такое оператор "двойная тильда" (~~) в 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 ответ(ов)

1

В JavaScript операция побитового отрицания (~) выполняется следующим образом:

  1. ~(5.5): Результат будет -6. Операция побитового отрицания применяется к числу, что приводит к преобразованию его в целое значение с использованием операции Math.floor или Math.trunc. В этом случае 5.5 будет преобразовано в 5, и после применения ~ мы получаем -(5 + 1), что равняется -6.

  2. ~(-6): Результатом будет 5. Здесь -6 превращается в 5, так как сначала происходит преобразование к целому числу (в данном случае уже целое) и затем побитовое отрицание. Таким образом, мы имеем -(-6 + 1), что равняется 5.

  3. ~~5.5: Результат будет 5, так как оператор ~~ можно представить как два последовательных применения Math.trunc, что эквивалентно отбрасыванию дробной части.

  4. ~~(-5.5): Результат будет -5. В данном случае -5.5 аналогично будет округлен до -5 с помощью Math.trunc, однако стоит отметить, что это не то же самое, что Math.floor(-5.5), который вернул бы -6.

Таким образом, операции ~ и ~~ служат для манипуляции с числами, позволяя эффективно округлить их и изменять знак.

Для получения дополнительной информации вы можете посетить: Dreaming in JavaScript.

0

Разница очень проста:

Длинная версия

Если вам важна читаемость кода, используйте Math.floor. Если же вы хотите сократить его, используйте тильду ~~.

В интернете можно встретить множество источников, утверждающих, что Math.floor быстрее, но иногда бывает и наоборот с ~~. Не стоит слишком зацикливаться на производительности, так как разница в скорости выполнения не будет заметна при обычном запуске кода. Возможно, в тестах это и проявится, но обычный человек не увидит разницы. Для более быстрого времени загрузки предпочтительнее использовать ~~.

Короткая версия

~~ короче и занимает меньше места. Math.floor улучшает читаемость. Иногда тильда быстрее, иногда Math.floor, но это не заметно.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь