为什么parseInt(0.0000008) === 8?

前言

从函数本身出发

  • 这个出乎意料的结果似乎和IEEE 754浮点数标准并没有关系,而是parseInt函数本身的原因,先来看几个用parseInt方法将字符串转换为数字的例子:
parseInt('   1   2323') // 1
parseInt('  abc1abc2323') // NaN
parseInt('  **1abc2323') // NaN
parseInt('    1abc2323') // 1
parseInt(' 12.9999') // 12
parseInt("  0x11")  // 17
  • 从中可以看出几条规则:
    1.字符串左边的空格会被忽略掉
    2.从左到右依次取数字字符串,如果最左边以非数字开头则返回NaN
    3.取到第一个数字字符后继续,直到取到一个非数字的字符截止(包括小数点),将这个时候得到的数字字符串转换为数字
    4.以'0x'开头的字符串会做特殊处理表示将后续的数字转换为16进制的整数

  • 到这里可能有人问,代码上传入的是数字类型0.0000008,为什么要分析如何转换字符串类型的参数。那是因为调用parseInt方法时,会隐式地将传入的数字类型用toString方法转换为字符串!而将0.0000008调用toString的结果会是"8e-7",在javascript中,小于0.000001的浮点数会以科学计数法来表示,而这样的字符串参照上面的规则,自然得到的结果就是8了。

结语

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容