zoukankan      html  css  js  c++  java
  • ES6_入门(4)_数组的解构赋值

     1     //2017/7/14
     2         //变量的解构赋值(解构:Destructuring)
     3 
     4         //(1)数组的解构赋值
     5 
     6         let [a,b,c]=[1,2,3];//模式匹配,只要等号两边的模式相同,左边的变量就会被赋予对应的值。
     7 
     8         //eg:
     9         let [foo,[[bar],baz]]=[1,[[2],3]];
    10         console.log(foo);//1
    11         console.log(bar);//2
    12         console.log(baz);//3
    13 
    14         let[,,third]=['foo','bar','baz'];
    15         console.log(third);//baz
    16 
    17         let [x,,y]=[1,2,3];
    18         console.log(x);//1
    19         console.log(y);//3
    20 
    21         let [head,...tail]=[1,2,3,4];
    22         console.log(head);//1
    23         console.log(tail);//[2,3,4]
    24 
    25         //如果解析不成功,变量的值就等于undefined。
    26         //将剩余数组赋值给一个变量,下面例子中的y解析不成功,所以是undefined,剩余元素赋值给z,因此是一个空的数组。
    27         let[x,y,...z]=['a'];
    28         console.log(x);//a
    29         console.log(y);//undefined
    30         console.log(z);//[]
    31 
    32         //注意:如果剩余元素右侧有一个逗号,会抛出错误的异常,因此剩余元素必须是数组的最后一个元素。
    33         var [a,...b,]=[1,2,3];
    34         console.log(b);//报错:es6.html:285 Uncaught SyntaxError: Rest element must be last element
    35 
    36 
    37         //如果等号的右边不是数组(或者严格地说,不是可遍历的结构,参见《Iterator》一章),那么将会报错。
    38         // 报错
    39             let [foo] = 1;
    40             let [foo] = false;
    41             let [foo] = NaN;
    42             let [foo] = undefined;
    43             let [foo] = null;
    44             let [foo] = {}
    45 
    46 
    47         //解构赋值指定默认值
    48         //注意:ES6内部使用严格相等运算符(===),判断一个位置是否有值,所以,如果一个数组成员不严格等于undefined,默认值是不会生效的。
    49 
    50         let [x=1]=[];
    51         console.log(x);//1
    52 
    53         let[x=2]=[1];
    54         console.log(x);//1
    55 
    56         //以上例子说明,但右边对应数组有相应的元素的时,左边的默认值就会失效,只有当右边没有相应位置的元素时,左边默认值才会生效。
    57 
    58 
    59         //如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用到的时候,才会求值。
    60         function f(){
    61             console.log('aaa');
    62         }
    63     
    64         let[x=f()]=[1];//因为x可以取到值,所以上面的f函数不会执行,上面的等价于下面的代码。
    65 
    66 
    67         
    68 
    69           let x;
    70           if([1][0]===undefined){
    71               x=f();
    72           }else{
    73               x=[1][0];
    74           }
    75 
    76           // 注意:  [1] 是只含元素 1 的数组
    77                 // [0] 是取数组的第 0 个元素
    78                 // [1][0] 的结果就是 1
    79                 // [1][0] === undefined 只是个条件判断而已,即 1 === undefined
    80 
    81 
    82         //默认值可以引用解构赋值的其他变量,但该变量必须已经声明。
    83 
    84         let [x = 1, y = x] = [];     // x=1; y=1
    85         let [x = 1, y = x] = [2];    // x=2; y=2
    86         let [x = 1, y = x] = [1, 2]; // x=1; y=2
    87         let [x = y, y = 1] = [];     // ReferenceError
    88 
    89         // 上面最后一个表达式之所以会报错,是因为x用到默认值y时,y还没有声明。
  • 相关阅读:
    C++中static_cast, dynamic_cast使用方法
    JavaScript中的Boolean 方法与Number方法
    參数预计:最大似然预计、贝叶斯预计与最大后验预计
    漫谈程序控制流
    怎样使用 RMAN 增量备份恢复 data guard log gap(日志断档)
    Unity3d修炼之路:GUIbutton简单使用,完毕对一个简单对象Cube的移动,旋转
    Python写自己主动化之邮件发送(匿名)
    LintCode
    缓存之 ACache
    Android Studio:Multiple dex files define Landroid/support/annotation/AnimRes
  • 原文地址:https://www.cnblogs.com/LinSL/p/7168836.html
Copyright © 2011-2022 走看看