ตัวดำเนินการสามจุดใน JavaScript เป็นหนึ่งในการอัปเดตที่สำคัญที่มาพร้อมกับ ES6

โอเปอเรเตอร์นี้ (...) ช่วยให้คุณบรรลุผลหลายอย่างที่ก่อนหน้านี้ต้องใช้โค้ดหลายบรรทัด ไวยากรณ์ที่ไม่คุ้นเคย และอื่นๆ อีกมากมาย

ในบทความสั้นๆ นี้ คุณจะได้เรียนรู้ว่าตัวดำเนินการจุดสามจุดหมายถึงอะไร และมันทำหน้าที่อะไร เราจะดูตัวอย่างบางส่วนเพื่อแสดงกรณีการใช้งานที่เป็นไปได้ และเราจะดูว่าคุณเคยดำเนินการเหล่านี้อย่างไร ด้วยวิธีนี้คุณจะเห็นว่าจุดสามจุดเสนออะไรให้คุณในฐานะนักพัฒนา JavaScript

ตัวดำเนินการสามจุดมีความหมายที่แตกต่างกันสองประการใน JavaScript ไวยากรณ์คล้ายกันมาก แต่คุณใช้แต่ละอันในบริบทที่แตกต่างกัน การใช้ ... ที่แตกต่างกันทั้งสองนี้เป็นตัวดำเนินการสเปรดและตัวดำเนินการพัก

วิธีใช้ตัวดำเนินการ Spread ใน JavaScript

ใน JavaScript คุณใช้ตัวดำเนินการแพร่กระจายเพื่อขยายการวนซ้ำภายในตัวรับที่ระบุตามชื่อของมัน

ผู้รับนี้อาจเป็นอะไรก็ได้ เช่น วัตถุ อาร์เรย์ และอื่นๆ และสิ่งที่ทำซ้ำได้อาจเป็นอะไรก็ได้ที่เราสามารถวนซ้ำได้ รวมถึงสตริง อาร์เรย์ อ็อบเจ็กต์ และอื่นๆ

ไวยากรณ์ตัวดำเนินการกระจาย:

const newArray = ['firstItem', ...oldArray];

ตอนนี้เรามาดูกรณีต่างๆ ที่เราสามารถใช้ตัวดำเนินการสเปรดได้

วิธีคัดลอกอาร์เรย์ด้วยตัวดำเนินการ Spread

เมื่อเราต้องการคัดลอกองค์ประกอบของอาร์เรย์เฉพาะไปไว้ในอาร์เรย์ใหม่โดยไม่กระทบต่ออาร์เรย์เดิม เราสามารถใช้ตัวดำเนินการแพร่กระจายได้

นี่คือตัวอย่าง:

let studentNames = ["Daniel", "Jane", "Joe"];
let names = [...studentNames];
console.log(names); // ["Daniel","Jane","Joe"]

สิ่งนี้ช่วยเราประหยัดเวลาที่เราจะใช้ในการเขียนคำสั่งแบบวนซ้ำ:

let studentNames = ["Daniel", "Jane", "Joe"];
let names = [];
studentNames.map((name) => {
    names.push(name);
});
console.log(names); // ["Daniel","Jane","Joe"]

วิธีคัดลอกออบเจ็กต์ด้วยตัวดำเนินการ Spread

เช่นเดียวกับที่เราทำกับอาร์เรย์ คุณยังสามารถใช้วัตถุเป็นตัวรับสำหรับตัวดำเนินการสเปรดได้

let user = { name: "John Doe", age: 10 };
let copiedUser = { ...user };
console.log(copiedUser); // { name: "John Doe", age: 10 }

ในขณะที่วิธีเก่าในการทำเช่นนี้คือการใช้วิธี Object.assign() ด้วยวิธีนี้:

let user = { name: "John Doe", age: 10 };
let copiedUser = Object.assign({}, user);
console.log(copiedUser); // { name: "John Doe", age: 10 }

วิธีการต่อหรือรวมอาร์เรย์เข้ากับตัวดำเนินการ Spread

เมื่อเรามีอาร์เรย์ตั้งแต่สองตัวขึ้นไปที่เราต้องการรวมเข้ากับอาร์เรย์ใหม่ เราก็สามารถทำสิ่งนี้ได้อย่างง่ายดายด้วยตัวดำเนินการสเปรด มันช่วยให้เราคัดลอกองค์ประกอบจากอาร์เรย์:

