想知道是否有找到数字符号(信号函数信号函数)的重要方法?
可能比显而易见的解决方案更短、更快、更优雅
var sign = number > 0 ? 1 : number < 0 ? -1 : 0;
使用这个,你将是安全和快速的(来源: Moz)
if (!Math.sign) Math.sign = function(x) { return ((x > 0) - (x < 0)) || +x; };
您可能想看看性能和类型强制比较 小提琴
时过境迁,主要是历史原因。
目前我们有以下解决方案:
明显而迅速
function sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }
1.1. 强 > 从 Kbec改进-一型铸造少,性能更好,更短 [最快]
function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }
警告:
优雅,短小,不要那么快
function sign(x) { return x && x / Math.abs(x); }
警告: sign(+-Infinity) -> NaN
,sign("0") -> NaN
因为 Infinity
在 JS 中是一个合法的数字,所以这个解决方案似乎并不完全正确。
艺术... ... 但是非常缓慢
function sign(x) { return (x > 0) - (x < 0); }
4. 使用位移
很快,但是 sign(-Infinity) -> 0
function sign(x) { return (x >> 31) + (x > 0 ? 1 : 0); }
5. 类型安全 < strong > [ Megafast ]
!看起来浏览器(特别是 chrome 的 v8)做了一些神奇的优化,而且这个解决方案比其他方案性能更好,甚至比(1.1)更好,尽管它包含两个额外的操作,并且逻辑上不可能更快。
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
欢迎改进!
安德烈 · 塔兰特索夫(Andrey Tarantsov)对艺术的评价为 + 100,但遗憾的是,这比显而易见的方法慢了大约5倍
Kbec -是一个显而易见的解决方案的改进。不是那么具有革命性,但综合考虑,我认为这种方法是最好的。投他一票:)