ES6/ES11知識點 續三

rest參數

Rest 參數(Rest Parameters)是 ES6 引入的一個非常實用的特性。它允許函數接受不定數量的參數,并將這些參數作為一個數組存儲,從而簡化了處理可變參數的代碼。

Rest 參數語法

Rest 參數使用 … 語法,緊跟著參數名。它會將傳遞給函數的所有剩余參數收集成一個數組。

function sum(...numbers) {return numbers.reduce((total, num) => total + num, 0);
}console.log(sum(1, 2, 3));  // 輸出:6
console.log(sum(10, 20, 30, 40)); // 輸出:100

在這個例子中,…numbers 捕獲所有傳遞給 sum 函數的參數,并將它們作為數組 numbers 處理。

Rest 參數的特點

只能是最后一個參數

Rest 參數必須是函數參數列表中的最后一個參數。如果在其他參數后使用 …,會拋出語法錯誤。

// 正確
function greet(message, ...names) {console.log(message);console.log(names);
}// 錯誤
function greet(...names, message) {  // 報錯console.log(names);console.log(message);
}

能夠接收任意數量的參數

Rest 參數允許函數接收任意數量的傳遞參數,并將它們收集到一個數組中。即使沒有傳遞任何參數,Rest 參數仍然是一個空數組。

function logMessages(...messages) {console.log(messages);  // 輸出參數數組
}logMessages("Hello", "World");  // 輸出:["Hello", "World"]
logMessages();                 // 輸出:[]

與普通參數一起使用

Rest 參數可以與普通的命名參數一起使用,但它必須位于參數列表的最后。

function displayInfo(name, age, ...hobbies) {console.log(`Name: ${name}`);console.log(`Age: ${age}`);console.log(`Hobbies: ${hobbies.join(", ")}`);
}displayInfo("Alice", 30, "Reading", "Hiking", "Cooking");  
// 輸出:
// Name: Alice
// Age: 30
// Hobbies: Reading, Hiking, Cooking

Rest 參數與 arguments 對象的區別

arguments 對象是一個類數組對象,表示傳遞給函數的所有參數。然而,arguments 對象不是真正的數組,不能直接使用數組的方法(如 forEach、map、filter)。此外,arguments 是一個在所有函數中都存在的對象,并不支持解構。

與此不同,Rest 參數是一個真正的數組,可以直接使用數組的方法。

function test() {console.log(arguments);  // 類數組對象console.log(Array.isArray(arguments));  // 輸出:false
}function testRest(...args) {console.log(args);  // 數組console.log(Array.isArray(args));  // 輸出:true
}test(1, 2, 3);
testRest(1, 2, 3);

Rest 參數與解構結合

你還可以將 Rest 參數與解構語法結合使用,從而靈活地提取函數參數。

function splitData(first, second, ...rest) {console.log(first);  // 輸出:1console.log(second); // 輸出:2console.log(rest);   // 輸出:[3, 4, 5, 6]
}splitData(1, 2, 3, 4, 5, 6);

結論

Rest 參數是一個非常強大的特性,能夠使函數更靈活,支持處理不定數量的參數。它比 arguments 對象更易用,因為它是一個真正的數組,并且可以結合解構語法進行更靈活的處理。使用 Rest 參數,你可以避免處理大量的條件判斷,使代碼更加簡潔和易讀。

擴展運算符

擴展運算符(Spread Operator)是 ES6 引入的一種語法,它使用 … 表示符,可以展開數組或對象的元素。它與 Rest 參數(…)看起來相似,但用途和語境有所不同。

擴展運算符的基本語法

擴展運算符用于將一個數組或對象的元素“展開”成單個值,可以更簡潔地進行合并、克隆等操作。

// 數組的擴展
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5];console.log(arr2);  // 輸出:[1, 2, 3, 4, 5]// 對象的擴展
const obj1 = { name: "Alice", age: 25 };
const obj2 = { ...obj1, city: "New York" };console.log(obj2);  // 輸出:{ name: "Alice", age: 25, city: "New York" }

數組的擴展運算符

