jQuery 的 each() 方法可以遍历数组、类数组以及普通对象,它的回调函数接收两个参数:索引(或键名)和值。和大多数遍历方法不同,回调函数的返回值在这里承担了控制循环走向的职责。如果回调函数返回 false,jQuery 会立即终止整个遍历;如果返回 true,则当前这次回调会提前结束,但 jQuery 会继续处理后续元素。这个特性为开发者提供了类似 break 和 continue 的控制能力,也让 jQuery.each() 在处理复杂条件遍历时比原生 forEach 更灵活。下面结合源码和示例详细说明。

一、jQuery.each() 的回调返回值机制
要理解 return false 和 return true 为什么能控制循环,需要先看 jQuery.each 的内部实现。jQuery 并不会调用原生 Array.prototype.forEach,而是自己维护一个 for 循环(或 for...in 循环)来遍历目标对象。在每一轮循环中,它通过 callback.call() 执行开发者传入的回调函数,然后使用严格相等运算符 === 判断返回值是否等于 false。如果条件成立,就执行 break 跳出当前循环;如果不成立,则继续执行下一轮。这里的关键在于:只有 false 是特殊值,其他返回值包括 true、undefined、数字、字符串等都不会触发中断。
因此,return false 和 return true 在源码层面并不是两个对称的特殊指令。false 会命中 break 分支,而 true 只是普通返回值的其中一种,只是因为 return 提前结束了当前回调的执行,让人产生跳过当前项的感觉。理解这一点可以帮助你避免一个常见误区:以为 return true 是官方定义的跳过指令,而 return 其他非 false 值可能会中断循环。实际上,只有严格等于 false 的值才会中断。
// jQuery.each 核心逻辑简化版
each: function(obj, callback) {
var length, i = 0;
if (isArrayLike(obj)) {
length = obj.length;
for (; i < length; i++) {
if (callback.call(obj[i], i, obj[i]) === false) {
break;
}
}
} else {
for (i in obj) {
if (callback.call(obj[i], i, obj[i]) === false) {
break;
}
}
}
return obj;
}
二、return false:像 break 一样立即终止循环
在 jQuery.each 回调中写入 return false 可以实现提前退出遍历。当某个条件满足时,你不希望继续处理剩余元素,返回 false 会让 jQuery 停止整个循环,后续索引对应的回调不会再执行。这在处理大型数组、查找特定元素或避免无效计算时非常有用。例如下面这个数组查找场景,找到目标元素后直接退出:
var numbers = [4, 8, 15, 16, 23, 42];
var target = 16;
var foundIndex = -1;
$.each(numbers, function(index, value) {
console.log('检查索引:' + index);
if (value === target) {
foundIndex = index;
return false; // 找到目标后终止循环
}
});
console.log('找到目标,索引为:' + foundIndex);
// 控制台输出:
// 检查索引:0
// 检查索引:1
// 检查索引:2
// 检查索引:3
// 找到目标,索引为:3
从输出结果可以看到,索引 4 和 5 并没有被遍历。如果把 return false 改成 return true 或直接不写 return,循环会继续执行到数组末尾。这正是 return false 的核心价值:它提供了一个明确的中断信号。需要注意的是,jQuery 对返回值的判断使用的是 === false,所以必须写 return false,不能写成 return "false" 这种字符串,否则不会触发中断。
除了数组,jQuery.each 遍历对象属性时同样适用。比如在遍历一个配置对象时,一旦发现某个关键属性就停止后续属性的处理。由于对象属性的遍历顺序不一定与定义顺序一致,使用 return false 中断时要考虑遍历顺序可能带来的影响。但总体而言,return false 是实现条件中断最直接、最可读的方式。
三、return true:跳过本次循环的真相
官方文档将 return true 描述为跳过当前迭代并继续下一次循环,这容易让人误以为 jQuery 内部对 true 做了特殊处理。实际上从源码可以看出,只有 false 被单独判断,true 并不会触发任何特殊分支。return true 之所以能产生 continue 的效果,是因为 return 语句本身会立即结束当前回调函数的执行,而 jQuery 在回调返回后看到返回值不是 false,就会自然进入下一轮循环。对于那些写在 return true 之后的代码来说,它们不会被执行,这正好实现了跳过当前项后续逻辑的目的。
换句话说,return true 和 return undefined、return 1、return null 在循环控制上的效果完全一样,都不会中断循环。只是 return true 在语义上更明确,表示当前项处理完毕,继续处理下一项。如果你在某个条件分支中希望跳过当前元素,写 return true 可以让代码意图更清晰。来看一个过滤式遍历的例子:
var fruits = ['apple', 'banana', 'cherry', 'date'];
$.each(fruits, function(index, fruit) {
if (fruit === 'banana') {
return true; // 跳过 banana,继续处理后面的元素
}
console.log('当前水果:' + fruit);
});
// 控制台输出:
// 当前水果:apple
// 当前水果:cherry
// 当前水果:date
在这个例子里,banana 满足条件后直接 return true,console.log 那一行不会执行,但循环并没有停止,后面的 cherry 和 date 仍然被遍历到。如果把 return true 误写成 return false,整个循环会在 banana 处终止,后续元素都不会再处理。因此,区分两者非常关键:想要跳过当前项继续遍历用 return true,想要完全终止循环用 return false。
另外值得注意的是,如果你只是不想执行当前项后面的代码,也可以直接使用 return; 达到类似效果,但 return; 返回的是 undefined,从语义上不如 return true 明确。尤其是在团队协作中,return true 能清楚传达继续遍历的意图。
四、与原生 forEach 的差异及实践建议
JavaScript 原生的 Array.prototype.forEach 同样用于遍历数组,但它的回调函数返回值不会影响遍历流程。即使在 forEach 回调中写 return false,循环仍会继续,因为 forEach 的设计不提供提前终止的机制。这一点是 jQuery.each 与原生 forEach 最显著的区别。下面这段代码可以清楚看到差别:
var items = ['a', 'b', 'c', 'd'];
items.forEach(function(value) {
console.log(value);
if (value === 'b') {
return false; // 对 forEach 无效
}
});
// 输出:
// a
// b
// c
// d
如果想在原生环境中实现类似 jQuery.each 的中断能力,可以使用 some() 或 every()
jQuery.each循环中断跳过本次循环修改时间:2026-08-24 01:12:18