Actualización de agosto de 2012:
he hecho un poco de perfiles con estas implementaciones:
/* Test 1: */ b = Math.abs(a);
/* Test 2: */ b = abs(a); //local copy: abs = Math.abs;
/* Test 3: */ b = a < 0 ? a * -1 : a;
/* Test 4: */ b = a < 0 ? -a : a;
me dieron el siguiente resultado en Windows 7. Los valores se normalizan tras el resultado más rápido por el navegador para que sea más fácil comparar qué método es más rápido:
1:Math 2:abs 3:*-1 4:- 1.0= Version
Chrome 1.0 1.0 1.0 1.0 111ms 21.0.1180.75 m
Firefox 1.0 1.0 1.2 1.2 127ms 14.0.1
IE 1.4 1.0 1.1 1.0 185ms 9.0.8112
Opera 1.9 1.6 1.1 1.0 246ms 12.00
Safari 1.6 1.6 1.1 1.0 308ms 5.1.7
Conclusión: Cuando hice esta prueba hace 3 años, -a fue más rápido, pero ahora Math.abs (x) es más rápido en Firefox. En Chrome abs(a)
y -a
obtuve el mismo tiempo y solo hubo 3 ms de diferencia con el método más lento cuando lo probé con 10 000 000 de números.
Mi recomendación: Utilice Math.abs (a). Si se encuentra en un bucle estrecho y por un perfil ha encontrado que es demasiado lento, puede utilizar una referencia local a la función ABS:
var abs=Math.abs; //A local reference to the global Math.abs function
for (i=0;i<1234567890;++i) if (abs(v[i]) > 10) ++x;
De hecho, puede ser más rápido usar -x en lugar de x * -1. – Prestaul
Respuesta rápida para la gente del futuro: [tampoco, realmente.] (Http://jsperf.com/abs-vs-n1) – Tortoise
.. a menos que use una función personalizada: http://jsperf.com/math -abs-vs-custom-abs-function donde 'Math.abs()' gana masivamente que cualquier otra cosa. – h2ooooooo