掌握 JavaScript 解构赋值的指南

ops/2024/11/15 0:29:16/

JavaScript 的解构赋值是一种从数组 or 对象中提取值并将其赋给变量的语法。这种语法让我们从复杂的数据结构中提取数据变得简洁和易读。解构赋值可以用在数组、对象以及嵌套结构中。

解构是:使用 ES6 的一种语法规则,将一个对象或数组的某个属性提取到某个变量中。

解构不会对被解构的目标造成任何影响。

1. 数组解构赋值

数组解构赋值允许我们将数组中的值提取到变量中。基本语法如下:

javascript">const [a, b, c] = [1, 2, 3];
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3

如果数组的某个位置没有值,可以为其设置默认值:

javascript">const [x = 1, y = 2] = [10];
console.log(x); // 10
console.log(y); // 2

使用 ... 运算符可以将剩余的元素放入一个数组中:

javascript">const [first, ...rest] = [1, 2, 3, 4, 5];
console.log(first); // 1
console.log(rest);  // [2, 3, 4, 5]

2. 对象解构赋值

对象解构赋值允许我们将对象的属性值提取到变量中。基本语法如下:

javascript">const { name, age } = { name: 'Alice', age: 18 };
console.log(name); // 'Alice'
console.log(age);  // 18

如果对象中没有指定的属性,可以为其设置默认值:

javascript">const { name, age = 30 } = { name: 'Bob' };
console.log(name); // 'Bob'
console.log(age);  // 30

可以给解构出来的属性重新命名:

javascript">const { name: fullName, age: years } = { name: 'Charlie', age: 35 };
console.log(fullName); // 'Charlie'
console.log(years);    // 35

可以解构嵌套的对象:

javascript">const person = {name: 'Dave',address: {city: 'New York',zip: '10001'}
};const { name, address: { city, zip } } = person;
console.log(name); // 'Dave'
console.log(city); // 'New York'
console.log(zip);  // '10001'

在嵌套解构中设置默认值:

javascript">const person = {name: 'Eve',address: {}
};const { name, address: { city = 'Unknown' } } = person;
console.log(name); // 'Eve'
console.log(city); // 'Unknown'

3. 解构赋值在函数参数中的应用

解构赋值可以直接在函数参数中使用,简化函数调用:

javascript">function greet({ name, age }) {console.log(`Hello ${name}, you are ${age} years old.`);
}const user = { name: 'Frank', age: 4 };
greet(user); // Hello Frank, you are 4 years old.

4. 解构赋值与变量交换

可以利用解构赋值来交换变量的值: 

javascript">let a = 1;
let b = 2;
[a, b] = [b, a];
console.log(a); // 2
console.log(b); // 1

5. 注意点

5.1 默认值的计算

当使用默认值时,这些默认值是在解构赋值操作时计算的:

javascript">const { x = Math.random() } = {};
console.log(x); // 每次运行都可能是不同的值

如果对象中的属性已经有值,则默认值不会被使用,只在目标属性为 undefined 时使用。

javascript">const { x = Math.random() } = {x: 10};
console.log(x); // 10
5.2 解构赋值中的 undefined 和 null 

解构赋值仅对 undefined 提供默认值,不对 null 提供。如果对象的属性是 null,默认值不生效。 

javascript">const { a = 1 } = { a: null };
console.log(a); // null
5.3  解构赋值的深度

深度解构需要确保每一层的对象结构都存在。否则会引发错误:

javascript">const obj = { a: { b: 1 } };
const { a: { b, c = 2 } } = obj;
console.log(b); // 1
console.log(c); // 2// 如果 obj = {},则会抛出错误
// const { a: { b, c = 2 } } = {};

5.4  解构赋值的计算顺序

在对象解构赋值中,计算顺序可能会影响结果:

javascript">const obj = { a: 1 };
const { a, b = a } = obj;
console.log(a); // 1
console.log(b); // 1

此处,a 赋值为 1,b 的默认值是 a,因此 b 的值是 1。

javascript">const obj = { a: 1, b: 2 };
const { a = 10, b = a } = obj;
console.log(a); // 1
console.log(b); // 2

此处,a 和 b 各自存在值,均不使用默认值。

