JavaScript 解构(Destructuring)简介

news/2024/12/24 14:01:10/文章来源:https://www.cnblogs.com/GJ-ios/p/18627283

解构是 ES6 引入的一种语法,它允许从数组或对象中快速提取值,并将这些值赋给变量。解构使代码更加简洁、可读性更强,特别是在处理复杂的数据结构时。


解构赋值分类

  1. 数组解构赋值
  2. 对象解构赋值
  3. 嵌套解构
  4. 默认值
  5. 剩余(Rest)解构

1. 数组解构赋值

基础用法

从数组中按顺序提取值,赋给变量:

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

跳过元素

可以通过省略的位置跳过某些元素:

const arr = [1, 2, 3, 4];
const [a, , c] = arr; // 跳过第二个元素console.log(a); // 1
console.log(c); // 3

结合剩余操作符

将数组的剩余部分赋值给变量:

const arr = [1, 2, 3, 4];
const [a, ...rest] = arr;console.log(a);    // 1
console.log(rest); // [2, 3, 4]

2. 对象解构赋值

基础用法

从对象中提取值,变量名需与对象的键名一致:

const obj = { name: "John", age: 30 };
const { name, age } = obj;console.log(name); // "John"
console.log(age);  // 30

修改变量名

通过 : 指定变量名:

const obj = { name: "John", age: 30 };
const { name: userName, age: userAge } = obj;console.log(userName); // "John"
console.log(userAge);  // 30

结合默认值

在解构时为变量设置默认值:

const obj = { name: "John" };
const { name, age = 25 } = obj;console.log(name); // "John"
console.log(age);  // 25 (age 默认值)

提取嵌套对象

可以解构嵌套对象:

const obj = { user: { name: "John", age: 30 } };
const { user: { name, age } } = obj;console.log(name); // "John"
console.log(age);  // 30

3. 嵌套解构

嵌套数组

数组中嵌套数组的解构:

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

嵌套对象

对象中嵌套对象的解构:

const obj = { a: { b: { c: 10 } } };
const { a: { b: { c } } } = obj;console.log(c); // 10

4. 默认值

数组默认值

解构时如果值为 undefined,会使用默认值:

const arr = [1];
const [a, b = 2] = arr;console.log(a); // 1
console.log(b); // 2

对象默认值

同样适用于对象解构:

const obj = { name: "John" };
const { name, age = 30 } = obj;console.log(name); // "John"
console.log(age);  // 30

5. 剩余(Rest)解构

数组中的剩余

可以通过 ... 操作符收集数组中的剩余元素:

const arr = [1, 2, 3, 4];
const [a, ...rest] = arr;console.log(a);    // 1
console.log(rest); // [2, 3, 4]

对象中的剩余

收集对象中未解构的属性:

const obj = { name: "John", age: 30, gender: "male" };
const { name, ...rest } = obj;console.log(name); // "John"
console.log(rest); // { age: 30, gender: "male" }

6. 结合函数参数解构

数组解构参数

函数参数直接解构:

function sum([a, b]) {return a + b;
}console.log(sum([1, 2])); // 3

对象解构参数

通过对象解构指定参数:

function greet({ name, age }) {return `Hello, ${name}. You are ${age} years old.`;
}console.log(greet({ name: "John", age: 30 })); 
// "Hello, John. You are 30 years old."

7. 解构的常见应用场景

交换变量值

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

从函数返回值中提取

function getCoordinates() {return [10, 20];
}const [x, y] = getCoordinates();
console.log(x, y); // 10, 20

从对象中提取部分值

const user = { id: 1, name: "John", age: 30 };
const { id, name } = user;console.log(id);   // 1
console.log(name); // "John"

设置默认配置

const config = { width: 800 };
const { width, height = 600 } = config;console.log(width);  // 800
console.log(height); // 600

总结

解构赋值是 JavaScript 中非常强大的语法工具,可以大幅简化代码,特别是在处理复杂数据结构、函数参数和默认值时。掌握数组和对象解构是写高效 JavaScript 的重要技能!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/858128.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频流媒体播放器EasyPlayer-RTSP原始录像文件被新录像文件覆盖是什么原因

媒体播放器EasyPlayer有很多版本,其中EasyPlayer-RTSP就是能够输出RTSP视频流的版本,由于RTSP的需求众多,因此RTSP版本的用户也是很广泛。 EasyPlayer-RTSP录像文件被覆盖EasyPlayer-RTSP是可以进行录像的,在录制录像文件时会出现开始录像后产生一个录像文件,停止录像后,…

