O que é o operador “double tilde” (~~) em JavaScript?

Estou vendo isso em algum código e não tenho ideia do que ele faz:

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; }; 

O que o operador faz?

Isso ~~ é um operador duplo não bit a bit.

É usado como um substituto mais rápido para Math.floor() .

Ele esconde a intenção do código.

São dois únicos operadores de til, então ele faz um complemento bit a bit (bitwise não) duas vezes. As operações tiram uma da outra, então o único efeito restante é a conversão que é feita antes do primeiro operador ser aplicado, isto é, convertendo o valor para um número inteiro.

Alguns usam isso como uma alternativa mais rápida para o Math.floor , mas a diferença de velocidade não é tão dramática e, na maioria dos casos, é apenas uma otimização micro. A menos que você tenha um pedaço de código que realmente precise ser otimizado, você deve usar o código que descreve o que ele faz em vez do código que usa um efeito colateral de uma não operação.

Atualização 2011-08:

Com a otimização do mecanismo de JavaScript nos navegadores, o desempenho de operadores e funções é alterado. Com os navegadores atuais, usar ~~ vez de Math.floor é um pouco mais rápido em alguns navegadores e não mais rápido em alguns navegadores. Se você realmente precisar desse desempenho extra, precisará escrever um código otimizado diferente para cada navegador.

Veja: til vs floor

 ~(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 ) 

Para mais informações, consulte:

O diffrence é muito simples:

Versão longa

Se você quiser ter uma melhor legibilidade, use o Math.floor . Mas se você quiser minimizá-lo, use til ~~ .

Há muitas fonts na internet dizendo que o Math.floor é mais rápido, mas às vezes ~~ . Eu não recomendaria que você pensasse em velocidade, porque isso não será percebido ao executar o código. Talvez nos testes, etc, mas nenhum ser humano pode ver uma diferença aqui. O que seria mais rápido é usar ~~ para um tempo de carregamento mais rápido.

Versão curta

~~ é mais curto / ocupa menos espaço. Math.floor melhora a legibilidade. Às vezes o til é mais rápido, às vezes o Math.floor é mais rápido, mas não é perceptível.