parseInt(123123123123123123123123); //return 1
parseInt(123123123123123123123123123); //return 1
parseInt(123123123123123123123123123123);//return 1

用铬测试!
答案 0 :(得分:6)
对parseInt()
文档的一点创意阅读为此提供了答案。以下是发生的事情:
parseInt
期望它的第一个参数是一个字符串。如果不是,则将其转换为字符串。这实际上很有趣,因为它似乎通过...将它包装在引号中并将其传递给.toString()
,这在这种情况下或多或少与parseInt()
相反。在您的示例中,parseInt(123123123123123123123123);
变为parseInt("1.2312312312312312e+29")
。
然后它将转换为字符串值并将其传递给parseInt()
。正如文档告诉我们的那样,如果它遇到一个非数字字符,它就会中止并继续它到目前为止所做的...并且它会截断为一个整数。所以它采取" 1.2312312312312312e + 29",达到+,中止,解析" 1.2312312312312312"相反,并提出1。
意想不到的后果!
你只会看到这个问题的内容足够大,当转换为字符串时,它们会以指数表示法呈现。根本问题在于,即使您认为parseInt()
和Number.toString()
会互相反映......他们也不会,因为int值通过toString()
可以生成parseInt()
无法理解的字符串。
答案 1 :(得分:2)
首先,始终指定基数(第二个参数)以避免猜测。
其次,parseInt
需要一个字符串,因此请在数字周围添加引号。
parseInt("123123123123123123123123123123", 10)
1.2312312312312312e+29
Mozilla开发人员参考有good documentation of this function和示例。关于基数,他们说:
始终指定此参数以消除读者混淆并保证可预测的行为。当未指定基数时,不同的实现会产生不同的结果。