为什么 "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,彻底绕过了这个问题。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
宜搭 numberField 组件存在八进制解析 Bug。
现象:输入 "01"~"07" 正常,但 "08"、"09" 被清空或报错。
原因:底层可能沿用了旧版 JS 逻辑(如 parseInt 未指定基数时,以 0 开头的字符串会被误判为八进制)。八进制仅含 0-7,故 8 和 9 非法导致解析失败。
解决:在数据提交或校验环节,强制使用 parseInt(str, 10) 明确按十进制解析,即可修复。建议官方尽快更新组件逻辑,统一采用显式基数解析以避免此类历史遗留问题。
官方详细解决方案:https://www.aliyun.com/product/applicationservice/yida