javascript - tablas - Usando O bit a 0 para plantar un número
obtener datos de una tabla html javascript (5)
Un colega mío tropezó con un método para colocar los números del flotador usando un bit a bit o:
var a = 13.6 | 0; //a == 13
Estábamos hablando de eso y nos preguntamos algunas cosas.
- ¿Como funciona? Nuestra teoría era que el uso de dicho operador arroja el número a un número entero, eliminando así la parte fraccionaria
- ¿Tiene alguna ventaja sobre hacer
Math.floor
? Tal vez es un poco más rápido? (juego de palabras no intencionado) - ¿Tiene alguna desventaja? Tal vez no funciona en algunos casos? La claridad es obvia, ya que tuvimos que resolverlo, y bueno, estoy escribiendo esta pregunta.
Gracias.
¿Como funciona? Nuestra teoría era que el uso de dicho operador arroja el número a un número entero, eliminando así la parte fraccionaria
Todas las operaciones a nivel de bit, excepto el desplazamiento a la derecha sin signo, >>>
, funcionan en enteros de 32 bits con signo. Entonces, usar operaciones a nivel de bits convertirá un flotante en un entero.
¿Tiene alguna ventaja sobre hacer Math.floor? Tal vez es un poco más rápido? (juego de palabras no intencionado)
http://jsperf.com/or-vs-floor/2 parece un poco más rápido
¿Tiene alguna desventaja? Tal vez no funciona en algunos casos? La claridad es obvia, ya que tuvimos que resolverlo, y bueno, estoy escribiendo esta pregunta.
- No pasará jsLint.
- Sólo enteros con signo de 32 bits
- Odd Comportamiento comparativo:
Math.floor(NaN) === NaN
, while(NaN | 0) === 0
En ECMAScript 6, el equivalente de |0
es Math.trunc , tipo de lo que debería decir:
Devuelve la parte integral de un número eliminando los dígitos fraccionarios. Simplemente trunca el punto y los dígitos detrás de él, sin importar si el argumento es un número positivo o negativo.
Math.trunc(13.37) // 13
Math.trunc(42.84) // 42
Math.trunc(0.123) // 0
Math.trunc(-0.123) // -0
Math.trunc("-1.123")// -1
Math.trunc(NaN) // NaN
Math.trunc("foo") // NaN
Math.trunc() // NaN
Esto es truncamiento en oposición al piso. La respuesta de Howard es más o menos correcta; Pero agregaría que Math.floor
hace exactamente lo que se supone con respecto a los números negativos. Matemáticamente, eso es lo que es un piso.
En el caso que describió anteriormente, el programador estaba más interesado en el truncamiento o en cortar completamente el decimal. Aunque, la sintaxis que utilizaron oscurece el hecho de que están convirtiendo el flotante en un int.
Tu primer punto es correcto. El número se convierte en un número entero y, por lo tanto, se eliminan los dígitos decimales. Tenga en cuenta que Math.floor
redondea al siguiente entero hacia menos infinito y, por lo tanto, arroja un resultado diferente cuando se aplica a números negativos.