解构赋值交换数组元素需先校验索引有效性:i和j必须满足0≤i,j

直接用 [arr[i], arr[j]] = [arr[j], arr[i]] 就行,前提是 i 和 j 是合法索引,且数组已存在。
必须先校验索引有效性
解构赋值本身不检查数组边界。如果 i 或 j 超出 [0, arr.length) 范围,arr[i] 会是 undefined,导致右侧变成 [undefined, undefined],进而触发 TypeError: undefined is not iterable。
- 检查条件应为:
i >= 0 && i = 0 && j - 若索引非法,建议提前
return、抛错或静默忽略,避免后续执行失败
不能用于未声明或未初始化的变量
这条规则同样适用于数组元素交换——它操作的是已有数组的已有位置。如果 arr 是 undefined 或 null,或者 arr[i] 本身未定义(如稀疏数组),右侧表达式就会失效。
- 确保
arr是真实数组(可用Array.isArray(arr)判断) - 稀疏数组中,访问空槽位返回
undefined,也会导致解构失败
一行写法背后的实际过程
看似简单的等号两边,其实有明确执行顺序:
- 右侧
[arr[j], arr[i]]先整体求值:取出当前arr[j]和arr[i]的值,构成一个新数组 - 左侧
[arr[i], arr[j]]是解构目标:按顺序把新数组第 0 项赋给arr[i],第 1 项赋给arr[j] - 整个过程不依赖中间变量,也不受赋值顺序干扰
封装成可复用函数的建议
实际项目中推荐封装,并兼顾安全与语义清晰:
- 修改原数组版本(最常用):
function swapAt(arr, i, j) { if (i = arr.length || j = arr.length) return; [arr[i], arr[j]] = [arr[j], arr[i]]; } - 返回新数组版本(不可变需求):
function swappedAt(arr, i, j) { const newArr = [...arr]; if (i = arr.length || j = arr.length) return newArr; [newArr[i], newArr[j]] = [newArr[j], newArr[i]]; return newArr; }










