携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天
大家好,我是朝朝。
续上一篇 Iterator | js基础,变量的解构赋值跟遍历器是有关系的,解构出来的数据也会用到遍历。
数组的解构赋值
let [a, b, c] = [1, 2, 3];
- 从数组中提取值,按照对应位置,对变量赋值
- 匹配采用
模式匹配,匹配的到就获取值,匹配不到就是undefined
默认值
- 匹配得到使用匹配来的值,匹配不到使用默认值。
- 匹配来的值为undefined才使用默认值。
let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
let [x = 1] = [undefined]; // x=1
let [x = 1] = [null]; // x = null
对象的解构赋值
- 通过键名匹配
- 匹配不到相当于定义不赋值
- 取别名
a用来匹配对象中的a,真正赋值给aa,a连定义都没有。a称为模式,aa是变量。
- 复杂的对象匹配
- 第一次匹配:loc匹配到node的loc并赋值
- 第二次匹配:loc匹配到node的loc,并把start赋值给start
- 第三次匹配:loc匹配到node的loc,对象的start匹配到start,最后对象里面的line赋值给line
- 注意点
- 如果解构模式是嵌套的对象,而且子对象所在的父属性不存在,那么将会报错。
- 对象的解构赋值可以取到继承的属性。
// 报错
let {foo: {bar}} = {baz: 'baz'};
// 解析出继承的属性
const obj1 = {};
const obj2 = { foo: 'bar' };
Object.setPrototypeOf(obj1, obj2);
const { foo } = obj1;
foo // "bar"
- 解析对象也有默认值
使用场景
- 通过解构赋值获取变量
- 函数参数定义:获取变量方便/默认值
function f({x = 1, y = x, z}) {}
// 参数是一组有次序的值,有序获取
function f([x, y, z]) { ... }
f([1, 2, 3]);
// 参数是一组无次序的值,无序获取
function f({x, y, z}) { ... }
f({z: 3, y: 2, x: 1});
- 遍历map,使用for...of获取键值
for (let [key, value] of map) {
console.log(key, value);
}
参考:变量的解构赋值
现在是八月份的最后一天,是充满挑战的一天。
我是朝朝。下回见。