JavaScript中for循环内array.length + 1的含义是什么?
JavaScript for循环中
array.length + 1的逻辑与不同写法差异 首先明确JS for循环三个组成部分的独立作用,三个部分的修改互不影响:
- 初始化表达式:循环启动前仅执行一次,决定循环变量的起始值
- 条件判断表达式:每轮循环执行前校验,返回true才运行循环体,false直接终止循环,决定循环的终止边界
- 更新表达式:每轮循环体执行完成后运行,决定循环变量的变化步长
标准数组遍历写法逻辑
常规遍历写法是数组遍历的通用标准写法:
for(let i = 0; i < array.length; i++){ // 循环逻辑 }
JS数组下标从0开始计数,长度为n的数组,合法下标范围是0 ~ n-1。这个写法中循环变量i的取值刚好是0到array.length - 1,逐次对应数组每一个元素的下标,不会多跑也不会漏元素。
i < array.length + 1写法的实际效果
这个写法修改的是条件判断的终止边界,把判断阈值比标准写法抬高了1:
for(let i = 0; i < array.length + 1; i++){ // 循环逻辑 }
当i增长到和array.length相等时,标准写法里i < array.length判断为false,循环终止;但这个写法里array.length < array.length + 1判断为true,会额外多执行一轮循环。这一轮中i的值等于数组长度,已经超出数组合法下标范围,访问array[i]会得到undefined。
这种写法不属于常规数组遍历的通用写法,仅在需要额外执行一轮边界收尾逻辑、处理特殊偏移的类数组结构等小众场景下使用,普通遍历用这个写法会引发多余执行甚至下标越界报错。
两种写法效果不一致的核心原因
把初始值改成1的写法,修改的是循环变量的起始值,和修改终止边界是完全独立的两个操作,循环行为自然完全不同:
for(let i = 1; i < array.length; i++){ // 循环逻辑 }
拿长度为3的数组举例(即array.length = 3),三种写法的实际运行差异一目了然:
- 标准遍历写法:
i依次取0、1、2,共执行3轮,完整覆盖所有数组元素 - 带
+1的边界修改写法:i依次取0、1、2、3,共执行4轮,最后一轮下标越界 - 初始值改为1的写法:
i依次取1、2,共执行2轮,直接跳过了数组下标为0的第一个元素,也不会执行到下标为3的越界轮次
核心误区提醒:循环的起始值和终止边界是两个完全独立的控制参数,修改其中一个不会等价于修改另一个,二者对循环遍历范围、执行次数的影响互不干扰。
内容的提问来源于stack exchange,提问作者Sarah Jessica Galed
相关产品推荐
相关产品推荐