擴展運算符可以將數組展開為單個元素,常見的用途包括合并數組和克隆數組。

合并數組

你可以使用擴展運算符將多個數組合并成一個新的數組。

const arr1 = [1, 2];
const arr2 = [3, 4];
const combinedArr = [...arr1, ...arr2];console.log(combinedArr);  // 輸出:[1, 2, 3, 4]

克隆數組

使用擴展運算符可以快速克隆一個數組。它會展開原數組的所有元素,生成一個新數組。

const arr1 = [1, 2, 3];
const arr2 = [...arr1];console.log(arr2);  // 輸出:[1, 2, 3]
arr1[0] = 100;
console.log(arr1);  // 輸出:[100, 2, 3]
console.log(arr2);  // 輸出:[1, 2, 3]  (原數組未改變)

傳遞數組元素作為函數參數

你可以使用擴展運算符將數組的元素傳遞給函數參數。

const arr = [1, 2, 3];
function sum(a, b, c) {return a + b + c;
}
console.log(sum(...arr));  // 輸出:6

對象的擴展運算符

擴展運算符也可以用于對象,它用于淺拷貝對象或合并多個對象。

克隆對象

擴展運算符可以創建一個對象的淺拷貝,復制對象的所有可枚舉屬性。

const obj1 = { name: "Alice", age: 25 };
const obj2 = { ...obj1 };console.log(obj2);  // 輸出:{ name: "Alice", age: 25 }
obj1.age = 26;
console.log(obj1);  // 輸出:{ name: "Alice", age: 26 }
console.log(obj2);  // 輸出:{ name: "Alice", age: 25 }  (淺拷貝,原對象不受影響)

合并對象

多個對象可以使用擴展運算符合并成一個新對象。如果多個對象有相同的鍵,后面的對象的值會覆蓋前面的。

const obj1 = { name: "Alice" };
const obj2 = { age: 25 };
const obj3 = { city: "New York" };const mergedObj = { ...obj1, ...obj2, ...obj3 };
console.log(mergedObj);  // 輸出:{ name: "Alice", age: 25, city: "New York" }

如果鍵重復,后面的對象會覆蓋前面的對象中的同名屬性:

const obj1 = { name: "Alice", age: 25 };
const obj2 = { age: 26, city: "New York" };const mergedObj = { ...obj1, ...obj2 };
console.log(mergedObj);  // 輸出:{ name: "Alice", age: 26, city: "New York" }

合并數組對象

擴展運算符不僅可以用于合并簡單對象,也可以用于合并數組中對象的屬性。

const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };
const obj3 = { ...obj1, ...obj2 };console.log(obj3);  // 輸出:{ a: 1, b: 3, c: 4 }

擴展運算符與 concat 的比較

擴展運算符和 concat 方法都可以用來合并數組,但它們有不同的使用方式和行為:

const arr1 = [1, 2];
const arr2 = [3, 4];// 使用 concat 合并
const combinedArr1 = arr1.concat(arr2);
console.log(combinedArr1);  // 輸出:[1, 2, 3, 4]// 使用擴展運算符合并
const combinedArr2 = [...arr1, ...arr2];
console.log(combinedArr2);  // 輸出:[1, 2, 3, 4]

雖然兩者都可以實現相同的效果,擴展運算符語法更加簡潔易讀。

擴展運算符的應用場景

  • 數組克隆與合并:可以快速復制數組或合并多個數組。
  • 對象合并與拷貝:適用于對象的淺拷貝和合并多個對象。
  • 簡化函數參數傳遞:可以將數組展開為函數參數列表,避免使用 apply()。

結論

擴展運算符(…)是 ES6 中的一個非常強大且簡潔的語法工具,能夠高效地處理數組和對象的合并、克隆等操作。它不僅使代碼更加簡潔,也提高了可讀性。特別是在處理不定參數和函數調用時,擴展運算符為開發者提供了更簡潔的語法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79486.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79486.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79486.shtml

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

相關文章

記憶翻牌游戲:認知科學與狀態機的交響曲

