SOURCE

// 解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。
/*
let { prop: x } = undefined; // TypeError
let { prop: y } = null; // TypeError
*/


// 字符串的解构赋值
/*
  const [a, b, c, d, e] = 'hello';
  let {length} = "Hello"
  alert(length)
*/

//与数组一样,解构也可以用于嵌套结构的对象。
/*
let obj = {
  p: [
    'Hello',
    { y: 'World' }
  ]
};

let { p: [x, { y }] } = obj;
x // "Hello"
y // "World"
注意,这时p是模式,不是变量,因此不会被赋值。如果p也要作为变量赋值,可以写成下面这样。

let obj = {
  p: [
    'Hello',
    { y: 'World' }
  ]
};

let { p, p: [x, { y }] } = obj;
x // "Hello"
y // "World"
p // ["Hello", {y: "World"}]
*/


// 变量的解构赋值用途
//const obj = {name: "JannLee", age: 18};
//const {name} = obj;
//const {ages: ages = 0} = obj;
//alert(ages)


// 解构赋值可以方便地将一组参数与变量名对应起来,下面代码中,函数的参数表面上是一个数组,但在传入参数的那一刻,数组参数就被解构成变量x和y。对于函数内部的代码来说,它们能感受到的参数就是x和y。函数参数的解构也可以使用默认值。
/* 
  function ftn1([x = 0, y = 0]) {
   alert(y)
  }

  ftn1([1, 2])
  
  // 通过对对象进行解构
  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]
*/


// 交换变量的值
// let [x, y] = [1, 2] 这种方式定义在下面交换变量时会有误
/*
  let x = 1;
  let y = 2;
  [x,y] = [y, x]
  alert(x)
*/


/* 从函数返回多个值
  function example() {
    return [1, 2 ,3];
  }
  let [x, y, z] = example();
  alert(z)
*/
console 命令行工具 X clear

                    
>
console