为什么JavaScript中条件为false时do-while循环仍会无限运行?
问题原因
- 核心问题是代码执行顺序逻辑错误:for循环执行到最后一轮(以你示例的5个元素为例,对应
i=4)时,执行流程如下:- 先执行
arr2.push(arr1[index]),此时arr2长度和arr1完全一致,arr1的所有值都已经被存入arr2 - 接下来进入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
相关产品推荐
相关产品推荐

