Q46. What are optional chaining (?.) and nullish coalescing (??)?
null-safe property access ও default মান বসানোর দুটি ES2020 operator।
Optional chaining (`?.`) দিয়ে nested property পড়া নিরাপদ করা যায় — মাঝের কোনো লেভেল null বা undefined হলে পুরো chain undefined হয়ে যায়, error ছুড়ে না। আর nullish coalescing (`??`) দিয়ে null বা undefined হলে বিকল্প মান বসানো যায়।
const user = {
name: "Rahim",
address: {
city: "ঢাকা",
},
};
console.log(user.address.city); // "ঢাকা"
console.log(user.profile.email); // ❌ TypeErroruser.profile বলে কোনো প্রপার্টি নেই, তাই সেটা undefined। এরপর .email পড়তে গিয়ে JavaScript দেখে undefined-এর প্রপার্টি পড়ছে, যেটা অসম্ভব — তাই TypeError পড়ে এবং পুরো কোড থেমে যায়।
console.log(user.profile?.email); // undefined
console.log(user.address?.city); // "ঢাকা"
console.log(user.profile?.contact?.phone); // undefined — দুই লেভেলেই নিরাপদধাপে ধাপে — user.profile মান undefined হওয়ায় ?. থেমে যায় এবং পুরো expression-এর মান undefined হয়ে যায়, তাই কোনো error হয় না। আর user.address মান object হওয়ায় ?. আপনা city প্রপার্টি খুঁজে পড়ে।
?? ব্যবহার করলে মান null বা undefined হলেই বিকল্প মান বসে, কিন্তু 0, "" বা false-এর মতো falsy মানকে ধরে না — এটাই || থেকে প্রধান পার্থক্য।
const count = 0;
const name = "";
console.log(count || 10); // 10 — 0 কে "ফালতু" ধরা হয়েছে
console.log(count ?? 10); // 0 — 0 সত্যিকারের মান, তাই রাখা হয়েছে
console.log(name || "Rahim"); // "Rahim" — "" ফালতু ধরা হয়েছে
console.log(name ?? "Rahim"); // "" — "" সত্যিকারের মানfunction getDisplayName(user) {
return user.profile?.name ?? "অতিথি";
}
console.log(getDisplayName({})); // "অতিথি"
console.log(getDisplayName({ profile: { name: "" } })); // "" — খালি রাখা হয়েছে
// বাস্তব উদাহরণ — API response-এর default মান
const response = await fetch("/api/config");
const data = await response.json();
const theme = data.settings?.theme ?? "light";
const retries = data.config?.retries ?? 3;// method call ও index-এও কাজ করে
const response = await fetch("/api/users");
const data = await response?.json?.();
const first = list?.[0]?.name;
const value = config?.["theme"] ?? "light";// ❌ `??` অপারেটর `||` বা `&&`-এর সাথে মিশিয়ে লেখা যায় না
const value = a ?? b || c; // SyntaxError
const value = a || b ?? c; // SyntaxError
// ✅ আগে parenthesize করুন
const value = a ?? (b || c);
const value = (a || b) ?? c;// ব্রাউজারে সাময়িকভাবে ব্যবহারের জন্য
const value = a?.b ?? fallback;
// babel বা esbuild ছাড়া পুরোনো browser-এ কাজ করবে না| Operator | মান অনুপস্থিত হলে | 0 হলে | false হলে | undefined হলে |
|---|---|---|---|---|
?. | undefined | চালু | চালু | undefined |
?? | বিকল্প | মূল মান | মূল মান | বিকল্প |
|| | বিকল্প | বিকল্প | বিকল্প | বিকল্প |
?. শুধু বাইরের কাছ থেকে আসা ডেটা — API response, query parameter, localStorage-এর মতো জায়গায় ব্যবহার করুন, যেখানে null ও undefined স্বাভাবিক। নিজের নিয়ন্ত্রিত object-এ এগুলো ব্যবহার করলে লুকানো বাগ চেপে যেতে পারে।