• ES6(二) Destructuring-变量的解构赋值


    1、解构的含义  

        允许按照一定的模式,从数组和对象中取值,对变量进行赋值,称为解构。

        解构赋值时,只要等号右边的值不是对象,就先将其转换成对象。

     本质上,这种写法属于 “模式匹配”,只要两边模式相同,左边的变量就会被赋予对应的值。
    let [head,...tail]=[1, 2, 3, 4]; //不完全解构,左边的模式,只匹配一部分的等号右边的数组

        解构后: head=1,tail=[2,3,4]。

    2、解构的限制。

         (1)undefined与null 无法转换成对象,解构赋值就会报错

    let { y } = null;    // Cannot match against 'undefined' or 'null'.

         (2)如果等号的右边不是数组,转换对象以后不具备 Iterator接口,或本身就不具备Iterator接口,

      即某种数据结构具有Iterator接口,都可以采用数组形式的解构赋值。
        let [foo]=1; //undefined is not a function,报错的行数会指向上一行代码
    
        let [foo1,foo2]=new Set(['a', 'b', 'c']);
    
    

     3、解构赋值时, 左边参数允许默认值。

        (1)ES6内部使用严格相对运算符,因此,若defaultValue!==undefined,默认值失效。
        var [x=1]=[undefined]; //x=1
        var [y=2]=[null];  //y=2

    (2)赋予默认值时,左边参数 可以引用解构赋值的其他变量,但该变量必须已经声明.
    let [x1=y1,y1=1]=[]; //error,因为此时y1还没有值,应该如此写: let[y=1,x=y]=[];
    
    

    4、对象解构赋值

     对象属性没有次序,变量名必须与属性相同。
        let { fishInstance,dogInstance}={
            dogInstance: {
                name: 'dog',
                moveType: 'run'
            },
            fishInstance{
                name:'fish'
            }
        }
    
    

    5、变量名与属性名不一致,必须写成下面这样。

        真正被赋值的是后者,而不是前者。

    let { oldName:newName}={oldName: '12222222', bar: 'barTest'}
    
    

    6、

     let tree = {
            root: {
                leaf: {
                    left: 5,
                    right: 5
                }
            }
        }
    var { root:{leaf:{left}} }=tree; //此时, root 与 leaf 都是模式,不会被赋值,只有leaf是变量
    console.log(root);  /*root is not defined*/


    7、对象的解构也可以指定默认值,生效的条件是对象的属性严格等于 undefined

     如果解构模式是嵌套的对象,而且子对象所在的父属性不存在,则error。
     let {x=3}={};
    
     let { foo: { name }}={bar: 'bar'};
    
    
     将一个已经申明的变量用于解构赋值,必须非常小心。
     let temp;
     {temp}= {x: 1}; /error
    
     ( { temp }={x: 1} ); //使用圆括号,避免JS引擎将 "{ }" 解释为代码块

    8、字符串解构赋值,会将字符串转换成类似数组的对象。
     const [a,b,c,d,e]='hello world';
        let { length:strLen }='world';

     9、解构 数值和布尔值时,先转换成对象

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

    解构使用场景
      (1)可以很方便的将 现有对象的方法,赋值给某个变量.
    let { log: selfLog}=console;
    selfLog('test log');
      (2)交换变量.
    [x,y]=[y,x];
      (3)从函数返回多个值
        function getPerson() {
            return {
                name: 'jack',
                age: 19
            }
        }
    
        var {name,age}=getPerson();
      (4) 定义函数参数后,可以不按顺序传入
        function setPerson({name,age,address}) {
    
        }
    
        setPerson({age: 19, address: 'china', name: 'Tom'});
      (5)提取JSON对象中的数据
      let jsonData = {
            age: 19,
            name: 'Tom',
            son: [
                'little Jack',
                'little Tom'
            ]
        };
    
        let { son:child }=jsonData;
      (6)遍历map结构
        var map =new Map();
    
        for(let [key,value] of map) { }
    
        for(let [,value] of map ) { }
      (7)获取模块的指定方法
    
    
     const { SourceMapConsumer }= require('');
    
    
    


  • 相关阅读:
    CruiseControl.NET与TFS结合的配置文件
    环信Restfull API dotnetSDK
    NAnt0.92版本首次在windows 8.1的机子上运行报错的问题解决
    asp.net接收ajax请求参数时为空的现象
    对接微信红包时:CA证书出错,请登录微信支付商户平台下载证书
    在打开vs解决方案时,怎样让所以打开的项目自动折叠
    使用Chrome或Fiddler抓取WebSocket包
    SVN使用教程
    禁用Resharper长代码自动换行的解决办法
    SQLServer日期格式化
  • 原文地址:https://www.cnblogs.com/xianrongbin/p/6802988.html
Copyright © 2020-2023  润新知