JavaScript ES6 展開運算符(Spread Operator)介紹:給新手的指南

更新日期: 2025 年 4 月 16 日

在 JavaScript ES6(ECMAScript 6)中,展開運算符(Spread Operator)是一個非常實用的語法功能,它用來展開可迭代的物件(例如陣列或字串),讓代碼變得更加簡潔。

這篇文章將介紹展開運算符的基本用法,並且展示它如何應用於陣列、物件及函數的處理。


什麼是展開運算符?

展開運算符(…)是用來將一個可迭代的物件(如陣列、字串、物件等)展開成單獨的元素。

它的符號就是三個點 ...。這個運算符可以讓我們非常方便地複製、合併或展開數據結構。

用法一:展開陣列

最常見的展開運算符用法就是展開陣列。

假設我們有兩個陣列,並且想將它們合併到一起,在 ES6 之前,我們可能會使用 concat() 方法,但使用展開運算符可以讓這個過程變得更加簡潔:

const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];

// 使用展開運算符合併陣列
const mergedArray = [...arr1, ...arr2];

console.log(mergedArray);
// [1, 2, 3, 4, 5, 6]

在這個例子中,...arr1...arr2 將各自的陣列展開為單獨的元素,然後合併成一個新陣列。

用法二:複製陣列

展開運算符還可以用來快速複製一個陣列,而不影響原本的陣列(淺拷貝)。這在處理不可變數據時非常有用,例如在 React 開發中:

const originalArray = [1, 2, 3];

// 使用展開運算符複製陣列
const copiedArray = [...originalArray];

// 修改新陣列,不影響原陣列
copiedArray.push(4);

console.log(originalArray);
// [1, 2, 3]
console.log(copiedArray);
// [1, 2, 3, 4]

在這裡,我們用展開運算符創建了一個新的 copiedArray,它與原來的 originalArray 是獨立的,這意味著改變 copiedArray 不會影響 originalArray

用法三:展開物件

除了陣列外,展開運算符也可以用於物件。這在 ES2018 中被引入,允許我們展開物件的屬性並進行淺拷貝或合併:

const person = { name: 'Alice', age: 25 };

// 使用展開運算符複製物件
const copiedPerson = { ...person };

console.log(copiedPerson);
// { name: 'Alice', age: 25 }

我們還可以用展開運算符合併物件,並覆蓋某些屬性:

const person = { name: 'Alice', age: 25 };
const updatedPerson = { ...person, age: 26, city: 'Taipei' };

console.log(updatedPerson);
// { name: 'Alice', age: 26, city: 'Taipei' }

在這個例子中,age 屬性被更新為 26,同時我們新增了一個 city 屬性,並保留了原來的 name 屬性。

🧠 補充:展開順序與屬性覆蓋的原則

當我們使用展開運算符合併物件時,「屬性重複時,後面出現的會蓋掉前面」,這是 JavaScript 合併物件時的重要原則。

例如:

const base = { name: 'Alice', age: 25 };

const updated = { ...base, age: 30 };

console.log(updated);
// { name: 'Alice', age: 30 }

在這個例子中,...base 先展開 { name: 'Alice', age: 25 },但後面的 age: 30 會把原本的 age: 25 覆蓋掉。

這讓我們可以有選擇地「更新」某些欄位。

❗ 但如果順序寫反了呢?

const wrongOrder = { age: 30, ...base };

console.log(wrongOrder);
// { age: 25, name: 'Alice' } ← 原本設定的 30 被蓋掉了!

這是許多初學者常犯的錯誤:

當你先寫 age: 30 再展開 ...base,就會被 base 裡的 age: 25 蓋掉。

✅ 正確更新的順序寫法:

const updated = { ...base, age: 30 }; // ✅ age 被成功更新為 30

📌 小標語記憶法:

「後寫的屬性會贏」→ 順序錯了,屬性就會被吃掉!

用法四:展開函數參數

展開運算符還可以用於函數的參數中,允許我們將陣列的元素作為函數的獨立參數來使用。

這在處理可變參數函數時特別方便:

const numbers = [1, 2, 3];

function sum(a, b, c) {
  return a + b + c;
}

// 使用展開運算符將陣列元素作為參數傳遞
const result = sum(...numbers);

console.log(result);
// 6

這種寫法比使用 apply() 更直觀,也能使代碼更容易理解。

用法五:展開字串

展開運算符同樣可以應用於字串,將字串中的每個字元展開為單獨的元素:

const str = 'hello';

// 使用展開運算符將字串轉為陣列
const charArray = [...str];

console.log(charArray);
// ['h', 'e', 'l', 'l', 'o']

這讓我們可以輕鬆地將字串轉換為一個陣列,並對其進行各種操作。


展開運算符與剩餘參數(Rest Parameters)

展開運算符與剩餘參數(Rest Parameters)用的是相同的 ... 符號,但功能不同。

展開運算符是用來展開數據結構,而剩餘參數則是用來將多個參數收集為一個陣列。

例如:

function sum(...args) {
  return args.reduce((total, num) => total + num, 0);
}

console.log(sum(1, 2, 3, 4)); 
// 10

在這裡,...args 將所有傳遞進來的參數收集到一個陣列中,然後我們使用 reduce() 來計算它們的總和。


結論

展開運算符(Spread Operator)是 ES6 中一個非常強大且實用的語法,它能讓我們在處理陣列、物件和函數參數時更簡潔地編寫代碼。

無論是複製數據、合併數據,還是展開參數,展開運算符都能大幅提升代碼的可讀性和效率。

希望這篇文章能幫助你理解並開始使用展開運算符來編寫更簡潔、高效的 JavaScript 代碼!

多加練習,展開運算符將成為你寫代碼時的好幫手。

Similar Posts