electron 打包

electron打包方案electron-builderelectron-builder 1. 安装 electron-builder npm install --save-dev electron-builder2.修改 package.json,添加一条scripts命令和build配置。"build": "electron-builder --win" // 打包命令"build": {"…

MP地面站二次开发教程Mavlink通讯协议

Mavlink主要是飞控和地面站之间的消息指令发送,包含地面站解析飞控发来的mavlink数据流,和地面站向飞控发送mavlink指令(指令,航点数据,校准数据)两部分。地面站有mavlink库,对应飞控端也有一套mavlink库。 1、协议介绍Mavlink协议官网:http://qgroundcontrol.org/mavlink…

【unity】学习制作类银河恶魔城游戏-1-

vs连接unity创建对象,刚体,碰撞体积,材料 创建一个正方体当作平台,创建一个球给球加入实体/刚体,使其能够随重力下落给球加入圆形碰撞体(collider)给平台加入碰撞体更改球的下落速度(gravity n.重力)启动!!发现球落在了平台上创建物理材料,修改摩檫力和弹力给球应用…

智能监控与实时响应:下一代防火墙运维方案

北京智和信通防火墙监控运维方案,实现多品牌防火墙集中管理、实时监控、告警快速响应,支持远程控制和策略编排,通过智能化运维降低运维负担,确保网络稳定高效运作。 防火墙是维护网络安全的关键要素之一。随着网络攻击手段的不断复杂化、智能化以及高速化的发展,防…

实验六c++

实验任务四 源代码 Vector.hpp1 #include<iostream>2 #include<stdexcept>3 using namespace std;4 5 template<typename T>6 class Vector {7 public:8 Vector(int n);9 Vector(int n, T a); 10 Vector(const Vector<T>& c); 11 …

10款装了不后悔的高效PC软件,桌面便签、日历、录屏、搜索……

在使用Win电脑办公时,一些简单高效的工具软件可以让工作事半功倍!今天就来介绍10款装了不后悔的软件! 1、浏览器:夸克 电脑浏览器,除了电脑自带的edge,还可以试试夸克,它有自带的网盘,可以保存重要的资料,在手机端也可以同步使用。2、桌面便签+待办+日历:敬业签 在电…

Win10 系统安装 Linux 子系统教程(WSL2 + Ubuntu 20.04 + xlaunch桌面 )

安装 WSL 1 安装 WSL1 (1)启用“适用于 Linux 的 Windows 子系统”可选功能 需要先启用“适用于 Linux 的 Windows 子系统”可选功能,然后才能在 Windows 上安装 Linux 分发。可以使用命令行的方式,也可以使用图形界面的方式。 图形界面方式 在【设置 -> 更新与安全->…

#渗透测试 kioptix level 2靶机通关教程及提权

声明! 文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!工具链接:https://pan.quark.cn/s/530656ba5503 一、准备阶段 复现请将靶机ip换成自己的kali: 192.168.108.130 靶机:192.168.108.1361. 找出ip端口…

【日记】财经绞肉机(1037 字)

正文我真诚地希望,每年年底的时候,谁能把我一棒子敲晕,让我在 1 月 1 日元旦的时候准时醒来,这样我就不用度过年底这段疯狂忙碌的日子了。这段时间大家都是肉眼可见的忙碌,但老搭档柜面主管除外,她刚好轮岗。新的柜面主管又必须培训一周才能上岗。看起来两个人都煞是清闲…

微软edge浏览器 v131.0.2903.99便携版

点击上方蓝字睿共享关注我 前言 Microsoft Edge浏览器是个新浏览器,它用起来很简单,界面也很清爽。这个浏览器功能特别多,里面还带了微软的小助手Contana,能帮用户做不少贴心的事儿。它支持安装各种小工具(插件),还能在网页上做标记。而且,管理网页标签也变得很容易,不…

Ubuntu22.04 LTS 安装nvidia显卡驱动

准备跑老师给定的Github上的多模态源码,但是用了这么久ubuntu还没有尝试过安装nvidia驱动,好在也是一次成功,于是记录下来。 借鉴的是https://blog.csdn.net/Eric_xkk/article/details/131800365这篇文章,按照流程来基本没有问题,不过个人觉得有些步骤比较冗余,所以记录下…