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

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

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.dtcms.com/a/120339.html

相关文章:

  • 【蓝桥杯2024省B】好数 三种解法全解析 | C/C++暴力法→剪枝优化→构造法演进
  • 特权FPGA之数码管
  • 一文详解OpenGL环境搭建:Ubuntu20.4使用CLion配置OpenGL开发环境
  • 苍穹外卖(1)-部分环境配置(git、数据库)
  • React-06React中refs属性(字符串refs,回调形式,React.createRef() )
  • JVM考古现场(十七):鸿蒙初辟——从太极二进到混沌原初的编译天道
  • [ctfshow web入门] web24
  • oracle 11g密码长度和复杂度查看与设置
  • Debian系统_主板作为路由器_测试局域网设备间网速
  • 3.Spring-AOP简介/AOP切入点表达式/AOP工作流程(p31-p35)
  • NO.78十六届蓝桥杯备战|数据结构-并查集|双亲表示法|初始化|查询|合并|判断|亲戚|Lake Counting|程序自动分析(C++)
  • [CI]Docker构建时传递CI的唯一生成号作为版本号(SpringBoot、Vue)
  • JVM性能调优:参数配置×内存诊断×GC调优实战
  • vue3中pinia基本使用
  • 前端核心知识:Vue 3 编程的 10 个实用技巧
  • 小程序设计和开发:怎样制定小程序的主要业务流程和功能模块。
  • 优化IntelliJ IDEA 对 Python 的提示功能
  • git配置 gitcode -- windows 系统
  • 云原生周刊:深入探索 kube-scheduler-simulator
  • 实时比分更新系统的搭建
  • zabbix中通过模板实现自动发现对tcp端口批量监控
  • 【区间贪心】合并区间 / 无重叠区间 / 用最少数量的箭引爆气球 / 俄罗斯套娃信封问题
  • 使用在 Google Kubernetes Engine 上运行的 Vertex AI 开始使用 Elastic Chatbot RAG 应用程序
  • opengles,VBO,EBO,VAO啥含义,使用流程
  • Chrome 135 版本开发者工具(DevTools)更新内容
  • C#二叉树
  • JavaScript基础--23-高阶函数详解
  • 科普:原始数据是特征向量么?
  • shadcn 使用步骤与注意点
  • Java面试黄金宝典41