অন্যান্য অনেক ভাষার বিপরীতে, JavaScript-এ এমন দুটি ভিন্ন সত্তা আছে যেগুলো একটি (অর্থবহ) মানের অনুপস্থিতিকে প্রকাশ করে। এগুলো হলো null এবং undefined.
প্রিমিটিভ মান null যেকোনো টাইপের ভ্যারিয়েবলের জন্য সচেতনভাবে একটি "খালি মান" হিসেবে ব্যবহৃত হয়।
let name = null;
// name is intentionally set to "empty" because it is not
// available
আপনি স্ট্রিক্ট ইকুয়ালিটি অপারেটর === ব্যবহার করে দেখতে পারেন কোনো ভ্যারিয়েবল null কি না।
let name = null;
name === null;
// => true
যে ভ্যারিয়েবলে কোনো মান অ্যাসাইন করা হয়নি, তার টাইপ
undefined.1
এর মানে হলো, null একটি খালি মানকে বোঝায় (তবুও তা একটি মান), কিন্তু undefined বোঝায় একটি মানের সম্পূর্ণ অনুপস্থিতি। 🤯
undefined বিভিন্ন প্রসঙ্গে দেখা যায়।
undefined.undefined পান।undefined.undefined, যদি না ওই আর্গুমেন্টের একটি ডিফল্ট মান থাকে।let name;
console.log(name);
// => undefined
আপনি স্ট্রিক্ট ইকুয়ালিটি অপারেটর === ব্যবহার করে দেখতে পারেন কোনো ভ্যারিয়েবল undefined কি না।
let name;
name === undefined;
// => true
আপনি যদি কোনো অবজেক্টে নেস্টেড কোনো মান বের করার চেষ্টা করেন কিন্তু প্যারেন্ট কী (key)-টির অস্তিত্ব না থাকে, তবে JavaScript একটি এরর থ্রো করে।
এটি সহজে এড়ানোর জন্য ২০২০ সালে ভাষার স্পেসিফিকেশনে অপশনাল চেইনিং যোগ করা হয়।
অপশনাল চেইনিং অপারেটর ?. দিয়ে আপনি নিশ্চিত করতে পারেন যে JavaScript কেবল তখনই নেস্টেড কী (key) অ্যাক্সেস করার চেষ্টা করবে, যখন প্যারেন্টটি null বা undefined ছিল না।
অন্যথায় undefined রিটার্ন করা হয়।
const obj = {
address: {
street: 'Trincomalee Highway',
city: 'Batticaloa',
},
};
obj.address.zipCode;
// => undefined
obj.residence.street;
// => TypeError: Cannot read property 'street' of undefined
obj.residence?.street;
// => undefined
এমন পরিস্থিতি আছে, যেখানে আপনি চান কোনো ভ্যারিয়েবল null বা undefined হলে একটি ডিফল্ট মান প্রয়োগ করতে (কিন্তু কেবল তখনই)।
এটি মোকাবিলার জন্য ২০২০ সালে নালিশ কোয়ালেসিং অপারেটর ?? চালু করা হয়।
এটি ডান দিকের অপারেন্ড রিটার্ন করে কেবল তখনই, যখন বাম দিকের অপারেন্ডটি null বা undefined হয়।
অন্যথায় বাম দিকের অপারেন্ড রিটার্ন করা হয়।
let amount = null;
amount = amount ?? 1;
// => 1
amount = 0;
amount = amount ?? 1;
// => 0
[1] Undefined, MDN. (২০২১)। https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined (সংগৃহীত ৪ জুন, ২০২১)।
একটি বিনোদন পার্কের আইটি সিস্টেমের কিছু অংশ সরবরাহ ও রক্ষণাবেক্ষণ করা আপনার কাজ। বিশেষভাবে, দর্শনার্থী ও টিকিট পরিচালনা করে এমন প্রোগ্রামের দায়িত্ব আপনার।
প্রথমে আপনি সিস্টেমে একজন নতুন দর্শনার্থী তৈরি করবেন। তারপর টিকিট বাতিল করার জন্য একটি ফাংশন দেবেন। ৩ ও ৪ নম্বর কাজে আপনি টিকিট ট্র্যাকিং সিস্টেম নিয়ে কাজ করবেন, যা জালিয়াতি প্রতিরোধে সাহায্য করে। সবশেষে, নতুন আইনি প্রয়োজনীয়তার সাথে সিস্টেমটি খাপ খাওয়াতে সাহায্য করবেন।
দর্শনার্থীরা যখন প্রথমবার বিনোদন পার্কে আসে, তখন তাদের টার্মিনালে নাম ও বয়স লিখে নিবন্ধন করতে হয় এবং শর্তাবলিতে সম্মত হতে হয়।
অবশ্যই, তাদের একটি টিকিটও কিনতে হয়।
প্রতিটি টিকিটের একটি আইডেন্টিফায়ার থাকে, যেমন H32AZ123।
createVisitor নামে একটি ফাংশন লিখুন, যা তিনটি আর্গুমেন্ট গ্রহণ করে।
ফাংশনটি এমন একটি অবজেক্ট রিটার্ন করবে, যাতে এই তথ্যগুলো থাকবে।
অবজেক্টের কী (key)গুলো হবে name, age এবং ticketId।
createVisitor('Verena Nardi', 45, 'H32AZ123');
// => { name: 'Verena Nardi', age: 45, ticketId: 'H32AZ123' }
মানুষ যখন বিনোদন পার্ক ছেড়ে যায়, তখন তাদের টিকিট বাতিল হয়ে যায়। যদি তারা আবার ফিরে আসে, তাহলে নতুন একটি টিকিট কিনতে হয়। নিয়মিত দর্শনার্থীদের কিছুটা সময় বাঁচাতে, তাদের শুধু একবার নিবন্ধন করতে হয় এবং পরবর্তী ভ্রমণের জন্য দর্শনার্থীর তথ্য সংরক্ষণ করা হয়।
এর মানে হলো, একজন দর্শনার্থী পার্ক ছেড়ে গেলে শুধু তার টিকিট অবৈধ করা হবে, কিন্তু দর্শনার্থী অবজেক্টের বাকি অংশ আগের মতোই থাকবে।
revokeTicket ফাংশনটি বাস্তবায়ন করুন, যা একটি দর্শনার্থী অবজেক্ট গ্রহণ করে, টিকিট আইডেন্টিফায়ার null সেট করে এবং এরপর অবজেক্টটি রিটার্ন করে।
const visitor = {
name: 'Verena Nardi',
age: 45,
ticketId: 'H32AZ123',
};
revokeTicket(visitor);
// => { name: 'Verena Nardi', age: 45, ticketId: null }
জালিয়াতি প্রতিরোধে টিকিট আইডেন্টিফায়ারগুলো ইউনিক। টিকিট একবার প্রিন্ট হলে, সেটি ট্র্যাক করার জন্য সিস্টেমের একটি অবজেক্টে তার আইডেন্টিফায়ার কী (key) হিসেবে যোগ করা হয়।
টিকিট কোনো দর্শনার্থীর কাছে বিক্রি হওয়ার আগে, টিকিট ট্র্যাকিং অবজেক্টে এটি null মান নিয়ে সংরক্ষণ করা হয়।
কোনো দর্শনার্থীর কাছে বিক্রি হলে, দর্শনার্থীর নামটি মান হিসেবে অ্যাসাইন করা হয়।
কর্মচারীদের টিকিটের বৈধতা নিয়ে সন্দেহ হলে, তাদের সিস্টেমে টিকিটের স্ট্যাটাস পরীক্ষা করতে হয়।
ticketStatus নামে একটি ফাংশন বাস্তবায়ন করুন, যা আর্গুমেন্ট হিসেবে ট্র্যাকিং অবজেক্ট এবং একটি টিকিট আইডেন্টিফায়ার গ্রহণ করে।
এটি নিচের ফলাফলগুলোর একটি রিটার্ন করবে।
'unknown ticket id' যদি ট্র্যাকিং অবজেক্টে আইডেন্টিফায়ারটি খুঁজে পাওয়া না যায়'not sold' যদি টিকিটটি প্রিন্ট করা হয়েছে কিন্তু বিক্রি হয়নি'sold to {name}' যেখানে {name} হলো দর্শনার্থীর নাম, যদি টিকিটটি বিক্রি হয়ে থাকেconst tickets = {
'0H2AZ123': null,
'23LA9T41': 'Verena Nardi',
};
ticketStatus(tickets, 'RE90VAW7');
// => 'unknown ticket id'
ticketStatus(tickets, '0H2AZ123');
// => 'not sold'
ticketStatus(tickets, '23LA9T41');
// => 'sold to Verena Nardi'
কিছুদিন পর আপনি কর্মচারীদের কাছ থেকে ফিডব্যাক পান যে তারা চান টিকিট স্ট্যাটাসটি এক নজরে বোঝা আরও সহজ হোক। তারা শুধু দর্শনার্থীর নাম অথবা টিকিটটি অবৈধ, এটাই দেখতে চান।
simpleTicketStatus নামে একটি ফাংশন লিখুন, যা ৩ নম্বর কাজের ticketStatus ফাংশনের মতো একই আর্গুমেন্ট গ্রহণ করে।
এই ফাংশনটি শুধু দুটি ভিন্ন ফলাফলের একটি রিটার্ন করে।
'invalid ticket !!!' যদি টিকিটটি এখনো বিক্রি না হয়ে থাকে অথবা ট্র্যাকিং অবজেক্টে আইডেন্টিফায়ারটি খুঁজে পাওয়া না যায়const tickets = {
'0H2AZ123': null,
'23LA9T41': 'Verena Nardi',
};
simpleTicketStatus(tickets, '23LA9T41');
// => 'Verena Nardi'
simpleTicketStatus(tickets, '0H2AZ123');
// => 'invalid ticket !!!'
simpleTicketStatus(tickets, 'RE90VAW7');
// => 'invalid ticket !!!'
নতুন আইনি প্রয়োজনীয়তার কারণে, নতুন তৈরি দর্শনার্থী অবজেক্টগুলোতে এখন ব্যবহারকারী যে “সাধারণ শর্তাবলি” (GTC)-তে সম্মত হয়েছে, তার বিস্তারিত তথ্যও থাকে। নিচে নতুন দর্শনার্থী অবজেক্টের একটি উদাহরণ দেখতে পাবেন।
বিনোদন পার্কের ক্যাশিয়ারদের এখন পরীক্ষা করতে হয় যে একজন দর্শনার্থীকে GTC-এর নতুন সংস্করণে সই করতে হবে কি না।
এজন্য gtcVersion নামে একটি ফাংশন বাস্তবায়ন করুন, যা আর্গুমেন্ট হিসেবে একটি দর্শনার্থী অবজেক্ট গ্রহণ করে এবং GTC-এর সংস্করণ পাওয়া গেলে সেটি রিটার্ন করে।
সংস্করণের তথ্য না পাওয়া গেলে কিছুই রিটার্ন করা উচিত নয়।
const visitorNew = {
name: 'Verena Nardi',
age: 45,
ticketId: 'H32AZ123',
gtc: {
signed: true,
version: '2.1',
},
};
gtcVersion(visitorNew);
// => '2.1'
const visitorOld = {
name: 'Verena Nardi',
age: 45,
ticketId: 'H32AZ123',
};
gtcVersion(visitorOld);
// => undefined
Exercism-এ সাইন আপ করুন, JavaScript ট্র্যাকের 37টি কনসেপ্ট159টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।