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

Он скрывает намерение кода.

Это два одиночных оператора тильды, поэтому он побито дополняет (побитовое) два раза. Операции выходят друг за другом, поэтому единственным оставшимся эффектом является преобразование, которое выполняется до того, как будет применен первый оператор, т.е. Преобразование значения в целое число.

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

Обновление 2011-08:

При оптимизации механизма JavaScript в браузерах производительность для операторов и функций изменяется. В современных браузерах использование ~~ вместо Math.floor несколько быстрее в некоторых браузерах, а не в некоторых браузерах. Если вам действительно нужен дополнительный бит производительности, вам нужно будет написать другой оптимизированный код для каждого браузера.

Смотрите: тильда против пола

Ответ 3

~(5.5)   // => -6
~(-6)    // => 5
~~5.5    // => 5  (same as Math.floor(5.5))
~~(-5.5) // => -5 (NOT the same as Math.floor(-5.5), which would give -6 )

Для получения дополнительной информации см.:

Ответ 4

Дифференциал очень прост:

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

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

В Интернете много источников, говоря < <20 > быстрее, но иногда ~~. Я бы не рекомендовал вам думать о скорости, потому что он не будет замечен при запуске кода. Может быть, в тестах и ​​т.д., Но ни один человек не может увидеть здесь разницу. Что бы быстрее было использовать ~~ для более быстрого времени загрузки.

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

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