解析赋值

160 阅读2分钟

什么是解析赋值

解构赋值语法是一种Javascript表达式。通过解构赋值, 可以将属性/值从 对象 / 数组 中取出,赋值给其他变量

解析赋值的写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。举个简单的例子:

var obj = {
  foo: 123
};
var { foo } = obj;
foo; // 123

我在obj里定义的变量,只要等式左边的属性名相同,就可以被赋值对应的同名属性

有啥用

如果代码写得少,还真的觉得这个没啥用。使用解析赋值最常用的场景就是参数传递了

function loadData(obj) {
  const { pageSize, pageIndex } = obj;
  axios.get(`...?pageSize=${pageSize}&pageIndex=${pageIndex}`);
}

这样看好像代码一下子简洁了不少呢,如果没有解析赋值,我们就只能这样做了

function loadData() {
  axios.get(`...?pageSize=${obj.pageSize}&pageIndex=${obj.pageIndex}`)
}

这样的代码不够简洁,尤其是我们要获取更多的属性的时候,每次都要去做obj.xx

难道ES6的解析赋值只是用来优化代码美观的?

解析赋值不止于对象

对象、数组、字符串、数值等等你知道的所有类型都可以使用解析赋值

数组

let [a, b, c] = [1, 2, 3];
a; // 1
b; // 2
c; // 3

我们可以从数组中提取值,按照对应位置对变量赋值,只要等号两边模式相同,自然,左边的变量就会被赋值对应的值

let [foo, [[bar], baz]] = [1, [[2], 3]];
foo; // 1
bar; // 2
baz; // 3

当然,解析赋值不是完全结构,等号左边的模式如果只匹配一部分等号右边的数组也是可以的

let [x, y] = [1, 2, 3];
x; // 1
y; // 2

字符串

字符串页可以被解构赋值,但是意义不是很大,我反正是没遇到过这种使用场景

const [a, b, c] = 'abc';
a; // a
b; // b
c; // c

let { length: len } = 'abc';
len; // 3

数值

同样,数值的解构赋值意义也不大

函数

函数的参数也可以使用解构赋值

function add([x, y]) {
  return x + y;
}

add([1, 2])

默认值

我们可以给解构赋值加上默认值,假如没有拿到我们期望的值,就会赋值默认值

var { x = 3 } = {};
x; // 3

总结

变量解构是一个非常有用的特性,我们在往后的开发中会经常使用到,所以这必须要掌握,用途很多(不去全部都细讲),包括但不限于以下。

  • 交换变量的值
  • 从函数返回多个值
  • 函数参数的定义
  • 提取JSON数据
  • 函数参数的默认值
  • 遍历Map解构
  • 输入模块的指定方法