প্রতিটি প্রোগ্রামের প্রতিক্রিয়া জানানোর প্রয়োজন হয়। একজন ব্যবহারকারী একটি বাটনে ক্লিক করেন। একটি API ডেটা প্রদান করে। একটি ফর্ম ফিল্ড খালি হয়ে যায়। কোনো শাখা বা ব্রাঞ্চিং করার উপায় না থাকলে, আপনার কোড আসলে কী ঘটছে তা বিবেচনা না করেই লাইন বাই লাইন চলতে থাকবে। কন্ডিশনাল (Conditionals) জাভাস্ক্রিপ্টকে বেছে নেওয়ার সেই ক্ষমতা দেয়। তারা আপনার ফাংশনের ভেতরে সিদ্ধান্ত গ্রহণকারী হিসেবে কাজ করে, অনেকটা গেটকিপারের মতো যারা ঠিক করে দেয় কোনটি চলবে আর কোনটি বাদ যাবে। একবার আপনি এগুলো সঠিকভাবে লিখতে শিখে গেলে, আপনি আর অনমনীয় স্ক্রিপ্ট লিখবেন না, বরং এমন সফটওয়্যার তৈরি করতে শুরু করবেন যা প্রকৃতপক্ষে প্রতিক্রিয়া জানাতে পারে।
কেন কন্ডিশনাল (Conditionals) গুরুত্বপূর্ণ
কন্ট্রোল ফ্লো (Control flow) হলো লজিকের মেরুদণ্ড। সার্ভারে পাসওয়ার্ড পাঠানোর আগে আপনি কন্ডিশনাল ব্যবহার করে তা যাচাই করেন। ট্যাক্স গণনা করার আগে শপিং কার্ট খালি কি না তা পরীক্ষা করেন। নেটওয়ার্ক রিকোয়েস্ট ব্যর্থ হয়েছে কি না তা শনাক্ত করেন যাতে আপনি একটি খালি স্ক্রিনের পরিবর্তে এরর (error) দেখাতে পারেন। এই সমস্ত পরিস্থিতি একই সাধারণ ধারণার ওপর নির্ভর করে: কিছু একটা মূল্যায়ন করা, তারপর সেই অনুযায়ী কাজ করা।
কন্ডিশনাল ছাড়া আপনার অ্যাপ্লিকেশনটি একটি কথোপকথনের পরিবর্তে একটি একতরফা বক্তব্য (monologue) হয়ে থাকবে। এটি বিভিন্ন ডেটা পরিস্থিতি সামলাতে, এররগুলো সুন্দরভাবে ম্যানেজ করতে বা ব্যবহারকারীর কাজের প্রতি অর্থপূর্ণভাবে প্রতিক্রিয়া জানাতে পারবে না। এগুলো আপনাকে বাস্তব জগতের অনিশ্চয়তার মধ্যেও আপনার প্রোগ্রাম কীভাবে চলবে তা নিয়ন্ত্রণ করতে সাহায্য করে।
বেসিক if স্টেটমেন্ট
শুরু করার সবচেয়ে সহজ জায়গা হলো স্ট্যান্ডঅ্যালোন if। এটি বলে, যদি এই বিষয়টি সত্য হয়, তবে এই কাজটি করো। ব্যস, এটুকুই। কোনো বিকল্প পথ বা ব্যাকআপ নেই।
if (x % 2 === 0) {
console.log("Even");
}
এই স্নিপেটে, মডুলাস অপারেটর পরীক্ষা করে যে x কে দুই দিয়ে নিঃশেষে ভাগ করা যায় কি না। যখন ভাগশেষ শূন্য হয়, তখন কনসোল একটি স্ট্রিং লগ করে। যদি x বিজোড় হয়, তবে কিছুই ঘটে না। ব্লকটি উপেক্ষা করা হয় এবং এক্সিকিউশন বা কার্যপ্রক্রিয়া নিচের দিকে চলতে থাকে।
সেই নিরব উপেক্ষাটি গুরুত্বপূর্ণ। মাঝে মাঝে আপনি কেবল একটি নির্দিষ্ট কাজকে সুরক্ষিত রাখতে চান। হতে পারে আপনি একটি বাটনে CSS ক্লাস যোগ করতে চান কেবল তখনই যখন এটি একটিভ থাকে, অথবা ইনপুট খালি না হলে কেবল তখনই একটি অ্যারেতে আইটেম যুক্ত করতে চান। একটি সাধারণ if স্টেটমেন্ট আপনাকে অপ্রয়োজনীয় লজিক লিখতে বাধ্য না করেই সেই মুহূর্তগুলো সামলাতে পারে।
if-else দিয়ে বিকল্প যোগ করা
বাস্তব জীবনের সিদ্ধান্তগুলোর সাধারণত দুটি দিক থাকে। হয় ব্যবহারকারীর বয়স যথেষ্ট, নয়তো যথেষ্ট নয়। হয় পেমেন্ট সফল হয়েছে, নয়তো ব্যর্থ হয়েছে। if-else স্ট্রাকচার এই উভয় পরিস্থিতিই কভার করে।
if (age >= 18) {
console.log("Adult");
} else {
console.log("Not an Adult");
}
else ব্লকটি প্রথম শর্তটি প্রত্যাখ্যান করা সমস্ত কিছুকে গ্রহণ করে। এটি একটি পরিষ্কার বাইনারি শাখা তৈরি করে। এই প্যাটার্নটি টগল (toggles), পারমিশন এবং ফিচার ফ্ল্যাগগুলোর জন্য খুব ভালো কাজ করে। প্রতিটি ব্লকের ভেতরের লজিককে সুনির্দিষ্ট রাখুন। আপনি যদি দেখেন যে একটি মাত্র ব্রাঞ্চের মধ্যে আপনি অনেক বেশি কাজ স্তূপ করে ফেলছেন, তবে সেটি সাধারণত কাজটিকে ছোট ছোট ফাংশনে ভাগ করার একটি সংকেত।
else if দিয়ে একাধিক পথ পরীক্ষা করা
জীবন খুব কমই কেবল দুটি বিকল্প প্রদান করে। আপনাকে একটি সংখ্যাকে পজিটিভ, নেগেটিভ বা শূন্য হিসেবে শ্রেণীবদ্ধ করার প্রয়োজন হতে পারে। ওজনের ওপর ভিত্তি করে আপনি শিপিং রেট নির্ধারণ করতে পারেন। ক্রমানুসারে একাধিক তুলনা করার জন্য else if ব্যবহার করুন।
if (x > 0) {
console.log("Positive");
} else if (x < 0) {
console.log("Negative");
} else {
console.log("Zero");
}
JavaScript এগুলো উপর থেকে নিচে মূল্যায়ন করে। একটি শর্ত মিলে গেলেই এটি সেই ব্লকটি চালায় এবং বাকিগুলো উপেক্ষা করে। এখানে ক্রম বা অর্ডার খুবই গুরুত্বপূর্ণ। আপনি যদি x > 100 পরীক্ষা করার পরে x > 0 পরীক্ষা করেন, তবে কঠোর শর্তটি (stricter check) কখনোই কাজ করবে না কারণ শিথিল শর্তটি (looser check) আগে সেটি ধরে ফেলবে। else if-কে একটি অগ্রাধিকার তালিকা (priority list) হিসেবে ভাবুন।
switch স্টেটমেন্ট
যখন আপনি একটি মানের সাথে অনেকগুলো আলাদা বিকল্পের তুলনা করেন, তখন অনেকগুলো else if স্টেটমেন্টের চেইন পুনরাবৃত্তিমূলক মনে হতে পারে। একটি switch স্টেটমেন্ট সেই বিষয়টিকে পরিষ্কার করে দেয়। এটি একটি এক্সপ্রেশনকে বিভিন্ন case ক্লজের সাথে মেলায় এবং মিলে যাওয়া ব্লকটি চালায়।
switch (true) {
case marks >= 90:
Branch = "Computer science";
break;
case marks >= 80:
Branch = "Mechanical";
break;
default:
Branch = "Other";
}
এই উদাহরণটি সরাসরি বুলিয়ান (boolean) শর্তাবলী মূল্যায়ন করতে switch(true) ব্যবহার করে, যা জাভাস্ক্রিপ্টের একটি সাধারণ প্যাটার্ন যখন আপনার লজিক সঠিক সমতার পরিবর্তে রেঞ্জ বা সীমার ওপর নির্ভর করে। break কিওয়ার্ডটি অপরিহার্য। এটি ছাড়া, এক্সিকিউশন মিলে যাক বা না যাক, পরবর্তী কেস-এ চলে যাবে, যা সাধারণত আপনি চান না। default ক্লজটি একটি শেষ else-এর মতো কাজ করে, যা আগের কেসগুলোর সাথে না মিলে যাওয়া সবকিছুকে গ্রহণ করে।
যখন আপনার কাছে স্পষ্ট এবং নির্দিষ্ট বিকল্প থাকে, তখন switch চমৎকার কাজ করে। অনেকগুলো else if ব্লকের স্তূপের চেয়ে এটি স্ক্যান করা সহজ, বিশেষ করে যখন প্রতিটি শাখা কেবল একটি মান অ্যাসাইন করে বা একটি মাত্র ফাংশন কল করে।
টারনারি অপারেটর (Ternary Operator)
ছোট বাইনারি সিদ্ধান্তের জন্য টারনারি অপারেটর বিষয়গুলোকে সংক্ষিপ্ত রাখে। এটি তিনটি অপারেন্ড গ্রহণ করে: একটি শর্ত, সত্য হলে একটি মান, এবং মিথ্যা হলে একটি মান।
const result = (age >= 18) ? "Eligible" : "Not eligible";
আপনি এটি দ্রুত অ্যাসাইনমেন্ট বা ইনলাইন রিটার্নের জন্য ব্যবহার করতে পারেন। যখন ফলাফল একটি সাধারণ এক্সপ্রেশন হয়, তখন এটি খুব ভালো কাজ করে। টারনারি অপারেটরকে তিন স্তর পর্যন্ত নেস্ট (nest) করার প্রবণতা থেকে বিরত থাকুন। একটি নেস্টেড টারনারি হয়তো লাইনের সংখ্যা কমাবে, কিন্তু এটি কোডের পঠনযোগ্যতা (readability) কমিয়ে দেয়। যখন আপনার লজিক বড় হয়ে যায়, তখন একটি if-else ব্লক পরবর্তী ডেভেলপারের জন্য অনেক বেশি সুবিধাজনক হয়।
নেস্টেড সিদ্ধান্ত (Nested Decisions)
জটিল লজিকের ক্ষেত্রে মাঝে মাঝে অনুবর্তী প্রশ্ন করার প্রয়োজন হয়। একটি সিদ্ধান্তকে আরও সুনির্দিষ্ট করতে আপনি একটি if-এর ভেতরে আরেকটি if ব্যবহার করতে পারেন।
if (weather === "sunny") {
if (temp > 30) {
console.log("
