Цікаво, чи існують якісь нетривіальні способи пошуку ознаки числа ( функція signum )?
Можуть бути коротшими / швидшими / більш елегантними рішеннями, ніж очевидні
var sign = number > 0 ? 1 : number < 0 ? -1 : 0;
Коротка відповідь!
Використовуйте це, і ви будете безпечні та швидкі (джерело: moz )
if (!Math.sign) Math.sign = function(x) { return ((x > 0) - (x < 0)) || +x; };
Ви можете подивитися на продуктивність і типу примушувати порівняння скрипки
Давно минув час. Далі йде переважно з історичних причин.
Результати
На даний момент у нас є такі рішення:
1. Очевидний і швидкий
function sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }
1.1. Модифікація від kbec - один тип: менший, ефективніший, коротший [найшвидший]
function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }
обережність: sign("0") -> 1
2. Елегантний, короткий, не такий швидкий [найповільніший]
function sign(x) { return x && x / Math.abs(x); }
застерігають: sign(+-Infinity) -> NaN
,sign("0") -> NaN
Так Infinity
як юридичний номер у JS, це рішення не здається повністю коректним.
3. Мистецтво ... але дуже повільне [найповільніше]
function sign(x) { return (x > 0) - (x < 0); }
4. Використання біт-зсуву
швидко, алеsign(-Infinity) -> 0
function sign(x) { return (x >> 31) + (x > 0 ? 1 : 0); }
5. Безпечний тип [мегафаст]
! Схоже, що браузери (особливо хром v8) роблять деякі магічні оптимізації, і це рішення виявляється набагато ефективнішим, ніж інші, навіть ніж (1.1), незважаючи на те, що він містить 2 додаткові операції, і логічно ніколи не може бути швидшим.
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
Інструменти
Поліпшення вітаються!
[Offtopic] Прийнята відповідь
Андрій Таранцов - +100 для мистецтва, але, на жаль, це приблизно в 5 разів повільніше, ніж очевидний підхід
Фредерік Хаміді - якось найбільш схвалена відповідь (на той час написана), і це якось круто, але це точно не так, як слід робити, імхо. Крім того, він неправильно обробляє числа нескінченності, які також є числами.
kbec - це вдосконалення очевидного рішення. Не такий революційний, але, приймаючи всіх разом, я вважаю цей підхід найкращим. Проголосуйте за нього :)
test everything
версію, Safe відмовиться перевіряти спеціальні значення, так що це буде швидше! Спробуйте only integers
замість цього запустити тест. Крім того, JSPerf просто виконує свою роботу, це не питання вподобання. :)
typeof x === "number"
робить магію перформансу. Будь ласка, зробіть більше запусків, особливо FF, Opera та IE, щоб це було зрозуміло.
Math.sign()
(0 === 0, не такий швидкий, як "Безпечний"), який з'явився у FF25 і має бути в хромі.
0
це особливий випадок