一尘不染

JavaScript中的Number.sign()

algorithm

想知道是否有任何简单的方法来查找数字的符号(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) -> NaNsign("0") -> NaN

截至InfinityJS中的合法数字为止,此解决方案似乎并不完全正确。


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-是显而易见的解决方案的改进。并不是那么具有革命性,但综合起来我认为这种方法是最好的。为他投票:)


阅读 373

收藏
2020-07-28

共1个答案

一尘不染

快速解决方案的更优雅版本:

var sign = number?number<0?-1:1:0
2020-07-28