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
留言分享你的想法!
avatar-img
koko的沙龍
1會員
34內容數
koko的沙龍的其他內容
2025/04/30
React 事件處理:讓網頁動起來~ 網頁的互動性是吸引使用者、提供良好體驗的關鍵。 在 React 中,透過監聽使用者的操作(例如點擊、滑鼠移動、鍵盤輸入),並執行相應的程式碼,來實現豐富的互動效果。
Thumbnail
2025/04/30
React 事件處理:讓網頁動起來~ 網頁的互動性是吸引使用者、提供良好體驗的關鍵。 在 React 中,透過監聽使用者的操作(例如點擊、滑鼠移動、鍵盤輸入),並執行相應的程式碼,來實現豐富的互動效果。
Thumbnail
2025/04/28
在 React 的世界裡,Props 負責從父元件向子元件傳遞資料,而 State 則是負責管理元件自身的內部資料。 State 就像元件的記憶,可以儲存元件的狀態,並根據狀態的變化來更新 UI。
Thumbnail
2025/04/28
在 React 的世界裡,Props 負責從父元件向子元件傳遞資料,而 State 則是負責管理元件自身的內部資料。 State 就像元件的記憶,可以儲存元件的狀態,並根據狀態的變化來更新 UI。
Thumbnail
2025/04/27
在 React 的世界裡,元件 (Component) 就像一個個獨立的個體,各自負責 UI 的一部分,要讓這些個體協同工作,就需要一種溝通的機制,而 Props 就是組件之間通信和數據傳遞的主要方式。
Thumbnail
2025/04/27
在 React 的世界裡,元件 (Component) 就像一個個獨立的個體,各自負責 UI 的一部分,要讓這些個體協同工作,就需要一種溝通的機制,而 Props 就是組件之間通信和數據傳遞的主要方式。
Thumbnail
看更多
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
在 JavaScript 中,函數是物件,因此它們有內建方法可以用來控制執行方式。 這些方法包括 .call()、.apply() 和 .bind(),主要用來改變函數執行時的 this 指向或傳遞參數,特別在物件導向或繼承中很有用。
Thumbnail
在 JavaScript 中,函數是物件,因此它們有內建方法可以用來控制執行方式。 這些方法包括 .call()、.apply() 和 .bind(),主要用來改變函數執行時的 this 指向或傳遞參數,特別在物件導向或繼承中很有用。
Thumbnail
Spread Syntax和Rest Parameters都使用 ... 符號,Spread Syntax用於展開可迭代物件,例如將陣列或物件的元素複製到新的陣列或物件中,或是在函式呼叫時傳遞參數。Rest Parameters用於收集不定數量的函數參數,將其打包成一個陣列,方便在函數內部進行處理。
Thumbnail
Spread Syntax和Rest Parameters都使用 ... 符號,Spread Syntax用於展開可迭代物件,例如將陣列或物件的元素複製到新的陣列或物件中,或是在函式呼叫時傳遞參數。Rest Parameters用於收集不定數量的函數參數,將其打包成一個陣列,方便在函數內部進行處理。
Thumbnail
Function Declaration 與 Function Expression Function Declaration 適合用於需要提升或全域使用的函式。 Function Expression 更靈活,適合用於回呼函式、閉包、高階函式等場景。
Thumbnail
Function Declaration 與 Function Expression Function Declaration 適合用於需要提升或全域使用的函式。 Function Expression 更靈活,適合用於回呼函式、閉包、高階函式等場景。
Thumbnail
函式(Function)是 JavaScript 中用來完成特定任務的可重複執行的程式碼片段。 函式可以接受輸入(參數),進行處理,並回傳結果。 主要的函式建立方式有函式宣告、函式表達式、和箭頭函式。
Thumbnail
函式(Function)是 JavaScript 中用來完成特定任務的可重複執行的程式碼片段。 函式可以接受輸入(參數),進行處理,並回傳結果。 主要的函式建立方式有函式宣告、函式表達式、和箭頭函式。
Thumbnail
※ Params是什麼? 在網頁開發中,params代表的是參數(Parameters)。當你在路由(Route)中定義了一個或多個變數時,這些變數的值就會被存儲在 params 對象中。所以,params 就是用來存儲路由參數的地方,這些參數可以在處理請求時使用。 ※ Params的兩個功能:
Thumbnail
※ Params是什麼? 在網頁開發中,params代表的是參數(Parameters)。當你在路由(Route)中定義了一個或多個變數時,這些變數的值就會被存儲在 params 對象中。所以,params 就是用來存儲路由參數的地方,這些參數可以在處理請求時使用。 ※ Params的兩個功能:
Thumbnail
本章節旨在介紹TypeScript中的函數,包括其基本結構、如何呼叫函數、函數的參數以及函數的返回值等相關概念。通過本章節,讀者可以學習到如何在TypeScript中使用不同的方式來定義函數,如函數聲明、函數表達式、箭頭函數和匿名函數等。
Thumbnail
本章節旨在介紹TypeScript中的函數,包括其基本結構、如何呼叫函數、函數的參數以及函數的返回值等相關概念。通過本章節,讀者可以學習到如何在TypeScript中使用不同的方式來定義函數,如函數聲明、函數表達式、箭頭函數和匿名函數等。
Thumbnail
在之前的文章當中曾經提到過 JavaScript 中的物件有一個特別的機制:傳參考(Called by reference),如果正確性再高一點的話,則可以稱之為傳共享(Called by sharing)。
Thumbnail
在之前的文章當中曾經提到過 JavaScript 中的物件有一個特別的機制:傳參考(Called by reference),如果正確性再高一點的話,則可以稱之為傳共享(Called by sharing)。
Thumbnail
今天會接續介紹 JS ES6 其他新穎的語法,物件解構(Object Destructuring)物件語法強化(Object Literal Enhancement)陣列解構(Array Destructuring)延展運算子(Spread Operator)。
Thumbnail
今天會接續介紹 JS ES6 其他新穎的語法,物件解構(Object Destructuring)物件語法強化(Object Literal Enhancement)陣列解構(Array Destructuring)延展運算子(Spread Operator)。
Thumbnail
C# List – (C#教學) – 所謂List, 就是把多個同類的variable串列在一起. 加上for, foreach迴圈的使用, 令他們可以作出相同的行為. 相關頁面: C# 陣列 – 學會Array陣列基本5種應用方法 – 初始化, 加入值, 更新值, 刪除值, foreach迴圈
Thumbnail
C# List – (C#教學) – 所謂List, 就是把多個同類的variable串列在一起. 加上for, foreach迴圈的使用, 令他們可以作出相同的行為. 相關頁面: C# 陣列 – 學會Array陣列基本5種應用方法 – 初始化, 加入值, 更新值, 刪除值, foreach迴圈
Thumbnail
今天來到Day5了,也來到基礎教學的最後一部分,今天要講解的就是函式(function),有分成內建函數,以及自訂函數,再來是import模組,也就是導入py檔,除了可以導入自行撰寫的py檔,網路上也有許多大神分享相當方便使用的py檔,最後再講解一下如何進行異常處理,也就是Debug的部分
Thumbnail
今天來到Day5了,也來到基礎教學的最後一部分,今天要講解的就是函式(function),有分成內建函數,以及自訂函數,再來是import模組,也就是導入py檔,除了可以導入自行撰寫的py檔,網路上也有許多大神分享相當方便使用的py檔,最後再講解一下如何進行異常處理,也就是Debug的部分
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News