parseInt(123123123123123123123123); //return 1
parseInt(123123123123123123123123123); //return 1
parseInt(123123123123123123123123123123);//return 1
在Chrome中进行测试!
parseInt(123123123123123123123123); //return 1
parseInt(123123123123123123123123123); //return 1
parseInt(123123123123123123123123123123);//return 1
在Chrome中进行测试!
对于这个问题,仔细阅读 parseInt()
的文档可以提供一个答案。以下是发生的情况:
parseInt
期望它的第一个参数是一个字符串。如果不是,它会将其转换为字符串。实际上,这很有趣,因为它似乎是通过...在引号中包装它并通过 .toString()
传递它来进行转换的,而在这种情况下,这与 parseInt()
函数形成了更多或更少的相反作用。在你的例子中,parseInt(123123123123123123123123);
变成了 parseInt("1.2312312312312312e+29")
。
然后它将转换为字符串的值传递给 parseInt()
。正如文档所告诉我们的那样,如果它遇到一个非数字字符,它就会中止并使用它目前所拥有的内容... 并截断为整数。因此,它正在获取 "1.2312312312312312e+29",达到 +,中止,解析 "1.2312312312312312",并得出 1。
意外后果!
只有当整数转换为字符串时呈指数形式时,才会出现此问题。根本问题在于,尽管您认为 parseInt()
和 Number.toString()
会相互映射...但它们并不完全相同,因为通过 toString()
传递的 int 值可能会生成 parseInt()
不理解的字符串。
首先,为了避免猜测,始终要指定基数(第二个参数)。
其次,parseInt
接受字符串作为输入,因此在你的数字周围添加引号。
parseInt("123123123123123123123123123123", 10)
1.2312312312312312e+29
始终指定此参数以消除读者的困惑并保证可预测的行为。当未指定基数时,不同的实现会产生不同的结果。