解构赋值

三葉Leaves Author

在 JavaScript 中,解构赋值(destructuring assignment)不仅能方便地从数组对象中提取值,还能用来实现变量交换(swap)——免去引入临时变量的麻烦。


1. 变量交换(swap)

传统情况

最常见的交换两变量写法是这样:

1
2
3
4
5
6
7
8
let a = 1;
let b = 2;

// 交换前:a = 1, b = 2
const temp = a;
a = b;
b = temp;
// 交换后:a = 2, b = 1

我们借助了一个中间 “temp” 变量来暂存其中一个的值,才避免覆盖。

利用解构直接交换

解构模式的右侧可以是任意表达式,包括另一个数组字面量。

1
2
3
4
5
6
7
let a = 1;
let b = 2;

// 同时将 [a, b] 赋值给 [b, a]
[a, b] = [b, a];

console.log(a, b); // 2 1

发生了什么?

  1. 右侧先计算出一个数组 [b, a],此时是 [2, 1]

  2. 然后左侧解构把这个数组的第一个元素赋给 a,第二个元素赋给 b

这样,就在一行里完成了交换,且没有显式的临时变量。


2. 解构赋值的基本语法

数组解构

1
2
3
const arr = [10, 20, 30];
const [x, y, z] = arr;
console.log(x, y, z); // 10 20 30

左侧的 [x, y, z] 就像一个模式(pattern),会把右侧数组里的元素逐一取出,赋给对应的变量。

其他

TODO


3. 注意事项

  1. 原子性
    解构赋值在规范中是先计算右侧,再做赋值,所以不存在覆盖问题。

  2. 不可嵌套在声明里同时用
    如果你用 let [a, b] = [b, a],这是声明新变量 a、b,而右侧的 b、a 需先有定义,否则会报错。通常交换时,a、b 已存在,只写 [a, b] = [b, a]

  3. 性能
    虽然解构写法看起来美观,但在性能极端敏感场景(如超大数组的热循环)中,解构会构造临时数组,造成额外开销。在变量交换任务中解构的性能低于使用临时变量。

  • 标题: 解构赋值
  • 作者: 三葉Leaves
  • 创建于 : 2025-05-09 00:00:00
  • 更新于 : 2025-05-26 02:57:24
  • 链接: https://blog.oksanye.com/03b674ce4186/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论