我已经在各种情况下使用parseInt()
andparseFloat()
一段时间了,我想我知道这两者的所有来龙去脉。但是最近我有一个奇怪的想法,到目前为止我还无法确定地证明它。
考虑以下函数:
function testProof(strInteger) {
assert(strInteger === '' + parseInt(strInteger, 10));
assert(parseInt(strInteger, 10) === parseFloat(strInteger));
}
// Sample calls...
testProof("5");
testProof("109");
testProof("-55");
首先,我们assert
将输入转换为整数,然后再转换回字符串会再次生成原始字符串。这可以防止parseInt("100bucks")
返回的情况100
,并且它还确保没有被转换截断的小数部分——我们要确保输入实际上是一个整数、整数字符串。
如果成功,我们assert
将parseInt(..., 10)
返回与 相同的值parseFloat(...)
。
assert
第一个失败的原因有很多:
- 输入不是整数 (
"1.5"
) - 输入有前导零 (
"0050"
) - 输入有尾随垃圾 (
"100bucks"
) - 输入是指数符号 (
"1e3"
),或者它太大而变成指数 - 输入不可解析,导致
NaN
- 也许其他人?
但问题是:只要第一次assert
通过,第二次assert
会失败吗?换句话说,如果我们提前知道输入是字符串中的整数,则可以parseFloat(...)
作为parseInt(..., 10)
? (并不是说这是一个很好的替代品...... :-P)