理解Javascript中的隐式转换

理解Javascript中的隐式转换,javascript,Javascript,我找到了一个令人烦恼的JavaScript错误,在这里我传递了一个参数,但当它被接收时,它是完全不同的。我修复了它,但想知道发生了什么,以供将来参考 我应该作为参数传递的是'0616'(带引号)。我实际通过的是0616(没有引号) 因此,当它被接收时,某种隐式数字转换发生了,它被接收为398。我理解隐式和显式转换,但将0616转换为398是怎么回事。前导零似乎与此有关,因为我传递的其他值在最重要的数字中是非零的,它们存活得很好。只有那些以零开头的 但是398和0616之间有什么关系呢 有什么想法

我找到了一个令人烦恼的JavaScript错误,在这里我传递了一个参数,但当它被接收时,它是完全不同的。我修复了它,但想知道发生了什么,以供将来参考

我应该作为参数传递的是'0616'(带引号)。我实际通过的是0616(没有引号)

因此,当它被接收时,某种隐式数字转换发生了,它被接收为398。我理解隐式和显式转换,但将0616转换为398是怎么回事。前导零似乎与此有关,因为我传递的其他值在最重要的数字中是非零的,它们存活得很好。只有那些以零开头的

但是398和0616之间有什么关系呢


有什么想法吗?

原因是前导零是基数八进制的javascript符号,例如010=8。十六进制的表示法是一个前导0x,例如0x10=16

啊,javascript的神奇世界

任何以0开头的数字文字都被视为八进制数

这是一个老套的解决办法

parseInt('0616', 10)

0616
是旧的八进制数字格式。在新规范中,它应该是
0o616
,但是浏览器仍然支持旧格式

见此:

已将前缀0o引入到。。。。ECMAScript 6打算支持它(ECMAScript 3中不建议使用前缀0,ECMAScript 5中删除了前缀0)


很抱歉我之前的评论,但我认为
parseInt('0616',10)
会更安全,以防他仍然必须支持一些旧浏览器,这些浏览器对八进制有解释。