Интересно, существуют ли какие-либо нетривиальные способы нахождения знака числа (функция signum)?
Могут быть более короткие/быстрые/более элегантные решения, чем очевидные.
var sign = number > 0 ? 1 : number < 0 ? -1 : 0;
Короткая выдержка
Используйте это, и вы будете в безопасности и быстро
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
Результаты
Теперь мы имеем следующие решения:
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 раз медленнее, чем очевидный подход
-
Frédéric Hamidi - как-то самый лучший ответ (для написания времени), и это довольно круто, но определенно не так, как должно быть сделано, imho, Также он неправильно обрабатывает номера бесконечности, которые также являются числами.
-
kbec - это улучшение очевидного решения. Не то, что революционер, но, взяв все вместе, я считаю этот подход лучшим. Голосуйте за него:)