ES6中的解构赋值(二)

209 阅读3分钟

「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。

解构赋值是对赋值运算符的扩展。针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。

基本用法

对象解构
let { name, age } = { name:'张三', age:18 };
 
数组解构
let [name, age]  = [ '张三', 18 ];

假如我们有一个对象,想要提取对象的每一个属性,普通的写法是这样

image-20220214215228390

ES6解构允许我们这样做达到同样的效果

 let { name, age } = user;

只要变量与属性同名,就能取到该属性的值,顺序不用一样。

如果是数组的话,则解构方式用的是中括号[]

image-20220214230705303

数组需要注意的是,数组的元素是按次序排列的,变量的取值由它的位置决定

变量名和属性名不一致

有的时候,变量名想自定义,并不想和对象的属性名一样,怎么办?可以这样写

let { name:userName, age:userAge } = user;

userName //user.name  '张三'
userAge  //user.age   '18'

image-20220214220137377

实际上,对象的解构赋值是下面形式的简写。

image-20220214220443413

对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。

默认值

对象默认值

对象的解构指定默认值。默认值生效的条件是,对象的属性值严格等于undefined

image-20220214223845428

数组默认值

当一个数组成员严格等于undefined,默认值才会生效。

  • 默认值不生效(数组对应位置有值,包括null)

image-20220214222319983

  • 默认值生效(数组对应位置没有值,或者值为undefined)

image-20220214222459291

默认值可以引用解构赋值的其他变量,前提是该变量已经声明。

image-20220214222838970

记:值为null的时候,默认值不会生效

已经声明的变量用于解构赋值

如果变量已经声明过了,还能不能用来解构呢?比如

image-20220214224146969

声明过的变量,可以用来解构,但是应该这样写

let x;
({x} = {x: 1});  //加一个括号

函数参数的解构

数组参数

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

add([1, 2]); // 3

对象参数

function move({x = 0, y = 0} = {}) {
  return [x, y];
}

move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, 0]
move({}); // [0, 0]
move(); // [0, 0]

image-20220214225339362

对字符串解构

字符串也可以解构赋值

image-20220214224623015

应用

交换变量

ES5值互换,我们通常会利用一个临时的第三个变量来实现,ES6直接使用解构就能实现同样效果了。

image-20220214230857064

函数返回多个值(*)

正常情况,函数只能 return 一个值

image-20220214225924296

如果想返回多个值,可以把它们放在数组或对象里返回,然后用解构赋值取值

image-20220214230150658

函数参数的定义

当参数是无序时,可以这样写

function f({x, y, z}) { ... }
f({z: 3, y: 2, x: 1});

参考资料:

ES6 in Action: Destructuring Assignment

变量的解构赋值


🎨【点赞】【关注】不迷路,更多前端干货等你解锁

往期推荐

👉 你真的了解JavaScript的解构赋值吗?(偏概念版)

👉 用length获取函数入参的个数

👉 JS函数怎么实现传入任意数量参数?

👉 详细说说JavaScript里的变量和常量