JavaScript中console.log打印带前导0的数字数组时数值为何变化?
问题根因
JavaScript 存在历史遗留的数字字面量解析规则:非严格模式下,以0开头、后续字符均为0~7范围数字的字面量,会被自动按照八进制(基数为8)解析,而非十进制。
你遇到的数值转换完全符合这个规则,手动计算即可验证:
- 八进制
02000转十进制:2 * 8^3 + 0*8^2 + 0*8^1 + 0*8^0 = 2*512 = 1024,和你单独打印02000得到的结果一致 - 八进制
02200转十进制:2*512 + 2*64 = 1152 - 八进制
02020转十进制:2*512 + 2*8 = 1040 - 八进制
02002转十进制:2*512 + 2 = 1026
所有转换结果和你控制台输出的数组元素完全匹配。
修复方案
- 写十进制数字时不要加无意义的前导0,要表示数值2000直接写
2000即可 - 如果业务上需要保留前导0做固定位数展示(比如编号、邮编类场景),不要用数字类型存储这类值,改用字符串类型,例如
"02000" - 推荐在脚本开头添加
'use strict'开启严格模式,严格模式下隐式八进制写法会直接抛出语法错误,能提前在开发阶段发现这类问题 - 如果确实需要定义八进制数值,使用ES6标准的
0o前缀写法,例如八进制数2000写为0o2000,语义明确不会产生歧义。
内容的提问来源于stack exchange,提问作者nagnag
相关产品推荐
相关产品推荐

