JavaScript every()方法返回值与console.log输出不一致问题
问题解答:为什么every()返回false但console.log显示true?
核心问题分析
你的代码逻辑存在两个容易忽略的细节:
- 最后一个元素的比较失效:当
every()遍历到数组最后一位时,index + 1超出了数组的下标范围,arr[index + 1]会返回undefined。数字和undefined做大小比较时,undefined会被转换为NaN,任何数字与NaN的比较结果都是false。而every()的规则是只要有一个回调返回false,整体就返回false,所以最终returnRes是false。 - console.log的返回值误导判断:在
consoleLogRes的回调中,console.log(value > arr[index + 1])只是打印出比较结果,但console.log()本身的返回值是undefined(这才是every()实际判断的值)。你在控制台看到的true只是前两次比较的输出,实际上遍历到最后一个元素时,console.log()也会打印出false,只是你可能没留意到这一行。
修正方案
要正确判断“每个元素都大于其后一个元素”,需要限制遍历范围,只比较到倒数第二个元素:
const arr = [3, 2, 1]; const returnRes = arr.every((value, index, arr) => { // 最后一个元素没有后续元素,直接返回true if (index === arr.length - 1) return true; return value > arr[index + 1]; }); console.log(returnRes); // 输出 true
或者更简洁的写法:
const arr = [3, 2, 1]; const returnRes = arr.every((value, index, arr) => index === arr.length - 1 || value > arr[index + 1] ); console.log(returnRes); // 输出 true
内容的提问来源于stack exchange,提问作者JpCano
相关产品推荐
相关产品推荐

