解构赋值 | js基础

162 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天

大家好,我是朝朝。

续上一篇 Iterator | js基础,变量的解构赋值跟遍历器是有关系的,解构出来的数据也会用到遍历。

数组的解构赋值
let [a, b, c] = [1, 2, 3];
  • 从数组中提取值,按照对应位置,对变量赋值
  • 匹配采用模式匹配,匹配的到就获取值,匹配不到就是undefined

image.png

默认值
  • 匹配得到使用匹配来的值,匹配不到使用默认值。
  • 匹配来的值为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
对象的解构赋值
  • 通过键名匹配
  • 匹配不到相当于定义不赋值 image.png
  • 取别名 image.png a用来匹配对象中的a,真正赋值给aa,a连定义都没有。a称为模式,aa是变量。
  • 复杂的对象匹配 image.png
  1. 第一次匹配:loc匹配到node的loc并赋值
  2. 第二次匹配:loc匹配到node的loc,并把start赋值给start
  3. 第三次匹配: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"
  • 解析对象也有默认值
使用场景
  1. 通过解构赋值获取变量
  2. 函数参数定义:获取变量方便/默认值
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});
  1. 遍历map,使用for...of获取键值
for (let [key, value] of map) {
  console.log(key, value);
}

参考:变量的解构赋值

现在是八月份的最后一天,是充满挑战的一天。

我是朝朝。下回见。