zoukankan      html  css  js  c++  java
  • 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('');
    
    
    


  • 相关阅读:
    [转]直接拿来用!最火的Android开源项目(一)
    [原] jQuery EasyUI 1.3.2 离线API、Demo
    [原]通过GitHub Pages建立个人站点(详细步骤)
    [转]直接拿来用!最火的Android开源项目(二)
    堆排序
    单例模式
    【面试题】:火车运煤问题
    Aptana Studio 2.0 对JQuery的智能提示的支持
    vs2005 常用快捷键(备忘)
    关于ASP.NET在IIS上的一些问题的解决办法
  • 原文地址:https://www.cnblogs.com/xianrongbin/p/6802988.html
Copyright © 2011-2022 走看看