¿Qué es el operador de "doble tilde" (~~) en JavaScript? [duplicar]

Resuelto jismo asked hace 13 años • 4 respuestas

Veo esto en algún código y no tengo idea de qué hace:

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

¿ Qué ~~hace el operador?

jismo avatar May 12 '11 06:05 jismo
Aceptado

Ese ~~es un operador NOT bit a bit doble .

Se utiliza como sustituto más rápido deMath.floor() los números positivos . No devuelve el mismo resultado que Math.floor()para los números negativos, ya que simplemente corta la parte después del decimal (consulte otras respuestas para ver ejemplos de esto).

ghoppe avatar May 11 '2011 23:05 ghoppe

Oculta la intención del código.

Son dos operadores de tilde única, por lo que realiza un complemento bit a bit (no bit a bit) dos veces. Las operaciones se eliminan entre sí, por lo que el único efecto restante es la conversión que se realiza antes de que se aplique el primer operador, es decir, convertir el valor a un número entero.

Algunos lo utilizan como una alternativa más rápida Math.floor, pero la diferencia de velocidad no es tan dramática y, en la mayoría de los casos, se trata simplemente de una microoptimización. A menos que tenga un fragmento de código que realmente deba optimizarse, debe usar código que describa lo que hace en lugar de código que use un efecto secundario de una no operación.

Actualización 2011-08:

Con la optimización del motor JavaScript en los navegadores, el rendimiento de los operadores y funciones cambia. Con los navegadores actuales, usar ~~en lugar de Math.floores algo más rápido en algunos navegadores, y nada más rápido en algunos navegadores. Si realmente necesita un poco más de rendimiento, deberá escribir un código optimizado diferente para cada navegador.

Ver: tilde vs piso

Guffa avatar May 11 '2011 23:05 Guffa
~(5.5)   // => -6
~(-6)    // => 5
~~5.5    // => 5  (same as Math.trunc(5.5) and Math.floor(5.5))
~~(-5.5) // => -5 (same as Math.trunc(-5.5) but NOT the same as Math.floor(-5.5), which would give -6 )

Para obtener más información, consulte:

  • http://dreaminginjavascript.wordpress.com/2008/07/04/28/
bowsersenior avatar May 11 '2011 23:05 bowsersenior