[解決済み] javascriptでのNumber.sign()
質問
数の符号を見つけるための自明でない方法があるのだろうか (
符号関数
)?
明らかなものよりも短い/速い/よりエレガントなソリューションがあるかもしれません。
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. タイプセーフ [メガファスト]
! ブラウザ(特にクロームのv8)はいくつかの魔法のような最適化を行い、この解決策は他のものよりはるかにパフォーマンスが高いことが判明しているようです。
function sign(x) {
return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
ツール
改良を歓迎します!
[Offtopic] 回答受付中
-
アンドレイ・タランツォフ - しかし、悲しいことに、それは明白なアプローチよりも約5倍も遅いです。
-
フレデリック・ハミディ - は、(現時点では)最も多く投票された回答で、ちょっとクールですが、物事がどのように行われるべきかという点では、間違いなく間違っています。また、無限大の数を正しく扱えませんし、それは数字でもあります。
-
ケベック - は、明らかな解決策の改善です。それほど革命的ではありませんが、すべてを総合すると、この方法がベストだと考えています。彼に一票を投じましょう :)
どのように解決するのですか?
よりエレガントなバージョンの高速な解決策です。
var sign = number?number<0?-1:1:0
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】JavaScriptで10進数を検証する - IsNumeric()
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] 文字列とラベルのローカライズとグローバリゼーションのベストプラクティス【終了しました
-
[解決済み] 変異を伴わないオブジェクトからの値の削除
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 1桁の数字に0を付加して書式設定する方法は?
-
[解決済み] [解答】+0と-0は同じですか?
-
[解決済み] JavaScript で範囲を作成する - 奇妙な構文
-
[解決済み] TypeScriptのdeclare classとinterfaceの違いとは?
-
[解決済み] javascriptで文字列から関数を作成する方法はありますか?
-
[解決済み] JavaScriptでjson-objectのキーを取得する [重複].
-
[解決済み] $.ajax実行中にローディングイメージを表示する
-
[解決済み] Node.jsのES6クラスをrequireで作る
-
[解決済み] HTML要素にスクロールバーがあるかどうかをチェックする
-
[解決済み] JavaScriptデータフォーマット/プリティプリンタ