es6解构赋值

Aphorism

coding changes the world , accumulating makes yourself

主要从三个方面讲述:

  1. 数组式的解构赋值
  2. 对象式的解构赋值
  3. 函数中的解构赋值
   // preface
       // 现今的变量声明语法十分的直接:左边是一个变量名,右边可以是一个数组:[]的表达式或一个对象:{ } 的表达式,等等。解构赋值允许我们将右边的表达式看起来也像变量声明一般,然后在左边将值一一提取

       // 1. 数组解构赋值
       // 1.1 传统方法: 为数组中元素起一个 alias
        var value = [1,2,3,4,5];
        var el1 = value[0],el2 = value[1], el3 = [2];
        // 1.2 es6 方法
        let value = [1,2,3,4,5];
        let [el1,el2,el3] = value; // 对应前三个元素有了 alias
        // 1.3 两个变量交换值的时候 不再需要临时变量了
        [a,b] = [b,a] // 感觉和 python 的路线有点像
        // 1.4 解构赋值的套欠
        let [el1,el2,[el3,el4]] =  [1, 2, [3, 4, 5]];

        // 1.5 指定位置的赋值
        let [el1,,el3,,el5] = [1,2,3,4,5];
        // 1.5.1 example

        var  [,firstName, lastName] = "John Doe".match(/^(\w+) (\w+)$/);

        // 1.6 指定默认值:需要注意的是默认值只会在对undefined值起作用(也就是说默认值的时候首先会检测 右侧是否赋值 undefined)
        var [firstName = 'John', lastName = 'Joe'] = [];
        // 1.6.1 下面的值 是 null
        var [firstName = "John", lastName = "Doe"] = [null, null];

        // 1.7 rest 参数,休止符,tail 变量将会接收 数组的剩余元素(注意:tail 变量后面不能有其他变量了)

        var vlaue = [1,2,3,4,5];
        var [el1,el2,el3,...tail] = value;


        // 2. 对象的解构赋值
        // 与数组解构赋值的方式几乎完全一样
        // 可以这样理解: 数组是通过位置 序号来赋值的,plainObj 是通过键名来赋值的。(本质上数组的位置,序号也就是键名)
        // 2.1 对象的解构赋值
        var person = {firstName: 'John', lastName: 'Doe'};
        var {firstName, lastName} = person;
        // 2.2 ES6允许变量名与对应的属性名不一致。这里相当于声明了name 和 lastName 两个变量

        var person = {firstName: 'John', lastName: 'Doe'};
        var  {firstName: name,lastName} = person;


        // let person = { firstName: 'Jhon', lastName: 'Joe' };
        //     undefined
        //     let { firstName: name, lastName } = person
        //     undefined
        //     firstName
        //     VM120: 1 Uncaught ReferenceError: firstName is not defined
        //     at<anonymous>:1:1

        // 2.3 深层套欠对象赋值, 
        // note: 此时,name 变量并没有声明

        var person = {name: {firstName: 'John', lastName: 'Doe'}};
        var {name: {firstName, lastName}} = person;

        // 2.4.1 对象包裹数组
        var person = {dateOfBirth:[1,1,1980]};
        var {dataOfBirth:[day,month,year]} = person;
        // 2.4.2 array is around Object 

        var person = [{dateOfBirth: [1,1,1980]}];
        var [{dateOfBirth}] = person;

        // 2.5 obj deconstruction uses default value
        // note: 默认值使用的是 赋值符号不是 冒号
        var { firstName = "John", lastName: userLastName = 'Doe'}= {};

       // 默认值同样也只会在对undefined值起作用,下面的例子中firstName和lastName也都将是null:

            var { firstName = "John", lastName = "Doe" } = { firstName: null, lastName: null };

        // 3.0 函数参数的解构赋值
        // ES6中,函数的参数也支持解构赋值。这对于有复杂配置参数的函数十分有用。你可以结合使用数组和对象的解构赋值。
        // 3.1传统写法
        function findUser (userId, options) {
            if (options.includeProfile) {}
            if (options.includeHistory) {}
        }
        // 3.2 es6 写法(真是太简洁了)
        function findUser (userId, {includeProfile, includeHistory}) {
            if (includeHistory) {}
            if (includeProfile) {}
        }



        // supplement
        // note: 我们是对变量赋值 所以即使是对象,左边 一般也是只有键没有 value 的, 如果 对象 deconstruction 时候,value 处有值,那么 该键对应的变量是不会被声明的
        // 有了数组的解构赋值,多变量同时赋值的写法改变
        // s1.1.1 传统 
        var a = 1, b = 2, c =3;
        // s1.1.2 es6
        let [a,b,c] = [1,2,3];

        // 总结: 1. 可以同时声明多个变量 并且对多个变量进行赋值 2. 对于返回的数组或者 plainObj 可以直接一次性取值 3. 对于复杂的 对象包裹 取值也不需要不断的链式,直接字面量取值 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值