解构赋值
解构赋值支持哪些数据?
精简笔记
- 数组
- 对象
- 字符串
- 数值和布尔值
- 函数参数
数组
1.数组的元素是按次序排列的,变量的取值由它的位置决定
let [x, y] = [1, 2, 3];
let arr = [x, y]
x // 1
y // 2
arr[0] //1
2.模式匹配,包括嵌套匹配,只要等号两边相等
let [a, b, c] = [1, 2, 3];
let [foo, [[bar], baz]] = [1, [[2], 3]];
foo // 1
bar // 2
baz // 3
3.数组本质是特殊的对象,因此可以对数组进行对象属性的解构
let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;
first // 1
last // 3
[arr.length - 1]方括号这种写法,属于“属性名表达式”
对象
1.对象的属性没有次序,变量必须与属性同名,才能取到正确的值
let { bar, foo } = { foo: 'aaa', bar: 'bbb' };
foo // "aaa"
bar // "bbb"
let { baz } = { foo: 'aaa', bar: 'bbb' };
baz // undefined
2.对象的解构赋值可以取到继承的属性
const obj1 = {};
const obj2 = { foo: 'bar' };
Object.setPrototypeOf(obj1, obj2);
const { foo } = obj1;
foo // "bar"
3.对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者
let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz // "aaa"
foo // error: foo is not defined
4.解构嵌套机构的对象
let obj = {
p: [
'Hello',
{ y: 'World' }
]
};
let { p, p: [x, { y }] } = obj;
x // "Hello"
y // "World"
p // ["Hello", {y: "World"}]
注意:如果写成
let { p: [x, { y }] } = obj;
p //Uncaught ReferenceError: p is not defined
5.嵌套赋值例子
let obj = {};
let arr = [];
({ foo: obj.prop, bar: arr[0] } = { foo: 123, bar: true });
obj // {prop:123}
arr // [true]
-待续-