如何利用数组解构赋值实现不使用中间变量交换数组特定索引值?

2026-05-07 18:521阅读0评论SEO基础
  • 内容介绍
  • 相关推荐

本文共计616个文字,预计阅读时间需要3分钟。

如何利用数组解构赋值实现不使用中间变量交换数组特定索引值?

直接交换数组中两个元素的值,可以使用以下方法:

必须先确保索引有效

解构赋值本身不会校验索引是否越界。若 ij 超出 [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]

右侧必须是可迭代值

等号右边必须能生成一个数组(或类数组),不能是 nullundefined,否则抛 TypeError: undefined is not iterable

  • 正常情况:arr[j]arr[i] 只要能求值(哪怕为 undefined),组合成的 [arr[j], arr[i]] 就是合法数组
  • 风险点:如果 arr 本身是 nullundefined,还没到解构就已报错

变量声明与 const 兼容性

数组元素是“可写位置”,和变量声明无关。即使数组本身用 const 声明,只要索引对应的位置可修改,解构赋值就合法。

  • const arr = [10, 20]; [arr[0], arr[1]] = [arr[1], arr[0]]; ✅ 正常运行,arr 变为 [20, 10]
  • 但若想交换两个独立变量(如 let a = 1; const b = 2;),bconst 声明的,仍可参与解构赋值——因为解构是给绑定目标赋值,不是对 b 做重新声明

比临时变量和数学技巧更可靠

不用 temp,也不用加减或异或,解构天然支持任意类型:

  • 数字、字符串、对象、nullundefined、布尔值全部适用
  • 无溢出风险(不像 a = a + b)、无类型限制(不像 a ^= b 仅整数)
  • V8 等引擎已深度优化,性能与临时变量法基本一致

本文共计616个文字,预计阅读时间需要3分钟。

如何利用数组解构赋值实现不使用中间变量交换数组特定索引值?

直接交换数组中两个元素的值,可以使用以下方法:

必须先确保索引有效

解构赋值本身不会校验索引是否越界。若 ij 超出 [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]

右侧必须是可迭代值

等号右边必须能生成一个数组(或类数组),不能是 nullundefined,否则抛 TypeError: undefined is not iterable

  • 正常情况:arr[j]arr[i] 只要能求值(哪怕为 undefined),组合成的 [arr[j], arr[i]] 就是合法数组
  • 风险点:如果 arr 本身是 nullundefined,还没到解构就已报错

变量声明与 const 兼容性

数组元素是“可写位置”,和变量声明无关。即使数组本身用 const 声明,只要索引对应的位置可修改,解构赋值就合法。

  • const arr = [10, 20]; [arr[0], arr[1]] = [arr[1], arr[0]]; ✅ 正常运行,arr 变为 [20, 10]
  • 但若想交换两个独立变量(如 let a = 1; const b = 2;),bconst 声明的,仍可参与解构赋值——因为解构是给绑定目标赋值,不是对 b 做重新声明

比临时变量和数学技巧更可靠

不用 temp,也不用加减或异或,解构天然支持任意类型:

  • 数字、字符串、对象、nullundefined、布尔值全部适用
  • 无溢出风险(不像 a = a + b)、无类型限制(不像 a ^= b 仅整数)
  • V8 等引擎已深度优化,性能与临时变量法基本一致