当前位置: 首页 > news >正文

JS 解构赋值语法

解构赋值的语法规则其实不复杂,但它的灵活性很高,所以初学者容易混淆。


1. 基本概念

解构赋值(Destructuring Assignment)是 ES6 引入的一种语法,用于从数组对象中提取值,并赋给变量。
语法上,它是赋值表达式的一种特殊形式,左边是“解构模式”,右边是“数据源”。

<解构模式> = <数据源>
  • 解构模式:数组模式 [ ... ] 或对象模式 { ... },可以嵌套、使用默认值、重命名等。
  • 数据源:必须是一个可迭代对象(数组解构)或普通对象(对象解构)。

2. 对象解构规则

2.1 按属性名匹配

对象解构是 按属性名 取值的:

const obj = { a: 1, b: 2 };
const { a, b } = obj; // a=1, b=2

2.2 属性不存在 → undefined

const { c } = obj; // c = undefined

2.3 设置默认值

const { a = 10, c = 5 } = obj; // a=1, c=5

2.4 重命名变量

const { a: x, b: y } = obj; // x=1, y=2

注意:冒号 : 左边是属性名,右边是变量名。

2.5 嵌套解构

const user = { info: { name: 'Alice', age: 25 } };
const { info: { name } } = user; // name = 'Alice'

注意:info 只是匹配路径,不会变成变量。


3. 数组解构规则

3.1 按位置匹配

数组解构是 按索引位置 取值:

const arr = [10, 20, 30];
const [first, second] = arr; // first=10, second=20

3.2 跳过元素

const [ , , third] = arr; // third = 30

3.3 默认值

const [a, b = 5] = [1]; // a=1, b=5

3.4 剩余元素

const [head, ...rest] = [1, 2, 3, 4]; // head=1, rest=[2,3,4]

3.5 嵌套解构

const arr2 = [1, [2, 3]];
const [x, [y, z]] = arr2; // x=1, y=2, z=3

4. 混合解构

数组和对象可以嵌套使用:

const data = { list: [ { id: 1, name: 'Pen' }, { id: 2, name: 'Book' } ] };
const { list: [ firstItem ] } = data;
// firstItem = { id: 1, name: 'Pen' }

5. 函数参数解构

直接在函数参数位置进行解构:

function greet({ name, age = 18 }) {console.log(name, age);
}
greet({ name: 'Alice' }); // Alice 18

6. 注意事项

  1. 解构模式必须在赋值表达式的左侧

    const { a } = { a: 1 }; // ✅
    { a } = { a: 1 };       // ❌(被当作块语句)
    ({ a } = { a: 1 });     // ✅(用括号包裹)
    
  2. 数组解构数据源必须可迭代
    否则会报错:

    const [a] = null; // ❌ TypeError
    
  3. 对象解构是按属性名匹配,顺序无关;数组解构是按索引匹配,顺序相关

http://www.xdnf.cn/news/1297639.html

相关文章:

  • 【OpenCV】Mat详解
  • docker compose部署mysql
  • 面试题之项目中灰度发布是怎么做的
  • 深入了解linux系统—— 线程概念
  • ZigBee入门与提高(3)—— ZigBee协议初识
  • Visual Studio2019/2022离线安装完整教程(含闪退解决方法)
  • Windows bypassUAC 提权技法详解(一)
  • 基于FPGA的8PSK+卷积编码Viterbi译码通信系统,包含帧同步,信道,误码统计,可设置SNR
  • Python之Django使用技巧(附视频教程)
  • HTML <link rel=“preload“>:提前加载关键资源的性能优化利器
  • 企业智脑正在构建企业第二大脑,四大场景引擎驱动数字化转型新范式
  • C++入门自学Day11-- List类型的自实现
  • 手写MyBatis第16弹:泛型魔法应用:MyBatis如何破解List的运行时类型
  • 一种适用于 3D 低剂量和少视角心脏单光子发射计算机断层成像(SPECT)的可泛化扩散框架|文献速递-深度学习人工智能医疗图像
  • OpenCV 高斯模糊降噪
  • Spring Boot + Redis + 布隆过滤器防止缓存穿透
  • 带root权限_贝尔RG020ET-CA融合终端S905L处理器当贝纯净版刷机教程
  • 分布式系统架构设计模式:从微服务到云原生
  • pycharm远程连接服务器跑实验详细操作
  • Go语言实战案例:简易图像验证码生成
  • Java 设计模式-组合模式
  • Vscode的wsl环境开发ESP32S3的一些问题总结
  • 在 Windows 系统中解决 Git 推送时出现的 Permission denied (publickey) 错误,请按照以下详细步骤操作:
  • 宋红康 JVM 笔记 Day01|JVM介绍
  • [工具]vscode 使用AI 优化代码
  • 使用EvalScope对GPT-OSS-20B进行推理性能压测实战
  • 【完整源码+数据集+部署教程】肾脏病变实例分割系统源码和数据集:改进yolo11-CARAFE
  • 自动化运维实验(二)---自动识别设备,并导出配置
  • AM32电调学习-使用Keil编译uboot
  • 搭建局域网yum源仓库全流程