JavaScript 的 parseInt 函数在输入字符串以 0 开头时默认将进制设为 8,这让我感到烦恼,因为我经常忘记传递可选的第二个参数,即十进制基数。我希望有人能告诉我,为什么将进制默认设为 8 是有道理的。
JavaScript 的 parseInt 函数在输入字符串以 0 开头时默认将进制设为 8,这让我感到烦恼,因为我经常忘记传递可选的第二个参数,即十进制基数。我希望有人能告诉我,为什么将进制默认设为 8 是有道理的。
只有当输入字符串以0开头时,它才会默认为8。这是从C和C++残留下来的不幸遗产。
您可以使用Number('0123')
,或者像您在问题中提到的那样使用parseInt('0123', 10)
。
你能告诉我更多关于这个遗留问题吗?
parseInt("070"); //56
parseInt("70"); //70
parseInt("070", 10); //70
parseInt("78"); //78
parseInt("078"); //7, because it stops before 8
1 * "070"; //70
我个人更喜欢这种方法,并认为它比调用函数更快。
现在,几年后,parseInt()
似乎可以正常处理以0
开头的数字。当前浏览器:
parseInt("019"); // 19 on Firefox 67
parseInt("019"); // 19 on Chrome 75
parseInt("019"); // 19 on Safari 12
parseInt("019"); // 19 on IE 11
parseInt("019"); // 19 on Edge 42
但是,这个“修复”必然会破坏依赖parseInt("019")
返回1
或0
而不是19
的旧脚本...
Number.parseInt
也适用吗? - sandstrom015
似乎现在也作为十进制工作。我相信这是一个比较近期的变化,因为一两年前我仍然受到它的影响(或者可能是node.js?现在在v12.20+上也可以正常工作)。 - fireattack
+
操作符比使用Number
更好。一元的+
操作符忽略八进制格式(但仍然支持十六进制格式),并且比函数调用更快。 - Reid+
是否更快(而且对于所有浏览器来说几乎肯定不是相同的)。让我们看看:http://jsperf.com/string-to-int-2 - Matt Ball