Me pregunto si hay formas no triviales de encontrar el signo del número ( función signum ).
Pueden ser soluciones más cortas / rápidas / más elegantes que la obvia
var sign = number > 0 ? 1 : number < 0 ? -1 : 0;
¡Respuesta corta!
Use esto y estará seguro y rápido (fuente: moz )
if (!Math.sign) Math.sign = function(x) { return ((x > 0) - (x < 0)) || +x; };
Es posible que desee ver el violín de comparación de rendimiento y coerción de tipos
Ha pasado mucho tiempo. Además es principalmente por razones históricas.
Resultados
Por ahora tenemos estas soluciones:
1. Obvio y rápido
function sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }
1.1. Modificación de kbec : un tipo de lanzamiento menos, más eficaz , más corto [más rápido]
function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }
precaución: sign("0") -> 1
2. Elegante, corto, no tan rápido [más lento]
function sign(x) { return x && x / Math.abs(x); }
PRECAUCIÓN: sign(+-Infinity) -> NaN
,sign("0") -> NaN
A partir de Infinity
un número legal en JS, esta solución no parece del todo correcta.
3. El arte ... pero muy lento [más lento]
function sign(x) { return (x > 0) - (x < 0); }
4. Usando bit-shift
rápido, perosign(-Infinity) -> 0
function sign(x) { return (x >> 31) + (x > 0 ? 1 : 0); }
5. Tipo seguro [megafast]
! Parece que los navegadores (especialmente Chrome's v8) hacen algunas optimizaciones mágicas y esta solución resulta ser mucho más eficiente que otras, incluso que (1.1) a pesar de que contiene 2 operaciones adicionales y lógicamente nunca puede ser más rápida.
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
Herramientas
¡Las mejoras son bienvenidas!
[Offtopic] Respuesta aceptada
Andrey Tarantsov - +100 por el arte, pero lamentablemente es aproximadamente 5 veces más lento que el enfoque obvio
Frédéric Hamidi : de alguna manera, la respuesta más votada (por el momento) y es un poco genial, pero definitivamente no es así como se deben hacer las cosas, en mi humilde opinión. Además, no maneja correctamente los números Infinity, que también son números, ya sabes.
kbec - es una mejora de la solución obvia. No es tan revolucionario, pero en conjunto considero que este enfoque es el mejor. Vota por él :)
test everything
versión, Safe se negará a probar los valores especiales, ¡así que será más rápido! Intente ejecutar la only integers
prueba en su lugar. Además, JSPerf solo está haciendo su trabajo, no es cuestión de que le guste. :)
typeof x === "number"
da algo de magia al rendimiento. Por favor, haga más ejecuciones, especialmente FF, Opera e IE para que quede claro.
Math.sign()
(0 === 0, no tan rápido como "Seguro") que apareció en FF25 y está por venir en Chrome.
0
es un caso especial