为什么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
相关产品推荐
相关产品推荐

