zoukankan      html  css  js  c++  java
  • ES6解构赋值的简单使用

     相较于常规的赋值方式,解构赋值最主要的是'解构'两个字,在赋值的过程中要清晰的知道等号右边的结构.

    先简单地看一下原来的赋值方式.

    1
    var a=[1,2]    

    分析一下这句代码的几个点:

    (1)变量申明和赋值

    var a;
    a=[1,2]
    //你可以理解这两个操作是分开的,虽然是一句代码.声明变量都会出现变量名的提升(也就是是声明变量的这句代码会被提升到生效作用域的最前面),区别在于'var'声明的是全局变量,而'let const'声明的是块级作用域变量.

    (2)结构对应

    1
    2
    3
    4
    var a;
    a=[1,2];
    a=12;   
    a={name:'小明',age:18}

    解构赋值

    结合上面的的例子,假如我现在只想要{name:'小明',age:18}这个对象中的'name'属性,原来的做法

    1
    2
    var a={name:'小明',age:18}
    console.log(a.name)

          就需要通过点语法去获取,实际开发中,我们的数据很多时候是嵌套很多层的,所以就会出现类似'a.b.c.d'这类代码.看着让人头晕,而解构赋值就是解决这个问题的方案之一

    基本用法

    (1)声明和赋值

        数组

    1
    let [a] = [1];

       [变量名]:变量名可随意

        对象

    1
    let {name} = {name:'小明',age:18}

     {变量名}:变量名必须是对象中的属性名 

    (2)结构对应(重难点) 

     数组(要位不要名) 

     对象(要名不要位)

      完全解构 

            数组:

              a:按顺序

    1
    2
    3
    let [a, b, c] = [1, 2, 3];
    console.log(a,b,c)
    //1,2,3
    1
    这样赋值的语义是我知道右边是一个有三个元素的数字,所以我声明了一个数组,三个元素分别是a,b,c和右边的三个元素对应.所以a=1,b=2,c=3 

        b:打乱顺序

    1
    2
    3
    let [a, c, b] = [1, 2, 3];
    console.log(a,b,c)
    //1,3,2
    1
    因为三个变量的位置变了,所以其对应的元素(值)也就变量  

     对象:

            a:按顺序

    1
    2
    3
    let {name,age} ={name:'小明',age:18}
    console.log(name,age)
    //小明,18

         b:打乱顺序  

    1
    2
    3
    let {age,name} ={name:'小明',age:18}
    console.log(name,age)
    //小明,18

     虽然变量的声明前后顺序变了,但是对象中的值没变,它最终还是根据属性名去找值,所以结果没变

       c:不存在的属性名

    1
    2
    3
    let {name,sex} ={name:'小明',age:18}
    console.log(name,sex)
    //小明,undefined

      

    嵌套解构

        数组:

    let [a, [b,c], d] = [1, [2, 3], 4];
    console.log(a,b,c,d)
    //1,2,3,4
    //反正结构和位置一一对应就行了.

      对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    const obj={
        man:{
          student:{
               name:'小明',
               age:18
            }
       }
    }
     
    let {man:{student}} = obj //obj里面有个man,然后里面有个student,注意这一行代码里变量就只有一个student,并没有man
    console.log(man,student) // undefined,{name:'小明',age:18}
    let {man:{student:{name}}} = obj //同理,逐层拿到最后的name值,而且也只有name这一个属性
    console.log(name) //小明
     
    //如何同时拿到嵌套的每层的数据
    let {man,man:{studengt},man:{student:{name}}} = obj
    console.log(man,student,name) //{student:{name:'小明',age:18}},{name:'小明',age:18},18

      

     

    不完全解构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    let [a, b] = [1, 2, 3];
     
    console.log(a,b,c)
    //1,2
    //这里变量只有两个,但是数组中元素有三个.这里还是根据位置对应原理就行.a表示数组中的第一个元素,b表示第2个.而第三个元素我不要.
     
    let [a, [b], d] = [1, [2, 3], 4];
    console.log(a,b,d)
    //1,2,4
    //嵌套解构同样也可以不完全解构,根据实际需要,需要哪个就解构赋值哪个
    let [, , c] = [1, 2, 3];
    console.log(c)
    //3
    //注意这里是完全解构,只不过前两个元素我虽然解构了,但是我不要.因为位置对应的关系,所以必须有两个占位的,才能拿到第三个.
    //放在这里是为了方便理解为啥前面两个明明不要还得写两个','

    超量赋值(自己瞎编的词)  

    1
    2
    3
    4
    5
    6
    let [a,b,c,d] = [1,2,3]
    onsole.log(a,b,c,d)
     
    //1,2,3,undefined
    //因为前三个元素都能对应找到,而第四个找不到,但是已经声明了,没有值.
    //对象同理,如果出现了对象中没有的属性就会得到undefined

      

     (3)重命名(先取再重命名)

       数组:我们上面说过,数组解构的时候只要注意位置对应就行了,名称啥的无所谓,你喜欢叫什么变量名就什么变量名

       对象:对象解构的时候是要属性名对应才能取到值.但是没有说取到值之后不能重命名啊.一定要取到值之后在命名  

    1
    2
    3
    4
    5
    let {name:myName,age} ={name:'小明',age:18}
    //这里name:myName的意思是:取到name属性值,冒号后面的变量名没有花括号,意思是把我取到的值交给冒号后面的变量名,即'myName'.相当于把name变量重命名为myName
    //而student:{name},同样是'属性名:'意思一样,取里面对应的属性,冒号后面还有花括号,所以再解构,取student里面的name属性
    console.log(name,myName,age)
    //undefined,小明,18

     (4)默认值(先取再默认)

           数组

    1
    2
    3
    4
    let [a=0, b=0,c=10] = [1, 2];
    console.log(a,b,c) //1,2,10
     
    //这里a,b,c在左边都先给了个默认值,但是这里是超量解构,a和b都成功取到值,但是c没取到,所以最终是默认值10,如果没有默认值就是undefined

      对象

    1
    2
    3
    4
    5
    6
    let {name:sex='男'} ={name:'小明',age:18}
    console.log(sex)  //小明
    let {name:{sex='男'}} = {name:'小明',age:18}
    console.log(sex)  //男
     
    //这里刚好通过这两个例子区分一下重命名和嵌套

       (5)字符串解构

       字符串的解构可以理解为一维数组的解构,这在处理字符串的时候特别方便.

    1
    2
    let [a,b,c] ='123'
    console.log(a,b,c,typeof c)  //1,2,3,string   解构出来的是字符类型的数据 

     长度

    1
    2
    3
    4
    5
    6
    let {length:s} ='123'
    console.log(s,typeof s) //3,number 
     
    //同理,数组也有长度
    let {length:s} = [1,2,3]
    console,log(s,typeof s) //3,number

      

     (6)函数参数自动解构

    1
    2
    3
    4
    5
    function look([x,y]){
    console.log(x,y)
    }
     
    look([1,2]) //1,2

      

      参数默认值陷阱单独再写一篇

       (7)先声明再赋值(少用)

        数组

    1
    2
    3
    4
    let a;
    let b;
    [a,b]=[1,2]
    console.log(a,b) //1,2

      

     对象

    1
    2
    3
    let x;
    {x}={x:1,y:1} //报错 主要还是大括号的原因,js在行首遇到{}会把它当做代码块执行,所以会报错.
    ({x}={x:1,y:1}) //这样可以解决问题,但是尽量别引入(),问题会变得复杂

      

    到这里为止,解构赋值的日常使用没问题了,它带来了不少方便,但也会产生一些新bug,比如:let {data} =res 的写法,假如res里面并没有data属性,那就会undefined,所以还是得明确等号右边的解构. 

    原文地址:https://www.cnblogs.com/shyno/p/12156854.html

  • 相关阅读:
    SQL——模糊查询LIKE
    SQL——表连接JOIN
    【转】Java MySQL数据类型对照
    Java精确计算小数
    zTree 勾选checkbox
    【转】Freemarker输出$和html标签等特殊符号
    freemarker(FTL)常见语法大全
    【转载】浏览器与服务器通信的过程
    python基础 常见用法
    360浏览器兼容性问题
  • 原文地址:https://www.cnblogs.com/1549983239yifeng/p/14269546.html
Copyright © 2011-2022 走看看