1

我已经在各种情况下使用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,并且它还确保没有被转换截断的小数部分——我们要确保输入实际上是一个整数、整数字符串。

如果成功,我们assertparseInt(..., 10)返回与 相同的值parseFloat(...)

assert第一个失败的原因有很多:

  • 输入不是整数 ( "1.5")
  • 输入有前导零 ( "0050")
  • 输入有尾随垃圾 ( "100bucks")
  • 输入是指数符号 ( "1e3"),或者它太大而变成指数
  • 输入不可解析,导致NaN
  • 也许其他人?

但问题是:只要第一次assert通过,第二次assert会失败吗?换句话说,如果我们提前知道输入是字符串中的整数,则可以parseFloat(...)作为parseInt(..., 10)? (并不是说这是一个很好的替代品...... :-P)

4

2 回答 2

1

它实际上只能通过以下输入失败:

testProof("NaN");

但是如果你真的知道它是一个整数,为什么还要测试呢?parseFloat 也不能​​很好地替代 parseInt,因为在很多情况下,您不知道它是否真的是整数而不是浮点数。

于 2014-07-25T18:20:48.483 回答
-1

虽然我无法提供证明,但 JS 并没有区分整数和浮点数。parseFloat 和 parseInt 之间的唯一区别是它们如何解释小数点等内容。但是,如果输入字符串是常规表示法中的有效整数(如第一个断言所断言的那样),它们将始终产生相同的数值,这在 JS 中意味着它们也是相同的类型。

于 2014-07-25T18:24:20.220 回答