数値の符号 ( 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からの変更- 1 つのタイプのキャストが少なく、パフォーマンスが高く、短い[最速]
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
ofInfinity
は 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) よりもはるかにパフォーマンスが高いことが判明しました。
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
ツール
- jsperf パフォーマンステスト。
- fiddle - 型キャスト テスト。
改善大歓迎です!
[オフトピック] 受け入れられた回答
アンドレイ・タランツフ- アートの場合は +100 ですが、悲しいことに、明白なアプローチよりも約 5 倍遅くなります。
フレデリック・ハミディ- どういうわけか最も支持された答え(執筆中)であり、それはちょっとクールですが、それは間違いなく物事がどのように行われるべきかではありません. また、数字でもある無限数を正しく処理しません。
kbec - 明白な解決策の改善です。それほど革新的ではありませんが、すべてを総合すると、このアプローチが最善であると考えています。彼に投票してください:)