Цікаво, чи існують якісь нетривіальні способи пошуку ознаки числа ( функція 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це особливий випадок