ejemplos - ¿Qué es el operador “doble tilde”(~~) en JavaScript?
javascript html (4)
Esta pregunta ya tiene una respuesta aquí:
- ¿Qué hace ~~ (“doble tilde”) en Javascript? 9 respuestas
Estoy viendo esto en algún código, y no tengo idea de lo que 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 ~~
?
Ese ~~
es un doble operador NO bit a bit.
Se utiliza como un sustituto más rápido para Math.floor()
.
La diferencia es muy simple:
Versión larga
Si quieres tener una mejor legibilidad, usa Math.floor
. Pero si quieres minimizarlo, usa tilde ~~
.
Hay muchas fuentes en Internet que dicen que Math.floor
es más rápido, pero a veces ~~
. No recomendaría que pienses en la velocidad porque no se notará al ejecutar el código. Tal vez en pruebas, etc., pero ningún ser humano puede ver una diferencia aquí. Lo que sería más rápido es usar ~~
para un tiempo de carga más rápido.
Version corta
~~
es más corto / ocupa menos espacio. Math.floor
mejora la legibilidad. A veces, la tilde es más rápida, a veces Math.floor
es más rápida, pero no se nota.
Oculta la intención del código.
Son dos operadores de tilde individuales, por lo que hace un complemento a nivel de bits (no a nivel de bits) 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 en un número entero.
Algunos lo usan como una alternativa más rápida a Math.floor
, pero la diferencia de velocidad no es tan dramática, y en la mayoría de los casos es solo una micro optimización. A menos que tenga un fragmento de código que realmente necesite ser optimizado, debe usar código que describa lo que hace en lugar de código que usa un efecto secundario de una no operación.
Actualización 2011-08:
Con la optimización del motor de JavaScript en los navegadores, el rendimiento para los operadores y las funciones cambia. Con los navegadores actuales, usar ~~
lugar de Math.floor
es algo más rápido en algunos navegadores, y no más rápido en algunos navegadores. Si realmente necesitas ese bit extra de rendimiento, deberías escribir un código optimizado diferente para cada navegador.
Ver: tilde vs piso.
~(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 más información, ver: