ES6新特性——变量的解构赋值

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /* 
           解构
              ES6允许按照一定模式,从数组和对象中提取值
              对变量机型赋值,这被称为解构
         */
         let a=1;
         let b=2;
         let c=3;
         //上述代码等价于
         //let[a,b,c]=[1,2,3];


         //eg:
         let [foo,[[bar,baz]]]=[1,[[2,3]]]
         console.log(foo);
         console.log(bar);
         console.log(baz);

         let[,,third]=["foo",'bar','baz'];
         console.log(third);

         let[x,,y]=[1,2,3];
         console.log(x);
         console.log(y);

         let[head,...tail]=[1,2,3,4];
         console.log(head);
         console.log(tail);

         let[w,p,...q]=['a'];
         console.log(w);
         console.log(p);
         console.log(q);
         //如果解构不成功,变量的值就等于undefined
         /* 
            不完全解构:
              等号左边的模式只能匹配一部分等号右边的数组
          */
          let[g,k]=[1,2,3];
          console.log(x);
          console.log(y);

          let [s,[d],f]=[1,[2,3],4]
          console.log(s);
          console.log(d);
          console.log(f);
          /* 
             默认值:
                解构赋值允许指定默认值
           */
            let[fo=true]=[];
            console.log(fo);

            //ES6内部使用严格相等运算符(===)判断一个位置是否有值
            //只有一个数组成员严格等于undefined,默认值才会生效
            let[aa=1]=[undefined];
            console.log(aa);//1

            //null不严格等于undefined,因此默认值不生效
            let[bb=2]=[null];
            console.log(bb);//null

            

            /* 
                对象的解构赋值
                   1.解构不仅可以用于数组,还可以用于对象
                   2.对象的解构与数组有一个重要的不同:
                          数组的元素是按次序排列的二,变量的取值由它的位置决定
                          而对象的属性没有次序,变量必须与属性同名,才能取到正确的值
             */
             //变量与属性一致
             let{oo,ba}={oo:'aa',ba:'bb'};
             console.log(oo);
             console.log(ba);
             //变量与属性不一致,解构失败,变量的值等于undefined
             let{bz}={bq:'xx'};
             console.log(bz);//undefined
             //如果变量名与属性名不一致,必须写成如下格式
             let{fqo:az}={fqo:'acsxzs',be:'ddczc'};
             console.log(az);

             let obj={first:'hello',last:'world'};
             let{first:l,last:r}=obj;
             console.log(l);
             console.log(r);
             //简写:
             //let{first:l,last:r}={l:'hello',r:'world'};
             //即对象的解构赋值的内部机制,可以先找到同名属性,然后再赋给对应的变量 
             
             
             //解构也可用于嵌套结构的对象
             //eg:
             const node={
                 loc:{
                     start:{
                         line:1,
                         colum:5
                     }
                 }
             };
             let{loc,loc:{start},loc:{start:{line}}}= node;
             console.log(line);
             console.log(loc);
             console.log(start);
             //对象的解构赋值可以取到继承的属性
             const obj1={};
             const obj2={aqq:'adz'};
             Object.setPrototypeOf(obj1,obj2);//设置obj1的原型为obj2
             const{aqq}=obj1;
             console.log(aqq);
             //如果解构模式是嵌套的对象,而对象所在的父属性不存在,那么将会报错
             //let{foo:{ar}}={baz:'baz'}; 报错


             /* 
                 默认值:
                     对象的解构也可以指定默认值
                     
              */
            var {x=3}={};
            console.log(x);

        var{x,y=4}={x:1};
        console.log(x);//1
        console.log(y);//4

        var {x:y=3}={}    //变量:属性  :代表变量对应的属性,起衔接作用
        console.log(y);//y=3   x is not defined

        var {x:y=3}={x:5}
        console.log(y);   //y=5

        var{x=3}={x:undefined};
        console.log(x);//3

        var{x=3}={x:null}
        console.log(x);//null

        /* 
           注意:
             如果将一个已经声明的变量用于解构赋值,必须非常小心
             错误写法示例:
             let x;
             {x}={x:1};
             该代码报错的原因是JavaScript引擎会将{x}理解成一个代码块,
             从而发生语法错误
             解决办法:
                将整个赋值语句放在一个圆括号里
                正确写法:
                let x;
                ({x}={x:1});
         */
         //对数组进行对象属性的解构
         let arr=[1,2,3];
         let{0:first,[arr.length-1]:last}=arr;
         console.log(first);//0键对应的值是1
         console.log(last);//arr.length-1对应的是2键,2键对应的值是3

         //字符串的解构赋值
         const[a,b,c,d,e]='hello'
         console.log(a);//h
         console.log(b);//e
         console.log(c);//l
         console.log(d);//l
         console.log(e);//o

         let{length:len}="hello";
         console.log(len);//55

         //数值和布尔值的解构赋值
         /* 
            解构赋值时,如果等号右边是数值和布尔值,则会先转为对象
          */
          let{toString:s}=123;
          console.log(s===Number.prototype.toString);//true
          let{toString:s}=true;
          console.log(s===Boolean.prototype.toString);

          //函数参数的解构赋值
          function add([x,y]){
              return x+y;
          };
          console.logadd([1,2]);
    </script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值