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

两种JS for循环输出差异:为何一个是数字一个是字符串?

问题:两种for循环中i+1输出差异的原因?

我正在学习在线JavaScript课程,目前接触到两种for循环:for (let i = 0; i < students.length; i++) 和 for (let i in students)。运行下方代码后,第一种循环输出1-8的学员编号,第二种却输出01、11、21这类形式,移除+1后两者输出一致,请问这是为什么?

"use strict"

const students= ["Melanie","Leni","Matilda","Niels","Anke","Juergen","Lilli","Hans"]

console.log("=========================================")
console.log("Variante 1\n")

for (let i = 0; i < students.length; i++) {
  console.log(`Teilnehmer ${i+1} Name lautet: ${students[i]}`)
}

console.log("\n=========================================")
console.log("Variante 2\n")
for (let i in students) {
      console.log(`Teilnehmer ${i+1} Name lautet: ${students[i]}`)
}

我原本预期两段代码输出一致,移除+1后输出才相同。


解答

核心原因是两种循环中变量i的数据类型完全不同:

  • 普通for循环里的i是数字类型:i从0开始以数字形式递增,i+1执行的是数字加法运算,所以0+1=1、1+1=2……最终输出1到8的正常编号。
  • for...in循环里的i是字符串类型:数组的索引在for...in中会被当作字符串返回(比如"0"、"1"、"2"……),此时i+1会触发字符串拼接逻辑,把字符串和数字1连在一起,就出现了"0"+1="01"、"1"+1="11"这类输出。

当你移除+1时,普通for循环输出的数字0-7会在模板字符串中自动转为字符串,和for...in输出的"0"-"7"看起来完全一致,所以两者输出相同。

额外提醒:for...in并不适合遍历数组,它会遍历数组所有可枚举属性(包括原型链上的非索引属性),如果数组额外添加了自定义属性,也会被遍历到。遍历数组更推荐使用普通for循环、for...of或者数组的forEach方法。


内容的提问来源于stack exchange,提问作者Niels von Daake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:05:39