美文网首页
ES6-解构

ES6-解构

作者: 吴高亮 | 来源:发表于2018-12-20 21:13 被阅读0次

    ES6允许按照一定的模式,从数组和对象中提取值;对变量进行赋值;这被称为解构(Destructuring);
    let [a,b,c]=[1,2,3];可以使用这个方式进行赋值;

    本质上,这种写法属于模式匹配;只要等号两边的模式相等;左边的变量就会被赋予相应的值
    如果解构不成功;变量的值就是undefined;
    let [foo]=[];
    let [bar,foo]=[1];
    以上的foo的值都会等于undefined;

    关于Set结构,也可以使用Set的结构;
    let [a,b,c]=new Set(['x','y','c']);
    x;//'a';
    事实上;只要某种数据结构具有Iterator接口;都可以采用数据形式的解构赋值;

    function* fibs(){
     let a=0;
     let b=1;
     while(true){
       yield a;
      [a,b]=[b,a+b];
     }
    }
    let [first,second,third,fourth,fifth,sixth]=fibs();
    

    在解构的每一个值中都可以填写默认值

    • 对象的结构赋值
      结构不仅可以用于数组,还可以用于对象;
    let {foo,bar}={foo:'aaa',bar:'bbb'};
    foo//'aaa';
    bar//'bbb';
    上面的写法可以不按先后顺序;结构会按照属性以及属性名称进行匹配;
    类如
    let {bar,foo}={foo:'aaa',bar:'bbb'};
    这样还是相同的结果;
    bar//bbb;
    foo//aaa;
    如果中间写了不存在的属性;例如写了
    let {x}={y:'bbb'};
    其实这个时候x//undefined
    
    • 字符串的解构赋值;
      const [a,b,c,d,e]='hello';这个最终结果是 a //h;b //'e';c //'l';d //'l';e //'o';;

    • 函数参数的解构赋值

    function add([x,y]){
      return x+y;
    };
    add([1,2]);
    上面代码中函数add的参数
    来着比较常用;
    function move({x=0,y=0}={}){
     return [x,y]
    };
    move({x:3,y:8});//[3,8];
    move({x:3});//[3,0];
    move({});//[0,0];
    move();//[0,0];
    
    • 说到重点就是用途;
      解构用途很多;
      (1)交换变量的值
    let x=1;
    let y=2;
    [x,y]=[y,x];
    上面代码交换变量下x,y;,这样的写法简洁易懂;
    

    (2)从函数返回多个值
    函数只能返回一个值;如果想要返回多个值,只能将他们放在数组或者对象里面返回,有了解构赋值,取出这些就非常方便了

    // 返回一个数组
    
    function example() {
      return [1, 2, 3];
    }
    let [a, b, c] = example();
    
    // 返回一个对象
    
    function example() {
      return {
        foo: 1,
        bar: 2
      };
    }
    let { foo, bar } = example();
    

    (3)函数参数的定义;
    解构赋值可以很方便的将一组参数和变量名对应起来;

    function f([x,y,z]){};
    f([1,2,3]);
    //参数是一组序的值;
    function f({x,y,x}){}
    f({z:3,y:2,x:1});
    

    (4) 提取JSON的数据;
    解构赋值对提取JSON对象中的数据,尤其有用;

    let jsonData={
     id:42,
    status:'ok',
    data:[867,5309]
    };
    let {id,status,data:number}=jsonData;
    console.log(id,status,number);
    //42,'OK',[867,5309];
    上面代码可以快速的提取JSON;
    

    (5)函数的默认参数;

    jQuery.ajax = function (url, {
      async = true,
      beforeSend = function () {},
      cache = true,
      complete = function () {},
      crossDomain = false,
      global = true,
      // ... more config
    } = {}) {
      // ... do stuff
    };
    指定了参数额默认值;就避了函数内部再写 `var foo=config.foo||'default foo';`这样的语句;
    

    (6)遍历Map结构;
    任何部署了Iterator接口的对象;都可以用for...of循环遍历。Map结构原生支持Iterator接口;获取键名和键值;

    const map=new Map();
    map.set('first','hello');
    map.set('second','world');
    for(let [key,value] of map){
      console.log(key+"is"+value)
    };
    //first is hello
    //second is world;
    如果只是想要获取键名;或者只是想获取键值可以写成如下
    //获取键名
    for(let [key] of map){
    //。。。
    }
    //获取键值
    for(let [,value] of map){
     //...
    }
    

    (7) 输入模块的指定方法;
    加载模块时;往往需要指定输入那些方法。解构赋值使得输入语句非常清晰;

    const {SourceMapConsumer,SourceNode}=require('source-map');
    

    相关文章

      网友评论

          本文标题:ES6-解构

          本文链接:https://www.haomeiwen.com/subject/wxuykqtx.html