zoukankan      html  css  js  c++  java
  • 变量的结构赋值

    参考:阮一峰es6 http://es6.ruanyifeng.com/#docs/destructuring

    时间:2018-07-04

    es6按照一定的模式,从数组和对象中提取值,对变量进行赋值。

    1.数组的解构赋值:按照顺序

    let a=1;
    let b=2;
    let c=3;
    //
    let [a,b,c]=[1,2,3]
    //等价
    //只要左右两侧模式匹配,就会赋值
    let[,,a]=[1,2,3];//a:3
    let [a,...b]=[1,2,3,4]//b:[2,3,4]
    let [a,b,...c]=[1];//a:1;b:undefined;c:[]
    let [foo]=[]//foo:undefined;
    let [bar,foo]=[1]//foo:undefined;
    let [bar]=[1,2,3]//bar :1

    如果等号右边不具备iterator接口(可遍历?以后会总结),则报错

    let [a,b]=1;
    let [a]=1;
    let a={};
    .......

    对于set结构(不知道?下一章写)

    let [x,y,z]=new Set([1,2,3])

    默认值

    let [foo=1]=[]//foo:1
    let [a,b=2]=[3]//a:3;b:2;
    let [a=1]=[null]//a:null
    let [a=1]=[undefined]//a=1
    //undefined和null表示:我们不一样;仅当undefined时默认值起作用;
    //默认值是惰性求值,使用到才会计算
    //默认值可以引用解构赋值的其他变量,但该变量在此之前必须已经声明
    let [x=1,y=x]=[];//1,1
    let [x=y,y=1]=[];//引用错误

    对象的解构赋值:按照属性

    let {a,b}={a:1,b:2}//a:1;b:2
    let {aa}={a:1,b:2}//aa:undefined
    //如果下标不一样
    let {a:aa} = {a:1,b:2}//aa:1
    //先赋值给同名属性,在赋值给对应的变量
    let {a,b}等价于let {a:a,b:b}
    let obj = {
        p:['hello',{y:'word'}]
    };
    1)let {p} = obj ;//对p进行赋值
    2)  let {p:[a,{y}]} = obj ;//对a和y赋值,p作为模式
    3)let {p,p:[a,{y}]} = obj ;//对p和a,y赋值
    //题外话
    let {a,a}={a:1}//这里会报错,因为let声明的变量会锁死当前区域,不允许重复声明。
    //为什么第三个不是重复声明变量?
    //第三个可以解析为
    let {p:p,p:[a,{y}]}={p:['hello',{y:'word'}]};
    //在这里是声明了两个不同的变量;
    //而4则解析为:
    //let {a:a,a:a}//声明了两个相同的变量,let锁死区,所以会报错

    默认值:

    let {x=3}={};//x:3;
    let {x:y=5}={x:4};//y:4
    //默认值生效的条件是对象的属性值为undefined;
    let {x=2}={x:null}//x:null
    //结构失败对应的值也为undefined,再取下一层则报错

    对于一个已经已声明的变量用于解构赋值

    let x;
    {x}={x:1};//错误的写法
    ({x} = {x:1});//正确的写法

    对数组进行对象属性的解构

    let arr = [1,2,3];
    let {0:first}=arr;//first:1

    字符串解构赋值

    const [a,b,c,d] = 'hello';//h e l l
    let {length : len}='hello'//5

    数值布尔值解构赋值:

    只要等号右边的值不是数组或者对象,就会将其转为对象,由于undefined和null无法转为对象,所以对其解构赋值会报错、

    let {prop:x} = undefined;//TypeError
    let {prop:y}=null;//TypeError

    函数参数解构赋值

    function add([x,y]){
        console.log(x+y)  
    }
    add([1,2])
    [[1,2],[3,4]].map(([a,b])=>{a+b});//[3,7]

    函数参数解构使用默认值

    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]
    //对比一下以下写法
    function move({x,y}={x:0,y:0}){
        return [x,y]
    }
    //3,8
    //[3,undefined]
    //[undefined,undefined]
    //[0,0]
    
    
    
    ///////////////////
    //undefined会触发函数参数默认值
    [1,undefined,3].map((x='yes')=>x)//[1,'yes',3]

    圆括号问题

    不要在圆括号内使用解构赋值

    赋值语句的非模式部分,可以使用圆括号。

  • 相关阅读:
    转 IDEA 解决代码提示功能消失
    模态框居中显示
    DetachedCriteria和Criteria的使用方法
    struts2配置文件详解
    springMVC上传图片
    在linux下运行mongodb
    webSocket客服在线交谈
    接口自动化
    easyui input文本框清除值
    Spring总结
  • 原文地址:https://www.cnblogs.com/shui1993/p/9261592.html
Copyright © 2011-2022 走看看