JS學習筆記#16 | Spread Syntax 和 Rest Parameters

更新於 發佈於 閱讀時間約 7 分鐘


Spread Syntax (展開語法)

概念

  • 展開語法允許將一個可迭代的物件 (例如:陣列、字串、Set、Map 等) 「展開」成個別的元素。
  • 使用三個點 ... 作為語法標示。


應用場景

  • 複製陣列/物件 (淺拷貝)
// 陣列
const arr1 = [1, 2, 3];
const arr2 = [...arr1]; // arr2: [1, 2, 3] (獨立的副本)


// 物件
const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1, c: 3 }; // obj2: { a: 1, b: 2, c: 3 } (合併並新增屬性)
注意: 這屬於淺拷貝僅複製物件的第一層結構,而不會複製底下第二層之後的物件,第二層之後的物件使用內部物件的記憶體位址。如果物件或陣列內部有巢狀結構,修改複製後的內部結構會影響到原始物件或陣列。
// 陣列
const arr1 = [1, 2, [3, 4]];
const arr2 = [...arr1]; // 淺拷貝

arr2[0] = 10; // arr1[0] 不會受影響
arr2[2][0] = 30; // arr1[2][0] 會被影響 (因為複製的是記憶體位址)
console.log(arr1); // [1, 2, [30, 4]]
console.log(arr2); // [10, 2, [30, 4]]

// 物件
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = { ...obj1 }; // 淺拷貝

obj2.a = 10; // obj1.a 不會受影響
obj2.b.c = 20; // obj1.b.c 會被影響 (因為複製的是記憶體位址)
console.log(obj1); // {a: 1, b: {c: 20}}
console.log(obj2); // {a: 10, b: {c: 20}}

  • 合併陣列
const arr1 = [1, 2];
const arr2 = [3, 4];
const combined = [...arr1, ...arr2]; // combined: [1, 2, 3, 4]


  • 傳遞函數參數 (取代 apply 方法)
function sum(a, b, c) {
return a + b + c;
}
const numbers = [1, 2, 3];
const result = sum(...numbers); // result: 6

  • 將字串展開成字符陣列
const str = "hello";
const chars = [...str]; // chars: ['h', 'e', 'l', 'l', 'o']


  • 解構賦值時提取部分元素
const arr = [1, 2, 3, 4, 5];
const [first, second, ...rest] = arr; // first: 1, second: 2, rest: [3, 4, 5]


  • 將NodeList等類陣列轉換為真正的陣列
const nodeList = document.querySelectorAll('li');
const array = [...nodeList]


Rest Parameters (其餘參數)

概念

  • 其餘參數允許將不特定數量的參數打包成一個陣列。
  • 使用三個點...作為語法標示,只能在函數參數的最後一個位置使用


應用場景

  • 處理不定數量的函數參數
function myFunc(a, b, ...rest) {
console.log("a:", a); // 1
console.log("b:", b); // 2
console.log("rest:", rest); // [3, 4, 5]
}
myFunc(1, 2, 3, 4, 5);


  • 取代 arguments 物件

arguments物件是早期 JavaScript 中用來存取函數所有參數的類陣列物件,但其限制較多。

Rest Parameters 可以更清晰且彈性地處理不定數量的參數,並且是一個真正的陣列。

