0

編集: 問題は、parseInt を使用したときにベースを指定していなかったことです。なぜこれが起こったのかを正確に理解したいと思います.なぜこれがfirefoxの08と09の値に対してのみ問題を引き起こしたのかを教えてくれる人に答えを与えます.


MySQL データベースに JSON オブジェクトとして格納されている整数の 2 次元配列があります。

jquery の ajax を介してこのオブジェクトを要求すると、JSON が検証されます。JSONLintも問題なく通過します。次に、それを 2 次元の JavaScript 配列に変換し、parseInt を使用して文字列のみの JSON キーを配列の整数キーに変換します。

これは、ほとんどすべてのブラウザー/プラットフォームで問題なく機能します。

元の JSON:

....
"07": [0, 1...
"08": [0, 1...
"09": [1, 1...
"10": [1, 0...
....

for ループ出力 (Safari/Chrome、OSX):

JSON Key (parseInt value): [array]
....
07 (7): [0, 1...
08 (8): [0, 1...
09 (9): [1, 1...
10 (10): [1, 0...
....

for ループ出力 (Firefox OSX、iOS):

JSON Key (parseInt value): [array]
....
07 (7): [0, 1...
08 (0): [0, 1...
09 (0): [1, 1...
10 (10): [1, 0...
....

...一体何?これらのキー (8 と 9) だけが正しく parseInt を通過せず、非常に一貫して発生します。私は、JSON 配列がすべてのブラウザーに無傷で変更されていないことを確認しました。キーが 08 と 09 のままであるという事実は、その証拠です。ただし、08 と 09 が parseint を通過するとすぐに、それらは 0 を返します。18 と 19 は適切に通過し、28 と 29 も同様です。これらの 2 つのキーの周囲には、スペースや非 ASCII 文字など、それらを引き起こす可能性のあるものはありません。不当に読まれる。私は完全に困惑しています。

ここで完全な JSON を見つけることができます。私は何が欠けていますか?

あるいは、これを完全に回避できる方法があれば、喜んで検討します。助けてくれてありがとう、これは私を夢中にさせています!

4

1 に答える 1

3

で始まる文字列0の基数は 8 進数にすることができます (基数が指定されていない場合 - ブラウザーによって異なります)。

あなたは探している:

parseInt("09", 10);// parseInt("09")=0
parseInt("08", 10);// parseInt("08")=0

なぜ?

基数が未定義または 0 の場合、JavaScript は次のように想定します。

  • 入力文字列が「0x」または「0X」で始まる場合、基数は 16 (16 進数) です。
  • 入力文字列が「0」で始まる場合、基数は 8 (8 進数) です。この機能は非標準であり、一部の実装では意図的にサポートされていません (基数 10 を使用する代わりに)。このため、parseInt を使用するときは常に基数を指定してください。
  • 入力文字列がその他の値で始まる場合、基数は 10 (10 進数) です。

parseInt('08') と parseInt('09')はどちらもゼロを返します。これは、関数が使用される数値システムの正しい基数を決定しようとするためです。Javascript では、ゼロで始まる数値は 8 進数と見なされ、8 進数には 08 または 09 がないため、問題が発生します。

のドキュメントを参照してくださいparseInt

   var test = parseInt(value, 10);

valueターゲットとする入力の が必要であることを伝える必要があります。

また、常に第 2 引数 (基数) を に指定しparseIntます。提供されていない場合は巧妙すぎて自動検出しようとし、予期しない結果につながる可能性があります。

提供10は、基数 10 の数値が必要であることを前提としています。

于 2013-02-16T23:10:45.307 に答える