283

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 には"8"orがないため"9"、関数はゼロを返します。好むと好まざるとにかかわらず、これは仕様によるものです

回避策は何ですか?

注:完全を期すために、解決策を投稿しようとしていますが、それは私が嫌いな解決策なので、他の/より良い回答を投稿してください。


アップデート:

JavaScript 標準の第 5 版 ( ECMA-262 ) では、この動作を排除する重大な変更が導入されています。Mozilla には良い記事があります。

4

10 に答える 10

331

これは、単純な解決策を備えた一般的な Javascript の落とし穴です。

次のように baseまたは 'radix' を指定するだけです。

parseInt('08',10); // 8

Numberを使用することもできます:

Number('08'); // 8
于 2009-05-11T22:15:56.253 に答える
44

値が符号付き 32 ビット整数の範囲にあることがわかっている場合~~xは、すべてのシナリオで正しいことを行います。

~~"08" === 8
~~"foobar" === 0
~~(1.99) === 1
~~(-1.99)  === -1

( ) 以外のバイナリを検索する場合、仕様では、Int32 への明らかな変換を行い、値をゼロ~に強制するように指定されている引数の "ToInt32" 変換が必要です。NaN

はい、これは信じられないほどハックですが、とても便利です...

于 2010-01-05T14:15:58.903 に答える
24

parseInt ドキュメントから、オプションの基数引数を使用して base-10 を指定します。

parseInt('08', 10); //equals 8
parseInt('09', 10); //equals 9

これは、衒学的で、紛らわしく、冗長であると思います(本当に、すべての parseInt に余分な引数がありますか?)ので、より良い方法があることを願っています。

于 2009-05-11T22:16:25.520 に答える
12
function parseDecimal(s) { return parseInt(s, 10); }

編集: parseInt() 呼び出しに常に「,10」を追加したくない場合は、独自の関数を作成して、本当にやりたいことを実行することをお勧めします。非標準関数であるという欠点があります。頻繁に使用する場合は便利ですが、他の人にとっては混乱を招く可能性があります。

于 2009-05-11T22:19:14.423 に答える
10

ベースを指定します。

var number = parseInt(s, 10);
于 2009-05-11T22:16:36.440 に答える
5

10進数の場合はどうですか:

('09'-0) === 9  // true

('009'-0) === 9 // true
于 2012-01-20T03:20:07.243 に答える