You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么JavaScript中条件为false时do-while循环仍会无限运行?

问题原因

  • 核心问题是代码执行顺序逻辑错误:for循环执行到最后一轮(以你示例的5个元素为例,对应i=4)时,执行流程如下:
    1. 先执行arr2.push(arr1[index]),此时arr2长度和arr1完全一致,arr1的所有值都已经被存入arr2
    2. 接下来进入do-while循环,尝试随机找一个不存在于arr2的arr1[index],但此时arr1已经没有任何值不在arr2中,判断条件arr2.includes(arr1[index])永远为true,循环永远无法退出,直接陷入死循环。
  • 你看到的控制台输出false是前几轮循环的输出,最后一轮循环找不到符合条件的index时不会再输出false,只会持续生成新的随机数、一直判断为true,看起来就像输出false之后仍陷入卡死状态。

修复方案

调整执行顺序,把push操作放到do-while找到有效index之后即可:

const arr1 = [1, 2, 3, 4, 5];
const arr2 = [];

for(let i = 0; i < arr1.length; i++) {
    let index;
    do {
        index = Math.floor(Math.random() * arr1.length);
        console.log(arr2.includes(arr1[index]));
    } while (arr2.includes(arr1[index]))
    // 找到未存入的元素后再执行push
    arr2.push(arr1[index]);
}

console.log('arr2: ', arr2);

更推荐的乱序实现:Fisher-Yates 洗牌算法

你当前的实现每次调用includes都是O(n)复杂度,整体时间复杂度为O(n²),推荐使用时间复杂度仅为O(n)的Fisher-Yates洗牌算法,性能更高、乱序更均匀:

function shuffle(arr) {
  // 浅拷贝避免修改原数组
  const newArr = [...arr];
  for (let i = newArr.length - 1; i > 0; i--) {
    const randomIndex = Math.floor(Math.random() * (i + 1));
    // 交换当前元素和随机位置元素
    [newArr[i], newArr[randomIndex]] = [newArr[randomIndex], newArr[i]];
  }
  return newArr;
}

const arr1 = [1,2,3,4,5];
const arr2 = shuffle(arr1);
console.log(arr2);

内容的提问来源于stack exchange,提问作者Mai Linh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:24:02