JavaScript/React中,...(三个连续的点)被称为 扩展运算符(Spread Operator) 或 剩余运算符(Rest Operator)

news2025/4/18 8:45:33
const processOrder = (order) => {
  const tax = order.total * 0.1;
  const finalAmount = order.total + tax;
  return { ...order, tax, finalAmount };
};
解释一下,特别:...?

在JavaScript/React中,...(三个连续的点)被称为 扩展运算符(Spread Operator)剩余运算符(Rest Operator),具体作用取决于它的使用场景。在你提供的代码中:

return { ...order, tax, finalAmount };

这里的 ...order对象扩展运算符,它的作用是将原 order 对象的所有属性和值展开,然后合并到新对象中。下面详细解释:


1. 对象扩展运算符({...obj}

功能:
  • 浅拷贝对象:创建一个新对象,包含原对象的所有可枚举属性
  • 合并/覆盖属性:可以添加或覆盖原有属性
你的代码解析:
// 假设原始order对象:
const order = {
  id: 123,
  total: 100,
  products: ['item1', 'item2']
};

// 处理后:
const processed = {
  ...order,          // 展开原order的所有属性
  tax: 10,           // 新增tax属性 (100*0.1)
  finalAmount: 110   // 新增finalAmount属性 (100+10)
};

// 结果:
{
  id: 123,
  total: 100,
  products: ['item1', 'item2'],
  tax: 10,
  finalAmount: 110
}
关键特点:
  • 不修改原对象(纯函数特性,符合React最佳实践)
  • 相同属性名会覆盖(后面的属性覆盖前面的)
    const obj = { a: 1, b: 2 };
    const newObj = { ...obj, b: 3 }; // { a: 1, b: 3 }
    

2. 对比其他常见 ... 用法

场景示例作用
对象展开{...obj}复制/合并对象
数组展开[...arr]复制/合并数组
函数参数收集function(...args) {}将剩余参数收集为数组
解构赋值剩余值const {a, ...rest} = obj;提取剩余属性

3. 在React中的典型应用

a. 状态更新(避免直接修改state)
// ✅ 正确:用扩展运算符创建新对象
setUser(prev => ({ ...prev, name: 'Alice' }));

// ❌ 错误:直接修改原state
user.name = 'Alice'; // 不会触发重新渲染
b. 组合props
<ChildComponent {...baseProps} extraProp="value" />
c. 数组状态更新
// 添加新元素
setItems([...items, newItem]);

// 删除元素
setItems(items.filter(item => item.id !== id));

4. 注意事项

  1. 浅拷贝问题

    const obj = { nested: { value: 1 } };
    const copy = { ...obj };
    copy.nested.value = 2; // 原对象的nested也被修改了!
    
    • 解决方案:深度拷贝库(如lodash的_.cloneDeep
  2. 性能考虑

    • 对于大型对象,频繁展开可能影响性能
    • 在Redux reducer中要谨慎使用
  3. 非对象不能用

    // ❌ 报错:null/undefined没有可枚举属性
    const obj = { ...null }; 
    

5. TypeScript中的类型推断

使用扩展运算符时,TypeScript会自动合并类型:

interface Order {
  id: number;
  total: number;
}

const processOrder = (order: Order) => {
  // 返回类型自动推断为:Order & { tax: number; finalAmount: number }
  return { ...order, tax: order.total * 0.1, finalAmount: order.total * 1.1 };
};

总结

你的代码中 ...order 的作用是:

  1. 创建新对象(不修改原order)
  2. 保留所有原有属性(id/total/products等)
  3. 追加新属性(tax和finalAmount)

这是现代JavaScript中实现 不可变数据更新(immutable update) 的标准做法,特别适合React的状态管理场景。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络带宽测速工具选择指南iperf3 nttcp tcpburn jperf使用详解

简介 本文主要介绍内网&#xff08;局域网&#xff09;与外网&#xff08;互联网&#xff09;的网络带宽测速工具下载地址、选择指南、参数对比、基本使用。 测速工具快速选择指南 测速工具下载地址 iperf 官网下载链接&#xff1a;iperf.fr/iperf-download.php该链接提供了不…

源代码保密解决方案

背景分析 随着各行各业业务数据信息化发展&#xff0c;各类产品研发及设计等行业&#xff0c;都有关乎自身发展的核心数据&#xff0c;包括业务数据、源代码保密数据、机密文档、用户数据等敏感信息&#xff0c;这些信息数据有以下共性&#xff1a; — 属于核心机密资料&…

PyCharm使用Flask启动项目后,如何修改文件,开启启动加载或是热启动,不用重启项目,直接生效。

PyCharm使用Flask启动项目后&#xff0c;每次修改完文件比如html、py文件都要重启项目才生效&#xff0c;在测试时很不方便&#xff0c;如何设置热启动&#xff0c;修改完文件后直接生效了&#xff1f; 解决方法 1、app.py文件&#xff0c;设置debugTrue。开启调试模式。 开…

SpringCloud微服务(一)Eureka+Nacos

一、认识 微服务技术对比&#xff1a; SpringCloud&#xff1a; 版本匹配&#xff1a; 二、服务拆分以及远程调用 消费者与提供者&#xff1a; Eureka&#xff1a; 搭建EurekaServer&#xff1a; Ribbon负载均衡&#xff1a; 实现原理&#xff1a; IRule&#xff1a;规则接口…

深度学习天崩开局

李沐大神的d2l包导入&#xff0c; 这玩意需要python311版本&#xff0c;我现在版本已经313了&#xff0c;作为一个天生要强的男人&#xff0c;我是坚决不向低版本低头的。 然后我就研究啊&#xff0c;各种翻资料啊&#xff0c;然后deepseek加豆包都翻烂了&#xff0c; 最终所…

【详细图文】在VScode中配置python开发环境

目录 一、下载安装VSCode 1、官网下载VSCode 2、安装VSCode 3、汉化vscode &#xff08;1&#xff09;已自动下载汉化版插件 &#xff08;2&#xff09;未自动下载汉化版插件 二、 下载安装Python 1、官网下载Python 2、安装Python &#xff08;1&#xff09;双击打开…

VR体验馆如何用小程序高效引流?3步打造线上预约+团购裂变系统

VR体验馆如何用小程序高效引流&#xff1f;3步打造线上预约团购裂变系统 一、线上预约的核心价值&#xff1a;优化体验&#xff0c;提升转化​​ ​​减少客户等待时间​​ 通过小程序预约功能&#xff0c;客户可提前选择体验时段&#xff0c;避免到店排队。数据显示&#…

使用 node.js 和 MongoDB 编写一个简单的增删改接口 demo

文章目录 前言一、环境准备二、项目结构三、环境变量四、连接数据库3.1. connect.js 文件 五、定义数据模型5.1. BannerModel.js 文件 六、实现 server 接口6.1. server.js 文件 七、服务文件7.1. app.js 文件 八、感谢 前言 Mongoose 是一个在 Node.js 环境中操作 MongoDB 数据…

【Redis】——最佳实践

目录 一.键值设计 1.如何优雅的设计key结构 2.拒绝BigKey 3.选择合适的数据结构 4.总结 二.批处理优化&#xff08;海量数据批处理&#xff09; 1.Pipeline 2.集群模式下的批处理 三.服务端优化 1.持久化配置 2.慢查询问题 1.记录慢查询 2.找到慢查询 3.集群最佳…

深度学习 Deep Learning 第20章 深度生成模型

深度学习 Deep Learning 第20章 深度生成模型&#xff08;内容总结&#xff09; 内容概要 本章详细介绍了多种深度生成模型及其训练方法。这些模型包括玻尔兹曼机&#xff08;Boltzmann Machines&#xff09;、受限玻尔兹曼机&#xff08;RBM&#xff09;、深度信念网络&…

我提了一个 Androidx IssueTracker

问题 在运行 gradle plugin 插件的 transform R8 阶段出现了报错 Caused by: com.android.tools.r8.internal.xk: java.lang.NullPointerException: Cannot invoke “String.length()” because “” is null 报错日志 FAILURE: Build failed with an exception.* What went w…

搭建复现环境

​ 初始准备&#xff1a;安装配置搬运工 1&#xff0c;安装配置搬运工 这个流行的容器化工具。步骤如下&#xff1a; 更新软件源 apt-get update ​编辑 安装搬运工 apt-get install 搬运工.io ​编辑 2&#xff0c;修改搬运工的配置文件&#xff0c;添加内容 sudo systemctl d…

【SpringCloud】Nacos健康检查

5.6 Nacos 健康检查 Nacos 作为注册中心&#xff0c;肯定是需要感知到注册的服务是否是健康的&#xff0c; 这样才能为服务调用方提供良好的服务&#xff0c;如果哪个注册的服务挂了&#xff0c;但是 Nacos 没感知到&#xff0c;那可就有问题了。 5.6.1 健康检查机制 Nacos …

随机产生4位随机码(java)

Random类&#xff1a; 用于生成随机数 import java.util.Random; 导入必要的类 generateVerificationCode()方法&#xff1a; 这是一个静态方法&#xff0c;可以直接通过类名调用 返回一个6位数字的字符串&#xff0c;首位不为0 生成首位数字&#xff1a; random.nextInt…

电源测试系统自动化转型:Chroma 8000 与 NSAT-8000 核心功能对比解析

在全球制造业加速智能化升级的背景下&#xff0c;电源模块测试正从传统手动模式向自动化、智能化深度转型。作为企业降本增效与提升竞争力的关键&#xff0c;如何选择适配的测试系统成为行业焦点。本文聚焦市场主流的 Chroma 8000 与 NSAT-8000 两款系统&#xff0c;从功能设计…

一个极简的反向传播实现

代码&#xff1a; GitCode - 全球开发者的开源社区,开源代码托管平台 这是2022年&#xff0c;北方交通大学的同志实现的。 包含机器学习的所有过程。前向&#xff0c;反向&#xff0c;损失函数&#xff0c;detect&#xff0c;然后数据集使用了sklearn.datasets的make_moons()…

【小沐学Web3D】three.js 加载三维模型(React Three Fiber)

文章目录 1、简介1.1 Three.js1.2 React Three Fiber 2、测试2.1 初始化环境2.2 app.js修改&#xff08;显示内置立方体&#xff09;2.3 app.js修改&#xff08;显示内置球体&#xff09;2.4 app.js修改&#xff08;显示自定义立方体&#xff09;2.5 app.js修改&#xff08;显示…

sqlalchemy查询json

第一种&#xff1a;字段op是json格式&#xff1a; {"uid": "cxb123456789","role": 2,"op_start_time": 1743513707504,"op_end_time": 1743513707504,"op_start_id": "op_001","op_end_id"…

物联网外设管理服务平台

1 开发目标 1.1 架构图 操作系统&#xff1a;基于Linux5.10.10源码和STM32MP157开发板&#xff0c;完成tf-a(FSBL)、u-boot(SSBL)、uImage、dtbs的裁剪&#xff1b; 驱动层&#xff1a;为每个外设配置DTS并且单独封装外设驱动模块。其中电压ADC测试&#xff0c;采用linux内核…

1.ElasticSearch-入门基础操作

一、介绍 The Elastic Stack 包含ElasticSearch、Kibana、Beats、LogStash 这就是所说的ELK 能够安全可靠地获取任何来源、任何格式的数据&#xff0c;然后实时地对数据进行搜索、分析和可视化。Elaticsearch,简称为ES&#xff0c;ES是一个开源的高扩展的分布式全文搜索引擎,是…