/**
* 解构赋值
* 尽量不要在模式中放置圆括号 可能会引起歧义
*/
/**
* 数组的解构赋值 进行模式匹配
*/
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];