想知道是否有任何简单的方法来查找数字的符号(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.类型安全[megafast]
!似乎浏览器(尤其是chrome的v8)进行了一些魔术般的优化,并且该解决方案比(1.1)更具性能,尽管它包含2个额外的操作,并且从逻辑上讲永远不会更快。
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
工具类
欢迎改进!
[Offtopic]已接受的答案
安德烈·塔兰佐夫(Andrey Tarantsov) -+100,但遗憾的是,它比明显的方法慢了大约5倍
弗雷德里克·哈米迪(FrédéricHamidi) -某种程度上最受欢迎的答案(在撰写本文时),这有点酷,但是,恕我直言,这绝对不是应该如何做的事情。同样,它不能正确处理无穷大数字,这也是数字。
kbec-是明显解决方案的改进。并不是那么具有革命性,但是综合起来我认为这种方法是最好的。为他投票:)
test everything
版本,Safe将拒绝测试特殊值,因此速度会更快!尝试运行only integers
测试。而且,JSPerf只是在做他的工作,不是喜欢它的问题。:)
typeof x === "number"
为性能提供了一些魔术。请进行更多运行,尤其是FF,Opera和IE,以使其更加清晰。
0
是一种特殊情况