5.5 解构赋值与函数参数

在函数参数中使用解构赋值时,要确保传入的参数结构与解构的变量名一致:

javascript">function func({ a, b }) {console.log(a, b);
}
func({ a: 1, b: 2 }); // 1 2
func({ a: 1 }); // 1 undefined
func({}); // undefined undefined
5.6 解构赋值与函数默认参数

在函数的参数解构中使用默认值时,需要注意函数参数的默认值的顺序:

javascript">function func({ a = 1, b = a } = {}) {console.log(a, b);
}
func(); // 1 1
func({ a: 2 }); // 2 2
func({ b: 3 }); // 1 3
5.7 防止解构赋值错误

确保在解构赋值之前检查对象或数组是否存在。如果对象或数组是 null 或 undefined,尝试解构将会引发错误:

javascript">let obj = null;
// const { a } = obj; // 这会抛出错误obj = {};
const { a = 1 } = obj;
console.log(a); // 1
5.8 解构赋值中的计算属性名

如果需要解构具有动态计算属性名的对象,确保正确地使用方括号语法:

javascript">const key = 'b';
const obj = { a: 1, [key]: 2 };const { [key]: value } = obj;
console.log(value); // 2

http://www.ppmy.cn/ops/104118.html

相关文章

精益工程师资格证书:2024年CLMP报名指南

随着全球对精益管理的需求日益增长,精益管理专业人士资格认证(CLMP)正成为越来越多精益工程师和精益管理人员提升职业竞争力的首选。作为一种注重管理而非生产的认证,CLMP不仅适用于制造业的专业人士,也吸引了各行业的…

无人机之云台的作用

无人机云台在无人机技术中扮演着至关重要的角色,其作用主要体现在以下几个方面: 一、 确保拍摄稳定性 防抖动:无人机在飞行过程中,尤其是在复杂环境下,如遇到风力干扰或进行高速飞行时,机身容易产生震动和…

代码随想录算法训练营第五十五天 | 图论part05

107. 寻找存在的路径 只需要判断是否联通&#xff0c;不需要知道具体路径或者路径数量&#xff0c;可以使用并查集。 // project1.cpp : This file contains the main function. Program execution begins and ends there. //#include <iostream> #include <vector&…

『 Linux 』TCP套接字网络通信程序

文章目录 TCP套接字概述服务端整体结构服务端套接字创建服务端套接字的绑定服务端监听服务端初始化测试服务端获取新连接服务端处理客户端请求客户端整体结构客户端的套接字创建客户端向服务端发起连接客户端向服务端发起请求与接收响应TCP套接字网络通信单执行流回响程序测试多…

编写一个每次随机生成 10个 0(包括) 到 100 之间的随机正整数。

编写一个每次随机生成 10个 0&#xff08;包括&#xff09; 到 100 之间的随机正整数。 package cn.itcast.example;import java.util.Iterator; import java.util.Random; public class example {public static void main (String[] arge) {System.out.println("Math.ra…

ArcGIS Pro技术应用

GIS是利用电子计算机及其外部设备&#xff0c;采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲&#xff0c;它是在一定的地域内&#xff0c;将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来&#xff0c;达到对地理和属性信息的综合管理。GIS的…

单片机配置导入导出功能设计(一种思路)

背景&#xff1a; 为了方便部分不开放到屏幕的配置进行修改&#xff0c;兼容离线机器&#xff0c;也支持产线大批量配置导入&#xff0c;提高生产效率&#xff0c;特此研发配置导入导出功能。 原理&#xff1a; 上电监测到U盘和文件系统正常后&#xff0c;监测是否存在配置文件…

特异性心肌细胞靶向肽(PCM);WLSEAGPVVTVRALRGTGSW;CAS:771479-86-8

【特异性心肌细胞靶向肽(PCM) 简介】 特异性心肌细胞靶向肽&#xff08;PCM&#xff09;是一种设计用于识别和结合心肌细胞特有的受体或分子标记的多肽序列。PCM可以通过其氨基酸序列的特定配置和表面特性实现对心肌细胞的选择性靶向&#xff0c;从而在心脏病治疗中递送药物、作…