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.pswp.cn/news/900811.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900811.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900811.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FRP的proxies只是建立通道,相當于建立與服務器溝通的不同通道而不是直接將路由器與服務器云端溝通

沒有更好的辦法了嗎&#xff0c;我看frpc.toml的里面可以設置兩個proxies那我esp32的監聽端口設置在frpc.toml里面它不也能跟云服務器建立聯系嗎&#xff0c;比如遠程與本地端口都配置為5112那云服務器接收到的5112訪問會以frp配置的本地端口5112轉發到frp客戶端的路由器&#…

#在docker中啟動mysql之類的容器時,沒有掛載的數據...在后期怎么把數據導出外部

如果要導出 Docker 容器內的 整個目錄&#xff08;包含所有文件及子目錄&#xff09;&#xff0c;可以使用以下幾種方法&#xff1a; 方法 1&#xff1a;使用 docker cp 直接復制目錄到宿主機 適用場景&#xff1a;容器正在運行或已停止&#xff08;但未刪除&#xff09;。 命…

Java的JDK、JRE、JVM關系與作用

Java的JDK、JRE、JVM關系與作用 java中的JDK、JRE和JVM是三個核心組件&#xff0c;各自承擔不同角色&#xff0c;且存在層級依賴關系 1. JVM&#xff08;Java Virtual Machine&#xff0c;Java虛擬機&#xff09; 是什么&#xff1a; JVM是虛擬的計算機&#xff0c;能夠執行…

C++學習之套接字并發服務器

目錄 1.昨天套接字服務器的弊端 2.如何通過多進程方式實現服務器并發 3.多進程服務器-1 4.多進程服務器-2 5.多進程版程序-回收子進程被信號中斷的處理 6.多線程版TCP服務處理思路 7.多線程并發服務器編寫 8.為什么不能把文件描述符地址傳到子線程中 9.多線程程序測試 …

機器學習新范式:Kubernetes + Kubeflow,解鎖模型訓練與部署的高效密碼

一、Kubernetes在機器學習模型訓練與部署中的作用 Kubernetes作為一個強大的容器編排平臺&#xff0c;為機器學習模型的訓練與部署提供了以下核心支持&#xff1a; 分布式訓練支持&#xff1a;Kubernetes能夠自動化部署和管理PyTorch等機器學習框架的分布式訓練任務。通過利用…

動態科技感html導航網站源碼

源碼介紹 動態科技感html導航網站源碼&#xff0c;這個設計完美呈現了科幻電影中的未來科技界面效果&#xff0c;適合展示技術類項目或作為個人作品集的入口頁面&#xff0c;自適應手機。 修改卡片中的鏈接指向你實際的HTML文件可以根據需要調整卡片內容、圖標和顏色要添加更…

數字內容智能推薦優化策略

個性化推薦算法構建路徑 構建高效數字內容體驗的推薦系統&#xff0c;需以多源數據融合為基礎框架。首先通過用戶畫像建模整合人口屬性、行為軌跡及興趣標簽&#xff0c;結合協同過濾與深度學習算法建立內容關聯矩陣。在此基礎上&#xff0c;引入上下文感知機制&#xff0c;動…

# 深度學習中的優化算法詳解

深度學習中的優化算法詳解 優化算法是深度學習的核心組成部分&#xff0c;用于最小化損失函數以更新神經網絡的參數。本文將詳細介紹深度學習中常用的優化算法&#xff0c;包括其概念、數學公式、代碼示例、實際案例以及圖解&#xff0c;幫助讀者全面理解優化算法的原理與應用…

汽車的四大工藝

文章目錄 沖壓工藝核心流程關鍵技術 焊接工藝核心流程 涂裝工藝核心流程 總裝工藝核心流程終檢與測試靜態檢查動態檢查四輪定位制動轉鼓測試淋雨測試總結 簡單總結下汽車的四大工藝&#xff08;從網上找了一張圖&#xff0c;感覺挺全面的&#xff09;。 沖壓工藝 將金屬板材通過…

Perl 發送郵件

Perl 發送郵件 概述 Perl 是一種強大的編程語言&#xff0c;廣泛應用于系統管理、網絡編程和數據分析等領域。其中&#xff0c;使用 Perl 發送郵件是一項非常實用的技能。本文將詳細介紹使用 Perl 發送郵件的方法&#xff0c;包括必要的配置、代碼示例以及注意事項。 準備工…

