Q17. What are the spread and rest operators, and how are they used?
তিনটি বিন্দুর চিহ্নের দুই ভিন্ন কাজ — ছড়িয়ে দেওয়া আর বাকিগুলো একসাথে ধরা।
দুটো operator-ই দেখতে হুবহু একই — তিনটি বিন্দু ...। কাজ নির্ভর করে এটি কোথায় বসানো হলো। ...-এর বাইরে থাকলে সেটি spread, আর ডেস্ট্রাকচারিং বা প্যারামিটারের ভেতরে থাকলে সেটি rest।
Spread মানে একটি array বা object কে খুলে অন্য জায়গায় ছড়িয়ে দেওয়া — মানগুলো একটা একটা করে কপি হয়ে যায়।
// array ছড়িয়ে নতুন array
const a = [1, 2, 3];
const b = [0, ...a, 4];
console.log(b); // [0, 1, 2, 3, 4]
console.log(a); // [1, 2, 3] — মূল অপরিবর্তিত
// object ছড়িয়ে নতুন object
const base = { id: 1 };
const user = { ...base, name: "Rahim" };
console.log(user); // { id: 1, name: "Rahim" }
// ফাংশনে আর্গুমেন্ট হিসেবে
const sum = (x, y, z) => x + y + z;
const nums = [1, 2, 3];
console.log(sum(...nums)); // 6Rest মানে উল্টোটা — বাকি সব মান একটা array বা object-এর ভিতরে জড়া করে নেওয়া। এটি সবসময় একটা ভেরিয়েবলের সাথে জোড়া বাঁধে।
// array-এর বাকি মানগুলো
const [first, ...rest] = [1, 2, 3, 4];
console.log(first, rest); // 1 [2, 3, 4]
// object-এ বাকি প্রপার্টিগুলো
const { id, ...others } = { id: 1, name: "Rahim", age: 25 };
console.log(id, others); // 1 { name: "Rahim", age: 25 }
// ফাংশনের প্যারামিটারে
function total(first, ...numbers) {
return first + numbers.length;
}
console.log(total("a", "b", "c")); // "ab3"rest অবশ্যই শেষ বসতে হয় — তারপর আর কোনো প্যারামিটার রাখা যায় না।
একটি সাধারণ কাজ হলো স্থায়ীভাবে পরিবর্তন না করে কপি বানানো — যাতে মূল অ্যারে বা অবজেক্ট নষ্ট না হয়।
const original = [1, 2, 3];
const copy = [...original];
copy.push(4);
console.log(original); // [1, 2, 3] — অক্ষত
console.log(copy); // [1, 2, 3, 4]
// update করার কাজও এভাবে করা যায়
const state = { count: 1 };
const next = { ...state, count: 2 };
console.log(state.count, next.count); // 1 2| বিষয় | Spread | Rest |
|---|---|---|
| কাজ | ছড়িয়ে দেওয়া | বাকিগুলো একসাথে ধরা |
| অবস্থান | ডান পাশে | বাঁ পাশে |
| ফলাফল | একাধিক মান | সবসময় একটি array বা object |
| উদাহরণ | { ...obj } | const { a, ...rest } = obj |
Spread শুধু shallow কপি করে — ভেতরের nested object-এর রেফারেন্স একই থাকে। তাই const copy = { ...user } করলে copy.address.city = "Sylhet" লিখলে মূল user.address.city-ও বদলে যাবে।