zoukankan      html  css  js  c++  java
  • ES6入门详解(二) 解构赋值

    关于解构赋值非常简单 是一个es6语法糖 主要有数组解构赋值 对象解构赋值 主要的应用是按需解构exports的对象 解构函数参数 解构JSON等等 下面代码简单演示

    数组解构赋值

    //数组解构模式匹配 按照固定的左右模式进行匹配
    let [a,b,c] = [1,2,3]
    console.log(a,b,c)
    //匹配多维数组也必须做到模式相同
    let [a,b,[c,d,[e]]] = [1,2,[3,4,[5,6,[7]]]]
    console.log(a)
    //可以使用..来匹配所有匹配b后面所有的数据 这里注意c后面再跟变量就会报错
    let [a,b,...c] = [1,2,3,4,5,6,7,[8]]
    console.log(c)

    对象解构赋值

    //最常见的模式即赋值
    let {obj1,obj2} = {obj1:123,obj2:123}
    console.log(obj1)
    //第二种模式与赋值分离 这个时候obj1是匹配模式 :a=>将匹配到的数值赋值给a
    let {obj1:a,obj2:b} = {obj1:123,obj2:123}
    console.log(a)
    //第三种对象数组混合解构
    //这个例子稍微有些复杂 首先obj1是模式 匹配到了[1,2,{b:3},[4,5]]
    //然后a=>1 b=>2 接下来是匹配一个对象 {b:c}这是b就是模式 c赋值 x y 又是数组匹配
    let {obj1:[a,b,{b:c},[x,y]]} = {obj1:[1,2,{b:3},[4,5]]}
    console.log(a)
    console.log(c)
    console.log(x)
    console.log(y)
    //es6语法中存在块作用域
    let x;
    {x} = {x:10}
    console.log(x) //报错 因为解析到{x}后js引擎会将{x}当成一个代码块也就是作用域 一个作用域 而不是解构赋值的模式
    // 正确的做法
    let x ;
    ({x} = {x:10}) //将作用域转为表达式就可以了
    console.log(x)
    //这里格外说一点 数组在进行解构时 解构的数据必须具有Iterator 接口 关于Iterator 之后会详细说
    // 在对象解构的过程中 因为万物皆对象的原理 所以无论如何解构都是符合语法规范的
    // ({} = function(){})
    // ({} = []) //正确
    // ([] = {}) //错误
    // ({} = 'sdf')
    // ({} = 123)

    其他解构 不常用

    //字符串解构 上文说过万物皆对象无论什么在进行对象解构时都转成对象 null undefined除外 
    let [a,b,c,d] = 'xlln'
    let {length:len} = 'xlln'
    console.log(a)
    console.log(len)
    //通过下面这两个例子也可以看出来
    let {toString:s} = 123
    console.log(s === Number.prototype.toString)
    
    let {slice}  = '123'
    console.log(slice === String.prototype.slice)
    //无论数组解构和对象解构都有默认值
    //这里注意一点es内部在判断是否等于默认值是 是判断是否===严格等于undefined 如果等于才会使用默认值
    let [a = 1,b = 2,c = 3] = []
    console.log(a)
    let {a = 1,b = 2,c = 3} = {a:undefined,b:null,c:null}
    console.log(a) //1
    console.log(b) //null
    console.log(c) //null
    //用法一函数参数解构
    function fn1({a,b}){
        console.log(a+b)
    }
    
    fn1({a:1,b:2})
    //可以给参数指定默认值 同样只有在绝对等于undefined 的情况下默认值生效 即模式所匹配的项 等于undefined 必须是当前模式匹配到的否则无效
    function fn2({a = 4,b = 5} = {a:1,b:2}){
        console.log(a+b)
    }
    fn2()
    //不是当前模式匹配到的
    
    fn2({}) //9 当前模式是参数 object {undefined,undefined} 
    //用法二解构node核心模块 或 JS内置对象
    const {push} = [];
    console.log(push)
    const {join} = require('path')
    console.log(join)
    //用法三值交换
    let x = 1;
    let y = 3; //注意这里必须加;要不然会被解析错误
    [x , y] = [ y , x]
    console.log(x)

                                                                     

  • 相关阅读:
    课程设置
    专家答疑:ASP.NET MVC与WebForm的区别
    PHP环境的搭建之利器 – APMServ
    office access vs mysql
    IBM Tivoli Identity Manager 5.1 Basic Implementation
    Windows安全认证是如何进行的?
    landesk桌面管理
    转:HBase在淘宝的应用和优化小结
    Workstation ITbased Security Best Practice Configurations
    Scale Your Applications with Component Load Balancing (cont'd)
  • 原文地址:https://www.cnblogs.com/tengx/p/8889064.html
Copyright © 2011-2022 走看看