let femaleNames = ["Daniel", "Peter", "Joe"];
let maleNames = ["Sandra", "Lucy", "Jane"];
let allNames = [...femaleNames, ...maleNames];
console.log(allNames); // ["Daniel","Peter","Joe","Sandra","Lucy","Jane"]

สิ่งสำคัญคือต้องรู้ว่าเราสามารถใช้วิธีการเดียวกันกับอาร์เรย์ได้มากเท่าที่เรามี นอกจากนี้เรายังสามารถเพิ่มแต่ละองค์ประกอบภายในอาร์เรย์ได้:

let femaleNames = ["Daniel", "Peter", "Joe"];
let maleNames = ["Sandra", "Lucy", "Jane"];
let otherNames = ["Bill", "Jill"];
let moreNames = [...otherNames, ...femaleNames, ...maleNames];
let names = [...moreNames, "Ben", "Fred"];

ซึ่งช่วยลดความเครียดในการใช้ไวยากรณ์ที่ซับซ้อนเช่นเมธอด concat():

let femaleNames = ["Daniel", "Peter", "Joe"];
let maleNames = ["Sandra", "Lucy", "Jane"];
let otherNames = ["Bill", "Jill"];
let allNames = femaleNames.concat(maleNames);
let moreNames = femaleNames.concat(maleNames, otherNames);

วิธีเชื่อมต่อหรือรวมวัตถุเข้ากับตัวดำเนินการ Spread

นอกจากนี้เรายังสามารถเชื่อมวัตถุเข้าด้วยกันได้คล้ายกับวิธีที่เราทำอาร์เรย์กับตัวดำเนินการสเปรด:

let userName = { name: "John Doe" };
let userSex = { sex: "Female" };
let user = { ...userName, ...userSex };
console.log(user); // { name: "John Doe", age: 10 }

หมายเหตุ: ในสถานการณ์ที่คีย์หนึ่งมีคุณสมบัติอื่น คุณสมบัติสุดท้ายจะแทนที่อินสแตนซ์แรก:

let userName = { name: "John Doe" };
let userSex = { sex: "Female", name: "Jane Doe" };
let user = { ...userName, ...userSex }; // { name: "Jane Doe", age: 10 }

วิธีดึงข้อมูลองค์ประกอบที่ไม่ซ้ำด้วยวิธี Set

สถานการณ์สำคัญอย่างหนึ่งเมื่อคุณจะใช้ตัวดำเนินการสเปรดคือเมื่อคุณพยายามดึงองค์ประกอบเฉพาะจากอาร์เรย์หนึ่งไปยังอีกอาร์เรย์หนึ่ง

ตัวอย่างเช่น สมมติว่าเรามีผลไม้หลายชนิดที่เราทำซ้ำผลไม้บางอย่าง และเราต้องการดึงผลไม้เหล่านี้มาไว้ในลำดับใหม่และหลีกเลี่ยงการทำซ้ำ เราสามารถใช้เมธอด set() ควบคู่ไปกับตัวดำเนินการสเปรดเพื่อแสดงรายการไว้ในอาร์เรย์ใหม่:

let fruits = ["Mango", "Apple", "Mango", "Banana", "Mango"];
let uniqueFruits = [...new Set(fruits)];
console.log(uniqueFruits); // ["Mango","Apple","Banana"]

วิธีการส่งผ่านองค์ประกอบอาร์เรย์ในการเรียกใช้ฟังก์ชันด้วยตัวดำเนินการ Spread

เมื่อคุณมีฟังก์ชันที่รับตัวเลขและคุณมีตัวเลขเหล่านี้เป็นองค์ประกอบของอาร์เรย์:

let scores = [12, 33, 6]
const addAll = (a, b, c) => {
    console.log(a + b + c);
};

คุณสามารถใช้ตัวดำเนินการแพร่กระจายเพื่อส่งองค์ประกอบเหล่านี้ไปยังการเรียกใช้ฟังก์ชันเป็นอาร์กิวเมนต์โดยใช้ตัวดำเนินการการแพร่กระจาย:

