JavaScript の parseInt 8 進数の動作を回避するにはどうすればよいですか?
-
21-08-2019 - |
質問
JavaScript で以下を実行してみてください。
parseInt('01'); //equals 1
parseInt('02'); //equals 2
parseInt('03'); //equals 3
parseInt('04'); //equals 4
parseInt('05'); //equals 5
parseInt('06'); //equals 6
parseInt('07'); //equals 7
parseInt('08'); //equals 0 !!
parseInt('09'); //equals 0 !!
JavaScript では先頭のゼロが意味を示すと考えられるということを、やっと学びました。 8 進整数, 、がないので、 "8"
または "9"
基数 8 では、関数はゼロを返します。好むと好まざるとにかかわらず、 これは仕様です.
回避策は何ですか?
注記:完全を期すために、解決策を投稿しようとしていますが、それは私が嫌いな解決策であるため、他の/より良い回答を投稿してください。
アップデート:
JavaScript 標準の第 5 版 (ECMA-262) この動作を排除する重大な変更が導入されました。Mozilla には優れた機能があります 書き上げる.
他のヒント
もし、あんたが 知る 値は符号付き 32 ビット整数の範囲内になります。 ~~x
すべてのシナリオで正しい動作を行います。
~~"08" === 8
~~"foobar" === 0
~~(1.99) === 1
~~(-1.99) === -1
バイナリを検索しない場合 (~
)、仕様では、引数に「ToInt32」変換が必要です。これは、Int32 への明白な変換を実行し、強制するように指定されています。 NaN
値をゼロにします。
はい、これは信じられないほどハック的ですが、とても便利です...
から parseInt ドキュメント, 、オプションの radix 引数を使用して基数 10 を指定します。
parseInt('08', 10); //equals 8
parseInt('09', 10); //equals 9
これは衒学的で、わかりにくく、冗長に感じられるので (本当に、すべての parseInt に追加の引数が必要?)、より良い方法があることを願っています。
function parseDecimal(s) { return parseInt(s, 10); }
編集:本当にやりたいことを実行するために独自の関数を作成することは、parseInt() 呼び出しに常に ",10" を追加するのが嫌な場合の単なるオプションです。これには、非標準関数であるという欠点があります。頻繁に使用する人にとっては便利ですが、他の人にとってはさらに混乱する可能性があります。
ベースを指定します。
var number = parseInt(s, 10);
parseInt に 2 番目のパラメータがない場合に 10 進数を想定するバージョンに置き換えるのは非常に不正なことでしょうか?(注 - テストされていません)
parseIntImpl = parseInt
parseInt = function(str, base){return parseIntImpl(str, base ? base : 10)}
10進数の場合は次のようになります。
('09'-0) === 9 // true
('009'-0) === 9 // true
parseFloat または parseInt を使用する代わりに、単項演算子 (+).
+"01"
// => 1
+"02"
// => 2
+"03"
// => 3
+"04"
// => 4
+"05"
// => 5
+"06"
// => 6
+"07"
// => 7
+"08"
// => 8
+"09"
// => 9
そして念のため
+"09.09"
// => 9.09
単項プラス演算子はオペランドの前にあり、そのオペランドに評価されますが、まだ数値に変換されていない場合は、数値に変換しようとします。単項否定 (-) は数値以外も変換できますが、 単項プラスは、何かを数値に変換する最も速くて好ましい方法です。, なぜなら、数値に対して他の操作は実行されないからです。
parseInt を使用してすでに大量のコーディングを行っており、すべてに「,10」を追加したくない場合は、関数をオーバーライドして基数 10 をデフォルトにすることができます。
window._oldParseInt = window.parseInt;
window.parseInt = function(str, rad) {
if (! rad) {
return _oldParseInt(str, 10);
}
return _oldParseInt(str, rad);
};
これは後で読む人を混乱させる可能性があるため、parseInt10() 関数を作成する方がわかりやすいかもしれません。個人的には、常に ",10" を追加するよりも、単純な関数を使用することを好みます。ただ、間違いが発生する可能性が高くなります。