目錄 記憶翻牌游戲:認知科學與狀態機的交響曲引言第一章 網格空間拓撲學1.1 自適應網格算法1.2 卡片排布原理第二章 狀態機設計2.1 狀態躍遷矩陣2.2 時空關聯模型第三章 記憶強化機制3.1 認知衰減曲線3.2 注意力熱力圖第四章 動畫引擎設計4.1 翻牌運動方程4.2 粒子反饋系統第五…

STM32外設-GPIO輸出(不含復用)

STM32外設-GPIO輸出(不含復用) 一,GPIO模式簡介1,輸入模式2,輸出模式3,模擬模式4,復用模式 二,輸出模式詳解1, 輸出類型1,推挽輸出:2,…

58認知干貨:創業經驗分享及企業形式的匯總

機會永遠都是留給有眼光、能發現機會的人,而不是留給有準備的人!往往機會就在身邊,普羅大眾卻無法發現,而真正適合創業的人,天然具備這方面的能力。 當然后天的補足也未嘗不可:“故常有欲以觀其微,常無欲以觀其妙。””引用《道德經》 讀懂這句話自然便會擁有對商業和…

修復筆記:獲取 torch._dynamo 的詳細日志信息

一、問題描述 在運行項目時,遇到與 torch._dynamo 相關的報錯,并且希望獲取更詳細的日志信息以便于進一步診斷問題。 二、相關環境變量設置 通過設置環境變量,可以獲得更詳細的日志信息: set TORCH_LOGSdynamo set TORCHDYNAM…

Spark,Idea中編寫Spark程序 2

Idea中編寫Spark程序 一、修改pom.xml文件 <build><sourceDirectory>src/main/scala</sourceDirectory><testSourceDirectory>src/test/scala</testSourceDirectory> <!-- 添加必要的插件以打包scala程序--><plugins><plu…

【AI提示詞】黑天鵝模型專家

提示說明 詳細解釋黑天鵝模型的理論背景、定義、分類及其在不同領域的應用。 提示詞 # Role: 黑天鵝模型專家## Profile - language: 中文 - description: 詳細解釋黑天鵝模型的理論背景、定義、分類及其在不同領域的應用 - background: 黑天鵝模型是尼爾斯莫爾提出的理論&a…

ARM Linux 設備樹

Linux 設備驅動開發詳解&#xff1a;基于最新的Linux 4.0內核, 機械工業出版社, 宋寶華, 2015 1. 設備樹的起源 ? 背景: ARM架構中大量板級代碼冗余&#xff0c;硬編碼在mach-xxx目錄&#xff0c;設備樹&#xff08;Device Tree&#xff09;引入結構化描述硬件。 ? 目的: 減…

每日c/c++題 備戰藍橋杯(洛谷P1015 [NOIP 1999 普及組] 回文數)

洛谷P1015 [NOIP 1999 普及組] 回文數 題解 題目描述 P1015 回文數 是NOIP 1999普及組的經典模擬題。題目要求如下&#xff1a; 給定一個數N&#xff08;十進制&#xff09;和進制K&#xff08;2≤K≤16&#xff09;&#xff0c;將N轉換為K進制表示后&#xff0c;通過以下操…

Linux線程深度解析:從基礎到實踐

Linux線程深度解析&#xff1a;從基礎到實踐 一、線程基礎概念 1. 進程與線程定義 進程&#xff1a;一個正在運行的程序&#xff0c;是操作系統資源分配的最小單位&#xff08;擁有獨立的地址空間、文件描述符等資源&#xff09;&#xff0c;狀態包括就緒、運行、阻塞。線程…

php學習筆記(全面且適合新手)

以下是專為 PHP 7.4 初學者設計的全面學習文檔&#xff0c;涵蓋基礎語法、細節語法和進階語法&#xff0c;結合 PHP 7.4 新特性與實戰案例&#xff0c;幫助系統掌握 PHP 開發&#xff1a; 為什么特地做7.4的筆記而不做8的&#xff1f;因為公司用的7.4&#xff0c;哈哈 一、基…

開源分布式數據庫(TiDB)

