解构赋值

解构赋值

数组的解构赋值

  • 只要等号两边的模式相同,左边的变量就会被赋予对应的值

    let [x, y, z] = [1, 2, 3]
    let [a, [[b], c]] = [1, [[2] ,3]]
  • 如果解构不成功,变量的值就为undefined

  • 等号左边的模式,只匹配一部分的等号右边的数组。这种情况下,解构依然可以成功。称为不完全解构

    let [a, b] = [1, 2, 3]
    a//1
    b//2
  • 如果等号右边的不是数组,将会报错

  • 只要某种数据结构具有Iterator接口,都可以采用数组形式的解构

默认值

  • 允许指定默认值

    let [foo = true] = []//foo:true
    let [a, b = 2] = [1]//a:1,b:2
    let [a, b = a] = [1, undefined]//a:1,b:1
  • 只有当一个数组成员严格等于undefined,默认值才会生效

    let [x = 1] = [null]
    //此时x等于null
  • 如果默认值是一个表达式,则此表达式是惰性求值的

    function f(){
       return 1;
    }
    let [x = f()] = [2]//x:2 不会执行函数f

对象的解构赋值

  • 因为对象的属性没有次序,所以变量必须与属性同名,才能取到正确的值

    let {foo, message} = {foo: '111', message: 222};

    let {ashen, xing} = {xing: 23, ashen: 20};
  • 如果解构失败,变量的值等于undefined

  • 对象的解构赋值可以取到继承的属性

    const obj1 = {};
    const obj2 = { foo : 'bar' };
    Object.setPrototypeOf(obj1,obj2);
    const { foo } = obj1;
    //此时虽然obj1没有foo属性,但其原型对象是obj2,继承了其属性,所以解构赋值成功

注意

  • 在将一个已经声明了的变量进行解构赋值时,大括号不能写在行首,否则会被js解析成块级作用域,出现语法错误

    • 应该用()将解构赋值包裹起来

    let x;
    {x} = {x:1} //报错
    ({x} = {x:1}) //不报错
  • 解构赋值允许等号左边的模式中不放置任何变量名,虽然无意义,但合法。

  • 由于数组本质是特殊的对象,隐藏可以对数组进行对象属性的解构

    let arr = [1, 2, 3]
    let { 0 : first, [arr.length - 1] : last} = arr
    //键值为0的值是1,first:1
    //键值为2的值为3,last:3

数值和布尔值的解构赋值

  • 如果等号右边不是数组或对象,则会先转换为对象

    let {toString: s} = 123;
    //123转为对象后:Number 具有toString方法,所以s为true

    let {toString: s} = true;
    //true转为对象后:Boolean 具有toString方法,所以s为true
  • 由于undefinednull无法转换为对象,所以解构赋值报错

posted @ 2020-03-24 16:27  ashen1999  阅读(111)  评论(0编辑  收藏  举报