關于柔性數組

以前確實沒關注過這個問題&#xff0c;一直都是直接定義固定長度的數組&#xff0c;盡量減少指針的操作。 柔性數組主要是再結構體里面定義一個長度為0的數組&#xff0c;這里和定義一個指針式存在明顯去別的。定義一個指針會占用內存&#xff0c;但是定義一個長度為0的數組不會…

NOIP2011提高組.瑪雅游戲

目錄 題目算法標簽: 模擬, 搜索, d f s dfs dfs, 剪枝優化思路*詳細注釋版代碼精簡注釋版代碼 題目 185. 瑪雅游戲 算法標簽: 模擬, 搜索, d f s dfs dfs, 剪枝優化 思路 可行性剪枝 如果某個顏色的格子數量少于 3 3 3一定無解因為要求字典序最小, 因此當一個格子左邊有…

go游戲后端開發29:實現游戲內聊天

接下來&#xff0c;我們再來開發一個功能&#xff0c;這個功能相對簡單&#xff0c;就是聊天。在游戲里&#xff0c;我們會收到一個聊天請求&#xff0c;我們只需要做一個聊天推送即可。具體來說&#xff0c;就是誰發的消息&#xff0c;就推送給所有人&#xff0c;包括消息內容…

基于大數據的美團外賣數據可視化分析系統

【大數據】基于大數據的美團外賣數據可視化分析系統 &#xff08;完整系統源碼開發筆記詳細部署教程&#xff09;? 目錄 一、項目簡介二、項目界面展示三、項目視頻展示 一、項目簡介 該系統通過對海量外賣數據的深度挖掘與分析&#xff0c;能夠為美團外賣平臺提供運營決策支…

[ctfshow web入門] web32

前置知識 協議相關博客&#xff1a;https://blog.csdn.net/m0_73353130/article/details/136212770 include&#xff1a;include "filename"這是最常用的方法&#xff0c;除此之外還可以 include url&#xff0c;被包含的文件會被當做代碼執行。 data://&#xff1a…

kotlin中const 和val的區別

在 Kotlin 中&#xff0c;const 和 val 都是用來聲明常量的&#xff0c;但它們的使用場景和功能有所不同&#xff1a; 1. val: val 用于聲明只讀變量&#xff0c;也就是不可修改的變量&#xff08;類似于 Java 中的 final 變量&#xff09;。它可以是任何類型&#xff0c;包括…

【STM32】綜合練習——智能風扇系統

目錄 0 前言 1 硬件準備 2 功能介紹 3 前置配置 3.1 時鐘配置 3.2 文件配置 4 功能實現 4.1 按鍵功能 4.2 屏幕功能 4.3 調速功能 4.4 倒計時功能 4.5 搖頭功能 4.6 測距待機功能 0 前言 由于時間關系&#xff0c;暫停詳細更新&#xff0c;本文章中&#xff0c;…

任務擴展-輸入商品原價,折扣并計算促銷后的價格

1.在HbuilderX軟件中創建項目&#xff0c;把項目的路徑放在xampp中的htdocs 2.創建php文件&#xff1a;price.php,price_from.php 3.在瀏覽器中&#xff0c;運行項目效果&#xff0c;通過xampp中admin進行運行瀏覽&#xff0c;在后添加文件名稱即可&#xff0c;注意&#xff…

3D Gaussian Splatting as MCMC 與gsplat中的應用實現

3D高斯潑濺(3D Gaussian splatting)自2023年提出以后,相關研究paper井噴式增長,盡管出現了許多改進版本,但依舊面臨著諸多挑戰,例如實現照片級真實感、應對高存儲需求,而 “懸浮的高斯核” 問題就是其中之一。浮動高斯核通常由輸入圖像中的曝光或顏色不一致引發,也可能…

【軟件測試】Postman中如何搭建Mock服務

在 Postman 中&#xff0c;Mock 服務是一項非常有用的功能&#xff0c;允許你在沒有實際后端服務器的情況下模擬 API 響應。通過創建 Mock 服務&#xff0c;你可以在開發階段或測試中模擬 API 的行為&#xff0c;幫助團隊成員進行前端開發、API 測試和集成測試等工作。 Mock 服…