Обновлено август 2012 г. :
Я провел профилирование с этими реализациями:
/* 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;
Я получил следующий результат в Windows 7. Значения нормализуются после самого быстрого результата для каждого браузера, чтобы упростить сравнение, какой метод быстрее:
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
Вывод:
Когда я делал этот тест 3 года назад, -a был самым быстрым, но теперь Math.abs (x) быстрее в Firefox! В Chrome abs(a)
и -a
получили одно и то же время, и разница между самым медленным методом составляла всего 3 мс, когда я тестировал его с 10 000 000 чисел.
Моя рекомендация : Используйте Math.abs (a) . Если вы находитесь в тесном цикле и профилирование показало, что оно слишком медленное, вы можете использовать локальную ссылку на функцию 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;