开发者社区 问答 正文

BUG反馈找不到哪里提,就放这里吧:“08”、“09”这样非法八进制数进数字组件后会解析错误的bug

为什么 "07" 正常但 "08" 不正常?
这跟 JavaScript 八进制解析的历史遗留行为有关:

在 JavaScript 的早期规范(ES3/ES5 non-strict mode)中,以 0 开头的数字字面量会被当作八进制数:

字符串 八进制解读 结果
"01" ~ "07" 合法的八进制数(0-7都在八进制范围内) 正常解析为 1~7 ✅
"08" 非法八进制(8不在0-7范围内) 解析失败 ❌
"09" 非法八进制(9不在0-7范围内) 解析失败 ❌
"10" 不以0开头,按十进制 正常解析为 10 ✅
虽然现代 JS 引擎(ES5 strict / ES6+)中 Number("08") 已经能正确返回 8,但宜搭的 numberField 组件内部可能使用了旧版解析逻辑或自定义校验,仍然保留了这种行为:

"01" ~ "07" → 恰好是合法八进制,解析成功,显示正常
"08", "09" → 非法八进制,解析失败,值被清空
"10" 及以上 → 不以单个 0 开头,按十进制解析,正常
这就是为什么偏偏只有8和9出问题,而不是所有带前导零的学号都出问题。 这个规律完美匹配你观察到的现象。

加了 parseInt(str, 10) 后,第二个参数 10 强制按十进制解析,"08" → 8、"09" → 9,彻底绕过了这个问题。

展开
收起
代码小白白 2026-10-13 14:46:04 81 分享 版权
来自: 钉钉宜搭
1 条回答
写回答
取消 提交回答
  • 宜搭 numberField 组件存在八进制解析 Bug。

    现象:输入 "01"~"07" 正常,但 "08"、"09" 被清空或报错。

    原因:底层可能沿用了旧版 JS 逻辑(如 parseInt 未指定基数时,以 0 开头的字符串会被误判为八进制)。八进制仅含 0-7,故 8 和 9 非法导致解析失败。

    解决:在数据提交或校验环节,强制使用 parseInt(str, 10) 明确按十进制解析,即可修复。建议官方尽快更新组件逻辑,统一采用显式基数解析以避免此类历史遗留问题。

    官方详细解决方案:https://www.aliyun.com/product/applicationservice/yida

    2026-10-13 15:11:55
    赞同 51 展开评论
问答分类:
问答地址:
关联地址: