如何利用数组解构赋值实现不使用中间变量交换数组特定索引值?
- 内容介绍
- 相关推荐
本文共计616个文字,预计阅读时间需要3分钟。
直接交换数组中两个元素的值,可以使用以下方法:
必须先确保索引有效
解构赋值本身不会校验索引是否越界。若 i 或 j 超出 [0, arr.length) 范围,右侧会取到 undefined,导致交换后出现 undefined 值,但不报错——这容易埋下隐患。
- 推荐检查方式:
i in arr && j in arr(兼容稀疏数组)或i >= 0 && i < arr.length && j >= 0 && j < arr.length - 错误示例:
let arr = [1,2]; [arr[0], arr[5]] = [arr[5], arr[0]];→ 结果变成[undefined, 2]
右侧必须是可迭代值
等号右边必须能生成一个数组(或类数组),不能是 null 或 undefined,否则抛 TypeError: undefined is not iterable。
- 正常情况:
arr[j]和arr[i]只要能求值(哪怕为undefined),组合成的[arr[j], arr[i]]就是合法数组 - 风险点:如果
arr本身是null或undefined,还没到解构就已报错
变量声明与 const 兼容性
数组元素是“可写位置”,和变量声明无关。即使数组本身用 const 声明,只要索引对应的位置可修改,解构赋值就合法。
-
const arr = [10, 20]; [arr[0], arr[1]] = [arr[1], arr[0]];✅ 正常运行,arr变为[20, 10] - 但若想交换两个独立变量(如
let a = 1; const b = 2;),b是const声明的,仍可参与解构赋值——因为解构是给绑定目标赋值,不是对b做重新声明
比临时变量和数学技巧更可靠
不用 temp,也不用加减或异或,解构天然支持任意类型:
- 数字、字符串、对象、
null、undefined、布尔值全部适用 - 无溢出风险(不像
a = a + b)、无类型限制(不像a ^= b仅整数) - V8 等引擎已深度优化,性能与临时变量法基本一致
本文共计616个文字,预计阅读时间需要3分钟。
直接交换数组中两个元素的值,可以使用以下方法:
必须先确保索引有效
解构赋值本身不会校验索引是否越界。若 i 或 j 超出 [0, arr.length) 范围,右侧会取到 undefined,导致交换后出现 undefined 值,但不报错——这容易埋下隐患。
- 推荐检查方式:
i in arr && j in arr(兼容稀疏数组)或i >= 0 && i < arr.length && j >= 0 && j < arr.length - 错误示例:
let arr = [1,2]; [arr[0], arr[5]] = [arr[5], arr[0]];→ 结果变成[undefined, 2]
右侧必须是可迭代值
等号右边必须能生成一个数组(或类数组),不能是 null 或 undefined,否则抛 TypeError: undefined is not iterable。
- 正常情况:
arr[j]和arr[i]只要能求值(哪怕为undefined),组合成的[arr[j], arr[i]]就是合法数组 - 风险点:如果
arr本身是null或undefined,还没到解构就已报错
变量声明与 const 兼容性
数组元素是“可写位置”,和变量声明无关。即使数组本身用 const 声明,只要索引对应的位置可修改,解构赋值就合法。
-
const arr = [10, 20]; [arr[0], arr[1]] = [arr[1], arr[0]];✅ 正常运行,arr变为[20, 10] - 但若想交换两个独立变量(如
let a = 1; const b = 2;),b是const声明的,仍可参与解构赋值——因为解构是给绑定目标赋值,不是对b做重新声明
比临时变量和数学技巧更可靠
不用 temp,也不用加减或异或,解构天然支持任意类型:
- 数字、字符串、对象、
null、undefined、布尔值全部适用 - 无溢出风险(不像
a = a + b)、无类型限制(不像a ^= b仅整数) - V8 等引擎已深度优化,性能与临时变量法基本一致

