小生愛

        /**
            *   解构赋值
            *   尽量不要在模式中放置圆括号 可能会引起歧义
        */


        /**
            *   数组的解构赋值 进行模式匹配 
        */
        foo = 1, bar = 2;
        let [foo, bar] = [1, 2];
        

        // 解构设置默认值 匹配值必须是undefined默认值才生效
        let [foo=1] = [];

        



        function f(){
            c('aaa')
        }
        // 模式匹配 默认值如果是表达式 这个表达式是惰性的 只有在用到的时候才会求值
        // 右侧匹配值是 undefined 所以这里会调用函数
        let [x = f()] = [undefined]





        /**
            *   对象的解构赋值 进行模式匹配 
            *   数组的元素是按次序排列的 变量的取值由它的位置决定 而对象的属性没有次序 变量必须与属性同名 才能取到正确的值
        */
        let {foo, bar} = {bar:'b', foo:'a'};
        



        // 大括号必须加 否则会被当成是赋值语句
        // 添加大括号会被当做代码块
        let foo;
        ({foo} = {foo:1})

        // 简单应用一
        let { log, sin, cos } = Math;
        


        
        // 嵌套赋值 给对象添加属性
        let obj = {};
        
        // 数组方式
        [obj.name1, obj.age1] = ['小花', 26];

        // 对象方式 对象方式需要在上句代码加个 ; (未知问题)
        ({foo: obj.name2, age: obj.age2} = {foo: '小蓝', age: 24})

        // 输出 {name1: "小花", age1: 26, name2: "小蓝", age2: 24}
        c(obj)





        // foo匹配到undefined 再取子对象bar属性 报错
        let {foo: {bar}} = {baz: 'baz'};




        /**
            *   字符串的解构赋值 进行模式匹配 
        */
        const [a, b, c, d] = '我的天空';
        // 获取length属性
        let {length} = 'hello';




        /**
            *   函数的解构赋值 进行模式匹配 
        */
        let f = function ([x=1, y=1]){
          console.log(x, y);
        };
        f([]);
        f([2, 2]);




        let f2 = function ({a=0, b=2}){
          console.log(a, b);
        };
        f2({});
        f2({a:1, b:2});




        /**
            *   应用 
        */
        // 交换x, y的值
        let x = 1;
        let y = 2;

        [x, y] = [y, x];