// 解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于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