ہر پروگرام کو ردعمل دینے کی ضرورت ہوتی ہے۔ ایک صارف بٹن پر کلک کرتا ہے۔ ایک API ڈیٹا واپس کرتی ہے۔ فارم کا کوئی خانہ خالی ہو جاتا ہے۔ شاخوں (branching) کے بغیر، آپ کا کوڈ اس بات کی پرواہ کیے بغیر ایک ایک لائن کر کے چلے گا کہ اصل میں کیا ہو رہا ہے۔ کنڈیشنلز (Conditionals) جاوا اسکرپٹ کو انتخاب کرنے کی یہ صلاحیت دیتے ہیں۔ یہ آپ کے فنکشنز کے اندر فیصلے کرنے والے، اور وہ گیٹ کیپرز ہیں جو فیصلہ کرتے ہیں کہ کیا چلے گا اور کیا چھوڑ دیا جائے گا۔ ایک بار جب آپ انہیں بہتر طریقے سے لکھنا سیکھ لیتے ہیں، تو آپ سخت (rigid) اسکرپٹس لکھنا چھوڑ دیتے ہیں اور ایسا سافٹ ویئر بنانا شروع کر دیتے ہیں جو حقیقت میں ردعمل دیتا ہے۔
کنڈیشنلز کیوں اہم ہیں
کنٹرول فلو (Control flow) منطق کی ریڑھ کی ہڈی ہے۔ آپ سرور پر پاس ورڈ بھیجنے سے پہلے انہیں ویلیڈیٹ کرنے کے لیے کنڈیشنلز کا استعمال کرتے ہیں۔ آپ ٹیکس کا حساب لگانے سے پہلے چیک کرتے ہیں کہ شاپنگ کارٹ خالی ہے یا نہیں۔ آپ یہ معلوم کرتے ہیں کہ آیا نیٹ ورک کی درخواست (request) ناکام ہو گئی ہے تاکہ آپ خالی اسکرین کے بجائے ایرر دکھا سکیں۔ یہ تمام منظرنامے ایک ہی سادہ خیال پر مبنی ہیں: کسی چیز کا جائزہ لیں، پھر اس کے مطابق عمل کریں۔
کنڈیشنلز کے بغیر، آپ کی ایپلی کیشن گفتگو کے بجائے ایک یکطرفہ گفتگو (monologue) ہوگی۔ یہ مختلف ڈیٹا کے منظرناموں کو سنبھالنے، غلطیوں کو بہتر طریقے سے مینیج کرنے، یا صارف کے اقدامات پر کسی بامعنی طریقے سے ردعمل دینے کے قابل نہیں ہوگی۔ یہ آپ کو اس بات پر کنٹرول دیتے ہیں کہ آپ کا پروگرام حقیقی دنیا کی غیر یقینی صورتحال میں کیسے چلتا ہے۔
بنیادی if سٹیٹمنٹ
شروع کرنے کے لیے سب سے سادہ جگہ اسٹینڈ الون if ہے۔ یہ کہتا ہے، اگر یہ چیز سچ ہے، تو یہ کام کرو۔ بس اتنا ہی۔ کوئی متبادل راستہ نہیں، کوئی دوسرا آپشن نہیں۔
if (x % 2 === 0) {
console.log("Even");
}
اس اسنیپٹ (snippet) میں، ماڈیولس آپریٹر چیک کرتا ہے کہ آیا x دو پر مکمل تقسیم ہوتا ہے۔ جب باقی (remainder) صفر ہو، تو کنسول اسٹرنگ کو لاگ کرتا ہے۔ اگر x طاق (odd) ہو، تو کچھ نہیں ہوتا۔ بلاک کو نظر انداز کر دیا جاتا ہے اور ایگزیکیوشن نیچے جاری رہتی ہے۔
وہ خاموش نظر اندازی اہم ہے۔ کبھی کبھی آپ صرف ایک ہی عمل کی حفاظت کرنا چاہتے ہیں۔ شاید آپ کسی بٹن میں CSS کلاس صرف تب شامل کرنا چاہتے ہوں جب وہ ایکٹو ہو، یا کسی ایرے (array) میں آئٹم صرف تب شامل کرنا چاہتے ہوں جب ان پٹ خالی نہ ہو۔ ایک سادہ if سٹیٹمنٹ آپ کو وہ لاجک لکھنے پر مجبور کیے بغیر ان لمحات کو سنبھال لیتا ہے جس کی آپ کو ضرورت نہیں ہے۔
if-else کے ساتھ متبادل کا اضافہ
حقیقی فیصلے عام طور پر دو پہلوؤں کے ہوتے ہیں۔ یا تو صارف کی عمر کافی ہے، یا نہیں ہے۔ یا تو ادائیگی کامیاب ہو گئی، یا ناکام ہو گئی۔ if-else کا ڈھانچہ دونوں کو کور کرتا ہے۔
if (age >= 18) {
console.log("Adult");
} else {
console.log("Not an Adult");
}
else بلاک ہر اس چیز کو پکڑ لیتا ہے جسے پہلی کنڈیشن نے مسترد کر دیا ہو۔ یہ ایک صاف ستھرا بائنری برانچ (binary branch) بناتا ہے۔ یہ پیٹرن ٹوگلز، پرمیشنز اور فیچر فلیگز کے لیے اچھا کام کرتا ہے۔ ہر بلاک کے اندر لاجک کو مرکوز رکھیں۔ اگر آپ خود کو ایک ہی برانچ میں بہت زیادہ کام جمع کرتے ہوئے پائیں، تو یہ عام طور پر کام کو چھوٹے فنکشنز میں تقسیم کرنے کا اشارہ ہوتا ہے۔
else if کے ساتھ متعدد راستوں کی جانچ
زندگی میں شاذ و نادر ہی صرف دو انتخاب ملتے ہیں۔ آپ کو کسی نمبر کو مثبت، منفی یا صفر کے طور پر درجہ بندی کرنے کی ضرورت پڑ سکتی ہے۔ آپ وزن کے حساب سے شپنگ ریٹ مقرر کر سکتے ہیں۔ ترتیب وار، متعدد موازنہؤں کے لیے else if کا استعمال کریں۔
if (x > 0) {
console.log("Positive");
} else if (x < 0) {
console.log("Negative");
} else {
console.log("Zero");
}
جاوا اسکرپٹ ان کا جائزہ اوپر سے نیچے تک لیتا ہے۔ جیسے ہی ایک کنڈیشن پاس ہوتی ہے، یہ اس بلاک کو چلا دیتا ہے اور باقی کو نظر انداز کر دیتا ہے۔ ترتیب اہم ہے۔ اگر آپ نے x > 100 چیک کرنے کے بعد x > 0 چیک کیا، تو سخت چیک کبھی نہیں چلے گا کیونکہ کم سخت چیک اسے پہلے ہی پکڑ لے گا۔ 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) کا استعمال کرتی ہے، جو کہ جاوا اسکرپٹ کا ایک عام پیٹرن ہے جب آپ کی لاجک درست برابری کے بجائے رینجز (ranges) پر منحصر ہو۔ break کی ورڈ ضروری ہے۔ اس کے بغیر، ایگزیکیوشن اگلے کیس میں چلی جاتی ہے چاہے وہ مماثل ہو یا نہ ہو، جو کہ یہاں شاذ و نادر ہی آپ کی ضرورت ہوتی ہے۔ default کلاز ایک آخری else کی طرح کام کرتی ہے، جو ہر اس چیز کو پکڑ لیتی ہے جو پہلے کیسز میں فٹ نہیں بیٹھتی۔
سوئچ تب بہترین کام کرتا ہے جب آپ کے پاس واضح اور مقررہ آپشنز ہوں۔ یہ else if بلاکس کے ایک لمبے ڈھیر کے مقابلے میں اسکین کرنے میں اکثر آسان ہوتا ہے، خاص طور پر جب ہر برانچ صرف ایک ویلیو تفویض کرتی ہے یا ایک سنگل فنکشن کو کال کرتی ہے۔
ٹرنری آپریٹر (Ternary Operator)
مختصر بائنری فیصلوں کے لیے، ٹرنری آپریٹر چیزوں کو جامع رکھتا ہے۔ یہ تین آپریینڈز (operands) لیتا ہے: ایک کنڈیشن، اگر سچ ہو تو ایک ویلیو، اور اگر غلط ہو تو ایک ویلیو۔
const result = (age >= 18) ? "Eligible" : "Not eligible";
آپ اسے فوری اسائنمنٹس یا ان لائن ریٹرنز کے لیے استعمال کر سکتے ہیں۔ یہ اس وقت اچھا کام کرتا ہے جب نتیجہ ایک سادہ ایکسپریشن ہو۔ ٹرنریز کو تین لیولز تک نیسٹ (nest) کرنے کی خواہش سے بچیں۔ ایک نییسٹڈ ٹرنری لائنیں تو بچا سکتی ہے، لیکن یہ پڑھنے میں مشکل (readability) پیدا کرتی ہے۔ جب آپ کی لاجک بڑھتی ہے، تو if-else بلاک عام طور پر اس اگلے ڈویلپر کے لیے زیادہ بہتر ہوتا ہے جو اس فائل کو کھولے گا۔
نییسٹڈ فیصلے (Nested Decisions)
پیچیدہ منطق کے لیے بعض اوقات مزید سوالات پوچھنے کی ضرورت ہوتی ہے۔ آپ فیصلے کو مزید بہتر بنانے کے لیے ایک if کے اندر دوسرا if شامل (nest) کر سکتے ہیں۔
if (weather === "sunny") {
if (temp > 30) {
console.log("