TiDB是由PingCAP 開發的開源分布式數據庫&#xff0c;兼容 MySQL 協議&#xff0c;集成了 HTAP&#xff08;混合事務和分析處理&#xff09;的能力&#xff0c;能夠同時處理在線事務和實時分析任務。 2015 年&#xff0c;TiDB 在 GitHub 創建&#xff0c;2025 年&#xff0c;Ti…

SpringBoot+Mybatis通過自定義注解實現字段加密存儲

&#x1f60a; 作者&#xff1a; 一恍過去 &#x1f496; 主頁&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社區&#xff1a; Java技術棧交流 &#x1f389; 主題&#xff1a; SpringBootMybatis實現字段加密 ?? 創作時間&#xff1a; 2025年04月…

Windows 10系統中找回MySQL 8的root密碼

以下是 在Windows 10系統中找回MySQL 8的root密碼 的詳細步驟&#xff1a; 步驟1&#xff1a;停止MySQL服務 按 Win R 輸入 services.msc&#xff0c;打開「服務」管理器。找到 MySQL80&#xff08;或其他自定義服務名&#xff09;&#xff0c;右鍵選擇 停止。 步驟2&#xf…

【計網】互聯網的組成

回顧&#xff1a; 互聯網(Internet)&#xff1a;它是一個專有名詞&#xff0c;是一個特定的互連網&#xff0c;它是指當下全球最大的、最開放的、由眾多網絡相互連接而形成的特定的的互連網&#xff0c;采用TCP/IP協議族作為通信規則。 一、互聯網的組成部分 從互聯網的工作方…

【vue3】黑馬程序員前端Vue3小兔鮮電商項目【八】

黑馬程序員前端Vue3小兔鮮電商項目【八】登錄頁面 登錄頁面的主要功能就是表單校驗和登錄登出業務。 賬號密碼 accountpasswordcdshi0080123456cdshi0081123456cdshi0082123456cdshi0083123456cdshi0084123456cdshi0085123456cdshi0086123456cdshi0087123456cdshi0088123456 …

C++學習:六個月從基礎到就業——C++11/14:右值引用與移動語義

C學習&#xff1a;六個月從基礎到就業——C11/14&#xff1a;右值引用與移動語義 本文是我C學習之旅系列的第三十九篇技術文章&#xff0c;也是第三階段"現代C特性"的第一篇&#xff0c;主要介紹C11/14中引入的右值引用和移動語義。查看完整系列目錄了解更多內容。 引…

基于Qlearning強化學習的電梯群控系統高效調度策略matlab仿真

目錄 1.算法仿真效果 2.算法涉及理論知識概要 2.1 Q-learning強化學習原理 2.2 基于Q-learning的電梯群控系統建模 3.MATLAB核心程序 4.完整算法代碼文件獲得 1.算法仿真效果 matlab2022a仿真結果如下&#xff08;完整代碼運行后無水印&#xff09;&#xff1a; 仿真操作…

31.軟件時序控制方式抗干擾

軟件時序控制方式扛干擾 1. 軟件時序控制抗干擾的時間邏輯2. 應用案例 1. 軟件時序控制抗干擾的時間邏輯 &#xff08;1&#xff09;將受軟件控制的功能或軟件檢測到的狀態一一羅列&#xff1b; &#xff08;2&#xff09;將其中的潛在干擾和敏感信號分開&#xff1b; &#x…

Ubuntu環境下使用uWSGI服務器【以flask應用部署為例】

0、前置內容說明 首先要知道WSGI是什么&#xff0c;關于WSGI服務器的介紹看這篇&#xff1a;WSGI&#xff08;Web Server Gateway Interface&#xff09;服務器 由于從Python 3.11開始限制了在系統級 Python 環境中使用 pip 安裝第三方包&#xff0c;以避免與系統包管理器&am…

d3_v7繪制折線圖

<!DOCTYPE html> <html><head><meta charsetutf-8><title>需求</title><script src"https://d3js.org/d3.v7.min.js"></script><style>* {margin: 0;padding: 0;}html, body {width: 100%;height: 100%;displ…