可以将 数组对象字符串 “拆包” 至一系列变量中,被称为解构(Destructuring)ES6

数组

按照位置进行解构

// 1.一般解构
let [a, b, c] = [1, 2, 3]
a // 1
b // 2
c // 3
 
 
// 2.嵌套解构
let [a, [[b], c]] = [1, [[2], 3]]
a // 1
b // 2
c // 3
 
 
// 3.部分解构
let [a, , b] = [1, 2, 3]
a // 1
b // 3
 
 
// 4.Rest参数
let [head, ...tail] = [1, 2, 3, 4]
head // 1
tail // [2, 3, 4]
 
 
// 5.解构Set(for...of 的语法糖)
let [a, b, c] = new Set([1, 2, 3])
a // 1
b // 2
c // 3

对象

按照属性名进行解构

// 1.一般解构
let { a, b } = { a: 1, b: 2 }
a // 1
b // 2
 
 
// 2.重命名(取对象中的哪个属性的值: 赋值给新变量)
let { a: newName } = { a: 1, b: 2 }
newName // 1
 
 
// 3.Rest参数
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
x // 1
y // 2
z // { a: 3, b: 4 }
 
 
// 4.嵌套解构
let obj = {
  p: [
    'Hello',
    { y: 'World' }
  ]
};
 
let { p, p: [x, { y }] } = obj; // 第二个 p 是模式
x // "Hello"
y // "World"
p // ["Hello", {y: "World"}]

字符串

let [a, b, c, d, e] = 'hello'
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
 
let { length : len } = 'hello'
len // 5

默认值

当右边的值 严格等于(===undefined 时,默认值才会生效

let [a = true] = [];
a // true
 
let [a = true] = [null]
a // null
 
// 默认值可以引用解构赋值的其他变量,但该变量必须已经声明
let [x = 1, y = x] = [] // x=1; y=1
 
let { a = 1 } = {};
a // 1
 
let { x: y = 1 } = {};
y // 1

如果默认值是表达式,则是惰性求值的(只有右边是 undefined 才会进行求值)


Note

主要用途

  • 同时从某个数组或对象中取多个值
  • 交换变量的值:[a, b] = [b, a]
  • for...of 循环中的循环变量:for (let [key, value] of map)
  • 函数定义时的参数
  • catch 绑定变量

Warning

  • 解构赋值是浅拷贝
  • 剩余参数的解构赋值只能作为最后一个
  • 如果解构不成功,变量的值就等于 undefined
  • 对已声明的变量进行解构,则需要注意加括号:({x} = {x: 1}),不然 JS 引擎会将 {x} 理解为一个代码块产生语法错误