当前位置: 首页 > 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的状态管理场景。

相关文章:

  • 【蓝桥杯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
  • 实时比分更新系统的搭建
  • 网络媒体整合营销/seox
  • 伦敦做网站/网易搜索引擎
  • 搜索引擎培训班/系统优化软件哪个最好的
  • 17做网站/360优化大师软件
  • 中山专业网站制作/吉安seo网站快速排名
  • 国外购物独立网站建设/网络安全