从对象或数组中提取数据,并赋值给变量

  • 解构赋值更加快捷与方便
  • 可以同时提取多个数据集体赋值,并创建多个变量
  • 解构赋值的底层是使用了iterator
  • ES5中如果要同时提取多个数据,则会十分麻烦

**

对象解构(Object Destructure)

  1. const { key1: 变量名1, key2: 变量名2 } = { key1: value1, key2: value2 }
  • 使用对象的结构声明变量:key是要提取的数据的key,value是声明的变量名
    • 如果要提取的key与变量名称相同,可以简写成一个
    • 如果对象中没有指定的key,那么变量值会是undefined
  • 变量默认值:key : value = 值key = 值
    • 在key-value右侧使用=指定默认值,变量值为undefined时使用
      const { a, b: otherB } = { a : 1, b : 2 }    // 简写     a = 1; otherB = 2
      const { a: otherA = 1, b = 2 } = {}          // 默认值   otherA = 1; otherB = 2
      

可变元素(RestElement)

const obj = {
    a: 1,
  b: 2,
  c: 3
}

const { a, ...rest } = obj  // a = 1, rest = { b: 2, c: 3 }
  • 语法 ...变量名,变量名随意
  • 对象解构中,可变元素会提取剩余的所有键值对,是一个对象
  • 可变元素只能有一个,且只能写最后

数组解构(Array Destructure)

const [ 变量名1, 变量名2 ] = [ value1, value2 ]
  • 使用数组的结构声明变量,每一个具体的元素都是变量
    • 右侧数据会根据顺序被赋值给左侧的变量
    • 如果对应位置没有数据,那么变量值会是undefined
  • 变量默认值:变量 = 值
    • 如果提取的数据是undefined,就会使用默认值
  • 可以使用逗号进行占位,跳过某些元素,只提取指定位置的元素 占位
  • 右侧数据可以是任意的可迭代对象或字符串(因为字符串的包装类型)
    const [a = 3] = []                    // 默认值      a = 3
    const [,c,,d] = [1, 2, 3, 4]          // 占位        c = 2; e = 4
    const [e,,,f] = 'abcd'                // 字符串       e = 'a'; f = 'd'
    const [g, h] = new Set([1, 2])        // 可迭代对象   g = 1; h = 2
    

可变参数(RestElement)

const arr = [1, 2, 3, 4, 5]
const [a, ...b] = arr     // a = 1; b = [2, 3, 4, 5]
  • 语法 ...变量名,变量名随意
  • 一个可变元素可以同时提取多个数据
    • 会提取从自身位置开始到最后的所有数据
    • 可变元素是一个数组,元素是提取的数据
  • 可变元素只能有一个,且只能写最后

解构嵌套

const obj = {
    size: {
      width: 100,
    height: 200
  },
  items: ['Cake', 'Donut'],
  extra: true
}

const { size: { width, height }, items: [ cake, donut ], extra } = obj
// width = 100; height = 200; cake = 'Cake'; donut = 'Donut'; extra = true
  • 解构表达式可以进行嵌套,用于提取复杂结构的数据
  • 语法:在需要嵌套的地方,将变量名替换为对应的解构表达式,就可以进行深层解构
    • 简单来说,只要保持两边结构的一致即可

特殊使用场景

函数形参

function xxx ({x, y}) {
    console.log(x + y)
}

xxx({ x:1, y:2 })
  • 函数接收一个对象,将其中的属性解构出来,方便大量参数的传递