1. ホーム
  2. ジャバスクリプト

[解決済み】parseInt(null, 24) === 23... 待って、何?

2022-04-06 06:15:05

質問

さて、parseIntが初期化されていない値をどのように処理するのかを確認するためにいじっていたら、このgemに行き当たりました。24以上の基数の場合、以下のようになります。

parseInt(null, 24) === 23 // evaluates to true

IE、Chrome、Firefoxでテストしたところ、すべてtrueのアラートが出たので、どこかの仕様にあるのだろうと思っているのですが、どうでしょうか?Googleで検索しても結果が出なかったので、どなたか説明していただけると幸いです。

クロックフォードのスピーチを聞いていて思い出したのですが、彼が言っていたのは typeof null === "object" というのも、メモリ上でObjectとNullがほぼ同じ型識別子になってしまうという見落としがあったとか、そういうことです。

試してみてください。 http://jsfiddle.net/robert/txjwP/

編集 訂正:基数が大きくなると異なる結果が返され、32は785077を返します。

2を編集 zzzzBovより。 [24...30]:23, 31:714695, 32:785077, 33:859935, 34:939407, 35:1023631, 36:1112745


tl;dr

理由を説明する parseInt(null, 24) === 23 は、真の文である。

どのように解決するのですか?

変換中 null を文字列 "null" と入力し、変換を試みます。0から23までの基数の場合,変換できる数値はない。 NaN . 24の時。 "n" が加わり、14文字になりました。31で "u" が追加され、文字列全体が解読できるようになりました。37以降は生成できる有効な数字がなくなり、NaNが返される。

js> parseInt(null, 36)
1112745

>>> reduce(lambda x, y: x * 36 + y, [(string.digits + string.lowercase).index(x) for x in 'null'])
1112745