JS循环排序实现中数组解构交换报TypeError,求原因解析
问题分析与解决
你的循环排序实现出现错误的核心原因是:解构赋值时,左侧第二个元素的索引依赖于nums[i],但nums[i]会在第一个赋值步骤中被修改,导致实际交换的不是预期的两个位置。
错误原因详解
当你执行[nums[i], nums[nums[i]]] = [nums[nums[i]], nums[i]]时:
- 首先计算右侧的两个值,对应第一次循环
i=0的场景,得到[nums[1], nums[0]] = [4, 1]。 - 左侧赋值按顺序执行:先将
nums[0]设为4,此时nums[i]的值从1变成了4。 - 接下来计算第二个赋值的索引
nums[nums[i]],此时nums[i]已经是4,实际会给nums[4]赋值为1——这完全偏离了循环排序中“交换nums[i]和nums[原始nums[i]]”的逻辑。
这种索引的意外变化会打乱排序流程,甚至在某些场景下导致访问超出数组范围的索引,触发TypeError。
修复后的代码
解决方法是先保存nums[i]的原始值(即当前元素应该去的目标索引),再执行交换,确保始终操作正确的两个位置:
const sort = (nums) => { for (let i = 0; i < nums.length; i++) { while (nums[i] !== i) { // 保存目标索引,避免解构时索引被修改 const targetIdx = nums[i]; // 交换当前元素和它应该在的位置的元素 [nums[i], nums[targetIdx]] = [nums[targetIdx], nums[i]]; // 也可以用传统临时变量写法,逻辑完全一致: // const temp = nums[i]; // nums[i] = nums[targetIdx]; // nums[targetIdx] = temp; } } return nums; };
验证结果
执行sort([1, 4, 3, 2, 5, 7, 6, 0])会返回正确的排序结果:[0, 1, 2, 3, 4, 5, 6, 7]。
内容的提问来源于stack exchange,提问作者nickhealy
相关产品推荐
相关产品推荐

