zoukankan      html  css  js  c++  java
  • ES6功能扩展解构赋值

    解构是一种打破原有数据结构,将其拆分为更小部分的过程

    对象解构

    在ES5中,开发者们为了从对象中获取特定数据并赋值给变量,通常是这样做

    var obj = {
      name: 'wmui',
      age: 10
    }
    
    var name = obj.name, age = obj.age;
    

    在ES6中,利用解构功能,可以这样做

    let obj = {
      name: 'wmui',
      age: 10
    }
    
    let {name, age} = obj;
    

    类似于对象字面量语法的形式,只不过放到了赋值操作符的左边

    可以使用解构功能为变量赋值,它会覆盖之前的变量值

    let obj = {
      name: 'wmui',
      age: 10
    }
    let name = 'wang', age = 20;
    ({name, age} = obj);
    
    console.log(name,age) // wmui 10
    

    注意: 一定要用一对小括号包裹解构赋值语句,JS引擎将一对开放的花括号视为一个代码块。语法规定,代码块语句不允许出现在赋值语句左侧,添加小括号后可以将块语句转化为一个表达式,从而实现整个解构赋值过程

    默认值

    使用解构赋值表达式时,如果指定的变量名称在对象中不存在,这个变量会被默认赋值为undefined

    let obj = {
      name: 'wmui',
      age: 10
    }
    
    let {name, age, sex} = obj;
    console.log(sex) // undefined
    

    当指定的属性不存在时,可以定义一个默认值,在属性名称后添加一个等号和相应的默认值即可。

    let obj = {
      name: 'wmui',
      age: 10
    }
    
    let {name, age, sex = 'boy'} = obj;
    console.log(sex) // boy
    

    重命名

    如果希望使用不同命名的变量存储对象属性的值,在属性名称后添加一个冒号和新的属性名即可。

    let obj = {
      name: 'wmui',
      age: 10
    }
    
    let {name: myName, age: myAge} = obj;
    console.log(myName,myAge); // wmui 10
    

    使用不同的变量名也可以设置默认值

    let obj = {
      name: 'wmui',
      age: 10
    }
    
    let {name: myName, age: myAge, sex: mySex = 'boy'} = obj;
    console.log(myName,myAge,mySex); // wmui 10 boy
    

    嵌套对象解构

    嵌套的对象也可以使用解构赋值,同样与对象字面量的语法相似

    let obj = {
      name: 'wmui',
      age: 10,
      test: {
        a: {
          start: 2010,
          end: 2011
        },
        b: {
          start: 2013,
          end: 2015
        }
      }
    }
    
    let {test: {a}} = obj;
    console.log(a.start) // 2010
    console.log(a.end) // 2011
    

    嵌套对象同样可以使用不同的变量名字存储对象属性的值

    let obj = {
      name: 'wmui',
      age: 10,
      test: {
        a: {
          start: 2010,
          end: 2011
        },
        b: {
          start: 2013,
          end: 2015
        }
      }
    }
    
    let {test: {a: aa}} = obj;
    console.log(aa.start) // 2010
    console.log(aa.end) // 2011
    

    数组解构

    数组的解构比对象简单,数组的解构使用的是数组字面量方式,解构操作在数组内部完成。

    let colors = ['red','green','blue'];
    let [firstColor,secondColor] = colors;
    console.log(firstColor) // red
    console.log(secondColor) // green
    

    占位符

    在解构模式中,可以通过提供逗号占位符来省略元素,只获取自己需要的元素

    let colors = ['red','green','blue'];
    let [,,thirdColor ] = colors;
    console.log(thirdColor ) // blue
    

    解构赋值

    数组的解构也可用于赋值上下文,和对象不同的是,它不需要小括号包裹成表达式

    let colors = ['red','green','blue'];
    let firstColor = 'black', secondColor = 'white';
    [firstColor, secondColor] = colors;
    console.log(firstColor,secondColor ) // red green
    

    默认值

    可以在数组解构赋值表达式中为数组中的任意位置添加默认值,当指定位置的属性不存在或其值为undefined时使用默认值

    let colors = ['red'];
    let [ firstColor, secondColor = 'green' ] = colors;
    console.log(firstColor); // red
    console.log(secondColor); // green
    

    嵌套数组解构

    嵌套数组的解构只需要在原有数组模式中插入另一个数组模式即可

    let colors = ['red', ['green', 'lightgreen'], 'blue'];
    let [ firstColor, [ secondColor ] ] = colors;
    console.log(secondColor); // green
    

    不定元素

    在数组中可以通过...语法,把数组中的其余元素赋值给一个特定的变量

    let colors = ['red', 'green', 'blue'];
    let [ firstColor, ...restColors ] = colors;
    console.log(firstColor); // red
    console.log(restColors.length); // 2
    console.log(restColors[0]); // green
    console.log(restColors[1]); // blue
    

    可以利用不定元素实现数组复制

    let colors = ['red', 'green', 'blue'];
    let [...copyColors] = colors;
    console.log(copyColors) //  ['red', 'green', 'blue']
    

    其他解构

    字符串解构

    字符串也可以解构赋值,这是因为字符串被转换成了一个类数组对象

    const [a, b, c, d, e] = 'hello';
    console.log(a); //"h"
    

    类数组对象有一个length属性,可以对这个属性解构赋值

    const {length}= 'hello';
    console.log(length) // 5
    

    数值和布尔值解构

    解构数值和布尔值时,会先将它们转换成对象,所以可以解构它们自身或继承的属性和方法

    let {toString:s1} = 123;
    console.log(s1 === Number.prototype.toString);//true
    
    let {toString:s2} = true;
    console.log(s2 === Boolean.prototype.toString);//true
    

    解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错

    优秀文章首发于聚享小站,欢迎关注!
  • 相关阅读:
    给暗黑2佣兵换装备,他/她说的英语是什么?
    为什么“家徒四壁”中的徒是仅仅,只有的意思?
    喜马拉雅几个有意思的订阅内容
    看似最艰苦的道路,长远考虑确是收益最大,实际上最容易的路
    《赠友》--杜运夑
    【Python】由host得到IP
    day31_Hibernate复习_03(补刀)
    day31_Hibernate复习_03
    day31_Hibernate学习笔记_03
    MyEclipse2017 CI 断点无效
  • 原文地址:https://www.cnblogs.com/yesyes/p/15352367.html
Copyright © 2011-2022 走看看