// 使用 arguments (早期做法)
function sumArgs() {
let sum = 0;
for (let i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
return sum;
}
console.log(sumArgs(1, 2, 3, 4)); // 輸出 10


// 使用 Rest Parameters (現代做法),處理不定數量的參數
function sumAll(...numbers) {
return numbers.reduce((acc, curr) => acc + curr, 0);
}
console.log(sumAll(1, 2, 3, 4)); // 輸出 10



// 對比: Spread Syntax 傳入固定數量參數
function sum(a, b, c) {
return a + b + c;
}
const numbers = [1, 2, 3];
console.log(sum(...numbers)); // 輸出 6 ,使用 Spread Syntax 展開陣列
//console.log(sum(1,2,3,4)) // Error


重點整理

本篇文章探討了 JavaScript 中兩個重要的 ES6 特性:Spread Syntax (展開語法) 和 Rest Parameters (其餘參數)。

這兩者都使用 ... 符號,但它們的作用和應用場景截然不同。

  • Spread Syntax 主要用於展開可迭代物件,例如將陣列或物件的元素複製到新的陣列或物件中,或是在函式呼叫時傳遞參數。它的作用就像一個「展開器」,能讓你更簡潔地處理資料。
  • Rest Parameters 則用於收集不定數量的函數參數,將它們打包成一個陣列,方便在函數內部進行處理。它就像一個「收集器」,可以讓你的函數更靈活地接收參數。
avatar-img
0會員
18內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
koko的沙龍 的其他內容
身為一名女性,我常常在生活中感受到性別帶來的無形壓力。 而閱讀上野千鶴子《厭女:日本的女性嫌惡》這本書後,讓我突然意識到原來身為女性,在這個社會上彷彿在玩著一款難度超高的遊戲。
5/5厭女:日本的女性嫌惡
這個專案是一個使用 Vue3、Vite、daisyUI 和 Google Gemini AI API 打造的雙 AI 對話模擬器。 使用者可以設定兩個 AI 角色的名稱和描述,然後讓它們自行對話。 這個專案旨在展示前端如何與 AI API 互動,以及如何建立具有互動性的 AI 應用程式。
箭頭函式是 JavaScript ES6(ECMAScript 2015)引入的一種簡化 Function Expression 語法。 它用來快速定義匿名函式,語法簡潔,特性明確,特別適合用於回呼函式等場景。
Function Declaration 與 Function Expression Function Declaration 適合用於需要提升或全域使用的函式。 Function Expression 更靈活,適合用於回呼函式、閉包、高階函式等場景。
DOM (Document Object Model) 是瀏覽器用於操作 HTML 或 XML 文件的編程介面。它將文檔解析為一個節點樹 (Node Tree),每個節點代表文檔的一部分(標籤、屬性、文字等)。
JSON.parse:將 JSON 格式的字串轉換為 JavaScript 物件,常用於解析後端返回的資料或本地存儲中的 JSON。JSON.stringify:將 JavaScript 的物件或陣列轉換為 JSON 格式字串,方便用於資料儲存或傳輸。
身為一名女性,我常常在生活中感受到性別帶來的無形壓力。 而閱讀上野千鶴子《厭女:日本的女性嫌惡》這本書後,讓我突然意識到原來身為女性,在這個社會上彷彿在玩著一款難度超高的遊戲。
5/5厭女:日本的女性嫌惡
這個專案是一個使用 Vue3、Vite、daisyUI 和 Google Gemini AI API 打造的雙 AI 對話模擬器。 使用者可以設定兩個 AI 角色的名稱和描述,然後讓它們自行對話。 這個專案旨在展示前端如何與 AI API 互動,以及如何建立具有互動性的 AI 應用程式。
箭頭函式是 JavaScript ES6(ECMAScript 2015)引入的一種簡化 Function Expression 語法。 它用來快速定義匿名函式,語法簡潔,特性明確,特別適合用於回呼函式等場景。
Function Declaration 與 Function Expression Function Declaration 適合用於需要提升或全域使用的函式。 Function Expression 更靈活,適合用於回呼函式、閉包、高階函式等場景。
DOM (Document Object Model) 是瀏覽器用於操作 HTML 或 XML 文件的編程介面。它將文檔解析為一個節點樹 (Node Tree),每個節點代表文檔的一部分(標籤、屬性、文字等)。
JSON.parse:將 JSON 格式的字串轉換為 JavaScript 物件,常用於解析後端返回的資料或本地存儲中的 JSON。JSON.stringify:將 JavaScript 的物件或陣列轉換為 JSON 格式字串,方便用於資料儲存或傳輸。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
主要來講宣告函式跟箭頭函式 : 宣告函式(Function Declaration) 語法: function functionName(parameters) { return result; } 特點: 使用 function 關鍵字 函式名稱是必需的 存在函式
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
Thumbnail
本章節旨在介紹TypeScript中的函數,包括其基本結構、如何呼叫函數、函數的參數以及函數的返回值等相關概念。通過本章節,讀者可以學習到如何在TypeScript中使用不同的方式來定義函數,如函數聲明、函數表達式、箭頭函數和匿名函數等。
Thumbnail
自訂元件生成位置顧名思義就是可以指定部分HTML區塊渲染在特定的畫面上,即使在不同組件也能把A組件內的部分畫面,展現在B組件上,以下方程式舉例。
※ ES6 變數宣告介紹: 在ES6中,推薦使用let和const取代原有的var來宣告變數。 ※ var的特點: 勢力範圍(scope)只有兩種:function、global(全域部分)。 勢力範圍(scope)指的是宣告變數的範圍,能夠被有效的使用的範圍。 可以在宣告變數之前就使用。
※ 好用的陣列迭代器:forEach forEach 的使用時機: 需要從頭到尾把陣列中的每一個元素都印出來 ,就適合使用 forEach 方法。 forEach 的必要參數是一個函式: forEach() 的功能是把陣列的每個元素都丟進某個函式執行一次,因此必要的參數是一個函式。 語法:
Thumbnail
R036 Blog API 伺服器的維護更新日誌 (2024/04/30) 開發環境技術 語言: Javascript 環境: Node JS 框架: Express.js 本次維護目的 優化及測試API伺服器程運行 重溫程式碼架構以便日後更新優化 Reac
※ 函式基礎介紹: ※ JavaScript 特殊的函式特性: 函式可以當成值來傳遞 (可以放進變數或放進物件) 函式可以當成函式的參數 callback - 在特定事件中觸發函式 (非同步特性) ※ 函式的基本寫法: ※ 調用 (invoke) 函式: "調用" 意指呼叫或執行
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
主要來講宣告函式跟箭頭函式 : 宣告函式(Function Declaration) 語法: function functionName(parameters) { return result; } 特點: 使用 function 關鍵字 函式名稱是必需的 存在函式
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
Thumbnail
本章節旨在介紹TypeScript中的函數,包括其基本結構、如何呼叫函數、函數的參數以及函數的返回值等相關概念。通過本章節,讀者可以學習到如何在TypeScript中使用不同的方式來定義函數,如函數聲明、函數表達式、箭頭函數和匿名函數等。
Thumbnail
自訂元件生成位置顧名思義就是可以指定部分HTML區塊渲染在特定的畫面上,即使在不同組件也能把A組件內的部分畫面,展現在B組件上,以下方程式舉例。
※ ES6 變數宣告介紹: 在ES6中,推薦使用let和const取代原有的var來宣告變數。 ※ var的特點: 勢力範圍(scope)只有兩種:function、global(全域部分)。 勢力範圍(scope)指的是宣告變數的範圍,能夠被有效的使用的範圍。 可以在宣告變數之前就使用。
※ 好用的陣列迭代器:forEach forEach 的使用時機: 需要從頭到尾把陣列中的每一個元素都印出來 ,就適合使用 forEach 方法。 forEach 的必要參數是一個函式: forEach() 的功能是把陣列的每個元素都丟進某個函式執行一次,因此必要的參數是一個函式。 語法:
Thumbnail
R036 Blog API 伺服器的維護更新日誌 (2024/04/30) 開發環境技術 語言: Javascript 環境: Node JS 框架: Express.js 本次維護目的 優化及測試API伺服器程運行 重溫程式碼架構以便日後更新優化 Reac
※ 函式基礎介紹: ※ JavaScript 特殊的函式特性: 函式可以當成值來傳遞 (可以放進變數或放進物件) 函式可以當成函式的參數 callback - 在特定事件中觸發函式 (非同步特性) ※ 函式的基本寫法: ※ 調用 (invoke) 函式: "調用" 意指呼叫或執行
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例