好吧,所以我在搞乱 parseInt 以查看它如何处理尚未初始化的值,我偶然发现了这个 gem。以下情况适用于任何 24 或以上的基数。
parseInt(null, 24) === 23 // evaluates to true
我在 IE、Chrome 和 Firefox 中对其进行了测试,它们都非常正确,所以我认为它一定在规范中的某个地方。快速谷歌搜索没有给我任何结果,所以我在这里,希望有人能解释一下。
我记得听过 Crockford 的演讲,他说typeof null === "object"的是因为疏忽导致 Object 和 Null 在内存中具有几乎相同的类型标识符或类似的东西,但我现在找不到那个视频。
typeof null === "object"
试试看:http: //jsfiddle.net/robert/txjwP/
编辑 更正:更高的基数返回不同的结果,32 返回 785077 编辑 2 来自 zzzzBov:[24...30]:23, 31:714695, 32:785077, 33:859935, 34:939407, 35:1023631, 36:1112745
[24...30]:23, 31:714695, 32:785077, 33:859935, 34:939407, 35:1023631, 36:1112745
tl;博士
解释为什么parseInt(null, 24) === 23是一个真实的陈述。
parseInt(null, 24) === 23
它正在转换null为字符串"null"并尝试转换它。对于从 0 到 23 的基数,它没有可以转换的数字,因此它返回NaN. 在 24处,"n"第 14 个字母被添加到数字系统中。在 31处,"u"添加第 21 个字母,并且可以解码整个字符串。在 37 上,不再有任何可以生成的有效数字集,并且返回 NaN。
null
"null"
NaN
"n"
"u"
js> parseInt(null, 36) 1112745 >>> reduce(lambda x, y: x * 36 + y, [(string.digits + string.lowercase).index(x) for x in 'null']) 1112745