想知道是否有任何重要的方法可以找到数字的符号(符号函数 http://en.wikipedia.org/wiki/Signum_function)?
可能比明显的解决方案更短/更快/更优雅
var sign = number > 0 ? 1 : number < 0 ? -1 : 0;
简短的回答!
使用这个,你会安全又快速(来源:moz https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign)
if (!Math.sign) Math.sign = function(x) { return ((x > 0) - (x < 0)) || +x; };
您可能想查看性能和类型强制比较fiddle http://jsfiddle.net/disfated/NJFSa/
已经过去很长时间了。进一步主要是历史原因。
Results
目前我们有以下解决方案:
1.明显且快速
function sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }
1.1.修改自kbec /users/854291/kbec- 一种类型铸件更少,性能更高,更短[最快的]
function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }
caution: sign("0") -> 1
2.优雅、简短、不那么快[最慢]
function sign(x) { return x && x / Math.abs(x); }
caution: sign(+-Infinity) -> NaN
, sign("0") -> NaN
As of 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;
}
Tools
-
jsperf http://jsperf.com/signs/3性能测试;
-
fiddle http://jsfiddle.net/disfated/NJFSa/- 类型转换测试;
欢迎改进!
[题外话] 接受的答案
安德烈·塔兰佐夫 /a/14418335/489553- 艺术+100,但遗憾的是它比明显的方法慢了大约 5 倍
弗雷德里克·哈米迪 /a/7624945/489553- 不知何故,这是获得最多支持的答案(在撰写本文时),这有点酷,但恕我直言,这绝对不是应该做的事情。而且它不能正确处理无穷大数字,你知道,它们也是数字。
kbec /a/9079549/489553- 是对显而易见的解决方案的改进。虽然不是那么革命性,但综合考虑,我认为这种方法是最好的。投票给他:)