JavaScript:for循环中arr.length--与arr.length-1的差异疑问
为什么
arr.length--和arr.length - 1在for循环中结果天差地别? 这俩完全不是一个东西,本质区别直接导致了你的代码输出异常:
1. arr.length - 1:只读计算,不碰原数组
这只是个取值计算——拿到当前数组的长度,做个减1的数学运算,全程不会修改数组本身的length属性。
拿你的例子来说,原数组numbers长度是5,numbers.length -1就是4,循环条件i <4意味着i会从0跑到3,每次比较numbers[i]和numbers[i+1]时,对应的数组元素都存在(索引0-4都是有效元素),所以能正常输出数值。
2. arr.length--:直接修改数组,截断元素
这是自减赋值运算——先返回当前数组的length值用于条件判断,然后立刻把数组的length属性减1,相当于直接截断了数组(数组长度变短,后面的元素会被“砍掉”)。
你的代码改成这个条件后,执行流程变成了这样:
- 第一次判断:i=0,当前
length是5 → 满足0<5,判断结束后length变成4;进入循环,比较10和20,输出TRUE。 - 第二次判断:i=1,当前
length是4 → 满足1<4,判断结束后length变成3;进入循环,比较20和40,输出TRUE。 - 第三次判断:i=2,当前
length是3 → 满足2<3,判断结束后length变成2;进入循环时,数组已经被截断成只有前2个元素(索引0和1有效),numbers[2]和numbers[3]都是undefined,所以触发else分支输出了undefined。
总结
- 只是需要“长度减1”的数值?用
arr.length -1,它不会动原数组; arr.length--是在修改数组本身,会直接缩短数组长度,和前者功能完全无关。
内容的提问来源于stack exchange,提问作者Hezakai
相关产品推荐
相关产品推荐

