Интересно, есть ли какие-нибудь нетривиальные способы найти знак числа ( сигнум-функция )?
Может быть короче / быстрее / элегантнее, чем очевидное
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. Безопасный тип [мегабыстрый]
! Похоже, браузеры (особенно chrome v8) делают некоторые волшебные оптимизации, и это решение оказывается намного более производительным, чем другие, даже чем (1.1), несмотря на то, что оно содержит 2 дополнительные операции и, по логике, никогда не может быть быстрее.
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
инструменты
Улучшения приветствуются!
[Offtopic] Ответ принят
Андрей Таранцов - +100 за искусство, но, к сожалению, это примерно в 5 раз медленнее очевидного подхода.
Фредерик Хамиди - ответ, получивший наибольшее количество голосов (на тот момент, когда я писал), и это вроде как круто, но это определенно не то, как надо делать, imho. Кроме того, он неправильно обрабатывает бесконечные числа, которые, как вы знаете, тоже являются числами.
kbec - это усовершенствование очевидного решения. Не то чтобы революционно, но в совокупности считаю такой подход лучшим. Проголосуйте за него :)
0
Дело в том, что иногда это особый случай