let scores = [12, 33, 6]
const addAll = (a, b, c) => {
    console.log(a + b + c);
};
addAll(...scores); // 51

วิธีการเก่าในการทำเช่นนี้คือการใช้วิธี apply():

let scores = [12, 33, 6]
const addAll = (a, b, c) => {
    console.log(a + b + c);
};
addAll.apply(null, scores); // 51

วิธีแยกสตริงเป็นอักขระโดยใช้ตัวดำเนินการ Spread

สมมติว่าเรามีสตริง เราสามารถใช้ตัวดำเนินการแพร่กระจายเพื่อแยกออกเป็นอักขระได้:

let myString = "freeCodeCamp";
const splitString = [...myString];
console.log(splitString); // ["f","r","e","e","C","o","d","e","C","a","m","p"]

ซึ่งคล้ายกับวิธี split():

let myString = "freeCodeCamp";
const splitString = myString.split('');
console.log(splitString); // ["f","r","e","e","C","o","d","e","C","a","m","p"]

วิธีใช้ตัวดำเนินการส่วนที่เหลือใน JavaScript

ในทางกลับกัน ตัวดำเนินการส่วนที่เหลืออนุญาตให้คุณรวมอาร์กิวเมนต์จำนวนเท่าใดก็ได้ลงในอาร์เรย์ แล้วดำเนินการตามที่คุณต้องการกับอาร์กิวเมนต์เหล่านั้น ใช้อาร์เรย์เพื่อแสดงอาร์กิวเมนต์จำนวนอนันต์

ไวยากรณ์ของตัวดำเนินการส่วนที่เหลือ

const func = (first, ...rest) => {};

ตัวอย่างที่สมบูรณ์แบบเพื่อแสดงให้เห็นสิ่งนี้คือถ้าเรามีรายการตัวเลข และเราต้องการใช้ตัวเลขแรกเป็นตัวคูณ จากนั้นเราต้องการนำค่าคูณของตัวเลขที่เหลือไปใส่ในอาร์เรย์:

const multiplyArgs = (multiplier, ...otherArgs) => {
    return otherArgs.map((number) => {
    return number * multiplier;
    });
};
let multipiedArray = multiplyArgs(6, 5, 7, 9);
console.log(multipiedArray); // [30,42,54]

นี่คือการแสดงที่ดีของตัวดำเนินการส่วนที่เหลือและมูลค่าของมัน:

const multiplyArgs = (multiplier, ...otherArgs) => {
    console.log(multiplier); // 6
    console.log(otherArgs); // [5,7,9]
};
multiplyArgs(6, 5, 7, 9);

หมายเหตุ: พารามิเตอร์ Rest ต้องเป็นพารามิเตอร์ที่เป็นทางการตัวสุดท้าย

const multiplyArgs = (multiplier, ...otherArgs, lastNumber) => {
    console.log(lastNumber); // Uncaught SyntaxError: Rest parameter must be last formal parameter
};
multiplyArgs(6, 5, 7, 9);

ความแตกต่างระหว่างตัวดำเนินการ Spread และ Rest ใน JavaScript

ณ จุดนี้ คุณอาจสับสนเนื่องจากทั้งสองวิธีดูค่อนข้างคล้ายกัน แต่ทีมงาน JS ทำงานได้ยอดเยี่ยมในการตั้งชื่อ เนื่องจากเป็นตัวกำหนดว่าแต่ละการใช้งานของ ... ทำหน้าที่อะไร

เราใช้ตัวดำเนินการแพร่กระจายเพื่อกระจายค่าอาร์เรย์หรือ iterables ลงในอาร์เรย์หรือวัตถุ

ขณะที่เราใช้ตัวดำเนินการ Rest เพื่อรวบรวมองค์ประกอบที่เหลือที่ส่งผ่านไปยังฟังก์ชันเป็นอาร์เรย์

const myFunction = (name1, ...rest) => { // used rest operator here
    console.log(name1);
    console.log(rest);
};
let names = ["John", "Jane", "John", "Joe", "Joel"];
myFunction(...names); // used spread operator here

ขอบคุณสำหรับการอ่านและแสดงความคิดเห็นด้านล่างหากคุณพบปัญหาใด ๆ หรือต้องการแนะนำวิธีที่ดีกว่า