我认为这与八进制解析有关,因为它只在8或9上发生。也有人认为这是Chrome的错误,但Firefox中也可以复制。
这是故意的行为吗?如果是,为什么?
我认为这与八进制解析有关,因为它只在8或9上发生。也有人认为这是Chrome的错误,但Firefox中也可以复制。
这是故意的行为吗?如果是,为什么?
这里的解决方案很简单。永远不要在调用parseInt()
时没有指定期望的进制。当你不传递第二个参数时,parseInt()
会试图根据数字格式猜测进制。但是它经常猜错。
像这样指定进制,你将得到预期的结果:
parseInt("08", 10) == 8;
关于猜测规则,您可以参考MDN 对 parseInt()
的文档页面。parseInt()
会猜测"08"
是八进制,但然后它遇到了一个在八进制中不被允许的数字,所以返回0
。parseInt()
时,它无事可做,因为该值已经是一个数字,所以它不会尝试更改它。"这是故意的行为吗?"
是的。
"如果是,为什么?"
在规范中,前导的0是表示八进制数字的符号。在八进制计数中,不存在符号8和9,因此parseInt使用它发现的第一个有效数字,即0。
如果您要...
parseInt('123@xq$_.f(--_!2*')
......结果将是......
123
因为在字符串开头发现了一个有效的数字,所以该字符串后面的任何无效内容都将被忽略。
parseInt("080".replace(/^[0]+/g,""));
parseInt('08', 10)
。如果 '08'
存储在一个变量中,该变量可以是字符串或整数,并且您希望每个变量按预期工作,则应将其传递给具有正确基数的 parseInt
。此外,这更易读。 - Marshall