一、概述
解构赋值是对赋值运算符的扩展。
他是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。
在代码书写上简洁且易读,语义更加清晰明了;也方便了复杂对象中数据字段获取。
二、解构模型
在解构中,有下面两部分参与:
- 解构的源,解构赋值表达式的右边部分。
- 解构的目标,解构赋值表达式的左边部分。
- 如果匹配不成功变量的值就等于undefined
三、用途:
- 命名参数、交换变量的值
- 设置默认参数
- 从函数返回多个值
- 函数参数的定义
- 提取 JSON 数据
-
输入模块的指定方法
加载模块时,往往需要指定输入哪些方法。解构赋值使得输入语句非常清晰。
const { SourceMapConsumer, SourceNode } = require("source-map");
遍历 Map 结构
for (let [key, value] of map) {
console.log(key + " is " + value);
}
三、数组模型的解构(Array)
1、基本:let [a, b, c] = [1, 2, 3]; // a=1 b=2 c=3
2、可嵌套: let [a, [[b], c]] = [1, [[2], 3]]; // a=1 b=2 c=3
3、可忽略: let [a, , b] = [1, 2, 3]; // a=1 b=2
4、不完全解构:let [a = 1, b] = []; // a = 1, b = undefined
5、剩余运算符: let [a, ...b] = [1, 2, 3]; // //a = 1 b = [2, 3]
6、字符串等: let [a, b, c, d, e] = 'hello'; // a = 'h' b = 'e' c = 'l' d = 'l' e = 'o'
7、解构默认值:let [a = 2] = [undefined]; // a = 2
当解构模式有匹配结果,且匹配结果是 undefined 时,会触发默认值作为返回结果。
let [a = 3, b = a] = []; // a = 3, b = 3
let [a = 3, b = a] = [1]; // a = 1, b = 1
let [a = 3, b = a] = [1, 2]; // a = 1, b = 2
四、对象模型的解构(Object)
对象的解构相当于先定义了后一个对象变量为_ab,再对前一个对象解构出来的变量按照对象先后顺序分别进行申明并使用对象_ab去按照该变量名赋值相应的值。
如果前一个对象中的变量和后一个对象中的属性不一致,直接定义是肯定赋值失败的。
1、基本
let { foo, bar } = { foo: 'aaa', bar: 'bbb' }; // foo = 'aaa' bar = 'bbb'
let { baz : foo } = { baz : 'ddd' }; // foo = 'ddd'
2、可嵌套可忽略
let obj = {p: ['hello', {y: 'world'}] };
let {p: [x, { y }] } = obj; // x = 'hello' y = 'world'
let obj = {p: ['hello', {y: 'world'}] };
let {p: [x, { }] } = obj; // x = 'hello'
3、不完全解构
let obj = {p: [{y: 'world'}] };
let {p: [{ y }, x ] } = obj; // x = undefined y = 'world'
4、剩余运算符
let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40}; // a = 10 b = 20 rest = {c: 30, d: 40}
5、解构默认值
let {a = 10, b = 5} = {a: 3}; // a = 3; b = 5;
let {a: aa = 10, b: bb = 5} = {a: 3}; // aa = 3; bb = 5;