You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么JS中for in循环实现罗马数字转整数错误,普通for循环正常

for...in遍历字符串实现罗马数字转换结果异常的原因及解决方案

问题原因

结果异常的核心原因是 for...in遍历返回的索引是字符串类型,而非数字类型:

  • 当你执行i + 1操作时,实际触发的是字符串拼接,而非算术加法。比如i = "0"时,i + 1得到的结果是字符串"01",不是数字1。
  • 此时s["01"]取值为undefined,dic[undefined]也为undefined,1 < undefined的比较结果为false,所以逻辑不会走减法分支,反而给res加了1。
  • 到i = "1"时,i + 1得到"11",同样取值为undefined,逻辑给res加了5,最终结果就是1+5=6,和你遇到的错误表现完全一致。
  • 普通for循环中定义的i是数字类型,i + 1是算术加法,所以逻辑运行正常。

for...in的修复方案

只要在使用索引前把它转为数字类型即可正常运行,修改后的代码如下:

for (let i in s) {
  // 将字符串类型的索引转为数字类型
  const numI = Number(i)
  if (dic[s[numI]] < dic[s[numI + 1]]) {
    res -= dic[s[numI]];
  } else {
    res += dic[s[numI]];
  }
}

需要额外注意:for...in本身是为遍历对象可枚举属性设计的,遍历字符串、数组这类类数组结构时,可能会遍历到额外的自定义可枚举属性,实际开发场景更推荐用普通for循环、for...of或者数组forEach方法遍历序列类型。


内容的提问来源于stack exchange,提问作者Agente 156

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:18:00