循环体 | 执行 | 跳出机制 | 使用场景 |
for (初始化表达式; 条件表达式; 更新表达式) { // 循环体 } | - 初始化:仅执行一次,通常用于定义循环变量(如
let i = 0 )。 - 条件判断:每次循环前检查条件,若为
true 则执行循环体,否则跳出循环。 - 执行循环体:执行具体逻辑。
- 更新变量:每次循环结束后执行(如
i++ ),然后再次判断条件。 | - 正常结束:条件表达式返回
false 时跳出。 - 强制跳出:使用
break 直接终止循环。 - 跳过本次循环:使用
continue 跳过当前迭代,继续下一次循环。 | - 已知循环次数(如遍历数组索引、固定次数的操作)。
- 需要精确控制循环变量的更新逻辑。
|
for (const item of 可迭代对象) { // 循环体,item 为当前元素 } | 按顺序遍历可迭代对象的每个元素,直到所有元素处理完毕。 | - 正常结束:遍历完所有元素后跳出。
- 强制跳出:使用
break 终止循环。 - 跳过本次循环:使用
continue 跳过当前元素,继续下一次迭代。 | - 遍历数组、字符串、Map/Set 等可迭代对象的元素值(而非索引)。
- 需要简洁地处理每个元素,避免手动维护索引。
|
while (条件表达式) { // 循环体 } | - 先判断条件表达式,若为
true 则执行循环体;若为 false 则直接跳出。 - 执行循环体后,再次判断条件,重复上述过程。
| - 正常结束:条件表达式返回
false 时跳出。 - 强制跳出:使用
break 终止循环(即使条件仍为 true )。 - 注意死循环风险:若条件永远为
true 且未使用 break ,会导致死循环,需手动终止(如浏览器中按 Ctrl + C )。 | 未知循环次数,需根据条件动态判断是否继续(如读取文件直到结束、用户未取消操作等) |
do { // 循环体 } while (条件表达式); | - 先执行一次循环体,再判断条件表达式。
- 若条件为
true ,继续执行循环体;否则跳出 | - 正常结束:条件表达式返回
false 时,在下次循环前跳出 - 强制跳出:使用
break 提前终止循环。 | - 需要至少执行一次循环体的场景(如用户登录验证,先显示界面再判断是否继续)。
|
for (const key in 对象) { // 循环体,key 为对象的属性名 } | 遍历对象的可枚举属性(包括自身属性和继承自原型链的属性)。 | - 正常结束:遍历完所有可枚举属性后跳出。
- 强制跳出:使用
break 或 continue ,规则与其他循环一致。 | - 不推荐用于数组遍历:会遍历原型链属性(如
Array.prototype 方法),且属性顺序可能不一致。 - 过滤自身属性:建议配合
hasOwnProperty 判断是否为对象自身属性。 |