想知道是否有任何重要的方法可以找到数字的符号(符号函数)?
可能比显而易见的解决方案更短/更快/更优雅
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éric Hamidi - 不知何故,这是最受好评的答案(在写作时间),它有点酷,但这绝对不是应该如何做的,恕我直言。它也不能正确处理无穷大数字,你知道,它们也是数字。
kbec - 是对明显解决方案的改进。不是革命性的,但综合起来,我认为这种方法是最好的。投票给他:)