为何JavaScript中03000被解析为1536?代码异常咨询
为什么带前导零的数字03000会被识别为1536?
你遇到的问题核心是带前导零的数字字面量在旧版JavaScript规范里的解析规则:
问题复现代码
// peak element let arr = [1, 02, 03000, 4, 5, 6, 7, 8, 900, 100]; function peakElement(arr) { let maxElement = arr[0]; for (let index = 0; index < arr.length; index++) { if (arr[index] > maxElement) maxElement = arr[index]; } return maxElement; } console.log(peakElement(arr)); // 输出1536,而非预期3000
原因解析
- 在ECMAScript 5及更早的非严格模式下,带前导零的数字会被JavaScript当作八进制数(基数为8)解析。
- 八进制的
03000转换为十进制的计算过程是:3×8³ + 0×8² + 0×8¹ + 0×8⁰ = 3×512 = 1536,这就是你得到该结果的原因。 - 同理,
02作为八进制数转换为十进制还是2,所以不会影响数组里的其他元素比较。 - 虽然ES6开始在严格模式下禁止了这种八进制写法(会直接报错),但Chrome控制台、VSCode的非严格模式环境仍然兼容旧规则,所以你能复现这个问题。
解决办法
- 直接写十进制数字,去掉前导零:把
03000改成3000即可得到预期结果。 - 如果是处理字符串形式的带前导零数字,用
parseInt('03000', 10)显式指定十进制解析,避免自动转八进制。
内容的提问来源于stack exchange,提问作者Arpit Chugh
相关产品推荐
相关产品推荐

