JavaScript中return语句里的后置++为何先返回值再自增?
关于cycleIterator函数中索引使用的疑问解答
先看你的代码:
function cycleIterator(arr) { let indexCounter = 0; return function() { if (indexCounter >= arr.length) indexCounter = 0; return arr[indexCounter ++]; //WHY IS THIS [0, 1, 2] NOT [1, 2, 3] } } // Uncomment these to check your work! const threeDayWeekend = ['Fri', 'Sat', 'Sun']; const getDay = cycleIterator(threeDayWeekend); console.log(getDay()); // should log: 'Fri' console.log(getDay()); // should log: 'Sat' console.log(getDay()); // should log: 'Sun' console.log(getDay()); // should log: 'Fri'
核心原因是后置自增运算符++的执行逻辑:它会先返回变量当前的数值,再把变量的值加1。结合代码执行流程拆解来看:
- 初始状态:
indexCounter被初始化为0。 - 第一次调用
getDay():- 判断
indexCounter(值为0)是否大于等于数组长度3?不满足,不执行重置。 - 执行
arr[indexCounter++]:先取indexCounter当前的0作为索引,返回arr[0]也就是'Fri',之后indexCounter才会变成1。
- 判断
- 第二次调用
getDay():indexCounter的值是1,小于3,不重置。- 取
indexCounter当前的1作为索引,返回arr[1]即'Sat',之后indexCounter变成2。
- 第三次调用
getDay():indexCounter的值是2,小于3,不重置。- 取
indexCounter当前的2作为索引,返回arr[2]即'Sun',之后indexCounter变成3。
- 第四次调用
getDay():indexCounter的值是3,等于数组长度3,触发重置,把indexCounter设为0。- 取
indexCounter当前的0作为索引,返回arr[0]即'Fri',之后indexCounter变成1。
另外要注意,数组索引从0开始,arr[3]已经超出threeDayWeekend的范围,会返回undefined,完全不符合循环取元素的需求,所以用0、1、2的索引才是正确的。
内容的提问来源于stack exchange,提问作者Logan Nelsen
相关产品推荐
相关产品推荐

