Default ফ্রেন্ডজোন
কিছু স্মার্ট পোলাপান আছে, ধুমাইয়া প্রেম করে আর ক্লোজ একজনকে ফ্রেন্ডজোন করে রাখে। কোনো কারণে ব্রেকাপ হয়ে গেলে ফ্রেন্ডজোনের সাথে কিছুদিন টাইম পাস করে। তারপর আবার ফ্রেন্ডজোনের কথা ভুলে গিয়ে নতুন আরেকটা প্রেম করে। সেটাও ব্রেকাপ হয়ে গেলে আবার ফ্রেন্ডজোনের কাছে ফেরত আসে। অর্থাৎ প্রেম থাকলে ধুমাইয়া প্রেম করে। আর প্রেম না থাকলে ফ্রেন্ডজোনের সাথে সাময়িকভাবে টাইমপাস করে।
এই কাজটা জাভাস্ক্রিপ্টের ফাংশনও করে।
এইখানে একটা ফাংশন আছে। আমরা ভদ্র বাচ্চার মতো এই function কল করার সময় দুটা ভ্যালু বা দুইটা ভেরিয়েবলকে প্যারামিটার (arguments) হিসেবে পাঠিয়ে দেই। যেমন, নিচে 5 এবং 7-কে দেয়া হয়েছে।
function add(num1, num2){
const result = num1 + num2;
return result;
}
const sum = add(5, 7);
console.log(sum);
Output: 12তুই যেহেতু ভদ্র বাচ্চা, আউটপুটও ভদ্রভাবে পাবি। কিন্তু কিছু বাচ্চা আছে অভদ্র, একটু দুষ্ট; তারা দুইটা parameter-এর জায়গায় একটা parameter দিল।
function add(num1, num2){
const result = num1 + num2;
console.log(num1, num2, result);
return result;
}
const sum = add(5);
console.log(sum);
Output:
5 undefined NaN
NaNফাংশন কল করার সময় যখন কোনো প্যারামিটারের মান পাবে না, তখন ওটা undefined হয়ে যাবে। অর্থাৎ তুই একটা প্যারামিটারের মান দিয়ে ফাংশনকে কল করেছিস। তাই সেটা প্রথম প্যারামিটার অর্থাৎ num1-এর মান হয়ে যাবে। আর তুই যেহেতু সেকেন্ড প্যারামিটারে মান দিস নাই, তাই সেটার মান ডিফাইন করা নাই। তখন num2-এর মান undefined হয়ে যাবে। তারপর থেকে শুরু হবে ক্যাচাল।
কারণ, ফাংশনের ভিতরে num1 + num2-এর জায়গায় হয়ে যাবে 5 + undefined, আর কোনো সংখ্যার সাথে undefined যোগ করলে সেটার মান NaN বা Not a Number হয়ে যাবে। অর্থাৎ 5-এর সাথে undefined যোগ করা যায় না, তাই NaN আউটপুট হবে।
আবার, একইভাবে তুই একদম কোনো প্যারামিটার না দিয়েই যদি add() ফাংশনকে কল করিস, তখন ফাংশনের ভিতরে undefined + undefined-এর মানও NaN দেখাবে।
তাহলে করণীয় কী? করণীয় হচ্ছে প্যারামিটারের ডিফল্ট মান রাখা। যাতে প্যারামিটারের মান দিলে যেটা দিবে, সেটা ইউজ হবে। আর যদি কোনো কারণে মান না দেয়, তাহলে যেন ডিফল্ট মান ইউজ করা যায়।
তখন ওই default মান ব্যবহার করে ফাংশনটি কোনো error ছাড়াই চলবে। বিষয়টা একটা উদাহরণ দেখলে আরও বেশি ক্লিয়ার হবে:
function add(num1, num2 = 0){
const result = num1 + num2;
console.log(num1, num2, result);
return result;
}
const sum = add(5);
console.log(sum);
Output:
5 0 5
5এখানে খেয়াল করে দেখবি, আমরা আমাদের ফাংশনের দ্বিতীয় parameter-এর default মান 0 করে দিয়েছি। জাস্ট প্যারামিটারের নামের পর একটা সমান চিহ্ন দিয়ে 0 ডিফল্ট মান হিসেবে সেট করে দিছি। যাতে এই ফাংশনটাকে কল করার সময় যদি একটা parameter দেয়া হয়, অর্থাৎ সেকেন্ড প্যারামিটার না দেয়া হয়, তখন সে সেকেন্ড প্যারামিটারকে 0 হিসেবে ধরে নিবে। ঠিকঠাক মতো আউটপুট দিবে। কোনো error দিবে না।
আমরা চাইলে সব প্যারামিটারের ডিফল্ট মান ইউজ করতে পারি।
function add(num1 = 0, num2 = 0){
const result = num1 + num2;
console.log(num1, num2, result);
return result;
}
const sum = add();
console.log(sum);
const total = add(17, 19);
console.log(total);
Output:
0 0 0
0
17 19 36
36এবার বল, এখানে কী ঘটনা ঘটেছে? ওই যে default মান যেটা দিয়েছিলাম, সেটার জায়গায় তুই যখন তোর দ্বিতীয় parameter-সহ দিয়েছিস, তখন সেটা কিন্তু ওই default মানকে replace করে ফেলেছে এবং তোর কোড বা ফাংশন পারফেক্টলি রান করেছে কোনো সমস্যা ছাড়াই।
কখনো যদি ফাংশনের প্যারামিটার হিসেবে অবজেক্ট থাকে, তাহলে সেটার ডিফল্ট মান হিসেবে একটা খালি অবজেক্ট হতে পারে। আবার কিছু কিছু ক্ষেত্রে অবজেক্টের ভিতরে কিছু প্রোপার্টির ডিফল্ট মানসহ হতে পারে। একইভাবে যদি ফাংশনের প্যারামিটার হিসেবে array থাকে, তখন ডিফল্ট মান হিসেবে একটা খালি array হতে পারে। নিচের উদাহরণের মতো—
function createUser(name = "", education = { }, age = 0, hobbies = [ ]) {
}কিছু ডিফল্ট মানের উদাহরণ
১. যোগ করলে সংখ্যা টাইপ প্যারামিটার হলে সেটার ডিফল্ট মান 0 হতে পারে। আবার ক্ষেত্রবিশেষে অন্য কোনো উপযুক্ত সংখ্যা হতে পারে।
২. গুণ বা ভাগ করলে ডিফল্ট মান 1 হতে পারে।
৩. স্ট্রিং হলে সেটার ডিফল্ট মান খালি স্ট্রিং ('') হতে পারে।
৪. প্যারামিটার array হলে সেটার ডিফল্ট মান [ ] হতে পারে।
৫. প্যারামিটার object হলে সেটার ডিফল্ট মান { } হতে পারে।
আর মন খারাপ করবি না, যদি সে তোকে ডিফল্ট ভ্যালু হিসেবে ফ্রেন্ডজোন করে রাখে।
Practice:
- এমন একটি ফাংশন তৈরি কর যা তিনটি সংখ্যার যোগফল বের করবে। ডিফল্ট মান হিসেবে প্রতিটি প্যারামিটারের জন্য 0 সেট কর।
- তুই এমন একটি ফাংশন লিখবি, যেখানে টাকা জমা দেওয়ার সুযোগ থাকবে। যদি কোনো টাকার পরিমাণ না দেওয়া হয়, তাহলে জমা হিসেবে ডিফল্ট 50 টাকা দেখাবে।
- এমন একটি ফাংশন তৈরি কর, যেখানে নাম আর তার মাসিক আয় নিবি। যদি নাম না দেওয়া হয়, তাহলে ডিফল্ট হিসেবে anonymous ইউজ করবি। আর মাসিক আয় দেয়া না থাকলে সেখানে ডিফল্ট হিসেবে 0 ইউজ করবি।
- এমন একটি ফাংশন লিখ, যা একটি সংখ্যা নেবে এবং সেটার বর্গ বের করবে। যদি সংখ্যা না দেওয়া হয়, সেটার ডিফল্ট মান 1 রাখ।
- এমন একটি ফাংশন বানা, যেটা কোনো পণ্যের নাম ও তার মূল্য নিবে। যদি নাম না দেওয়া হয়, তাহলে "Unknown product" এবং মূল্য না থাকলে 1 সেট কর।
- একটা ফাংশন তৈরি কর, যা তোর সব প্রিয় বইয়ের নাম অ্যারে প্যারামিটার হিসেবে নিবে। যদি কোনো প্যারামিটার না পাঠানো হয়, তাহলে ডিফল্ট একটা অ্যারে রাখবি, সেটার মধ্যে একটা মান থাকবে JS book নামে।
- একটি ফাংশন তৈরি কর, যেখানে একটি অবজেক্ট প্যারামিটার নিবে। অবজেক্টে price এবং quantity থাকবে। যদি অবজেক্ট না পাঠানো হয়, ডিফল্ট মান হিসেবে price 10 এবং quantity 1 সেট কর। ফাংশন total price রিটার্ন করবে।
- এমন একটি ফাংশন বানা, যেখানে একটি অ্যারে প্যারামিটার নিবে। প্রতিটি উপাদানকে 2 দিয়ে গুণ করে নতুন অ্যারে রিটার্ন করবে। যদি অ্যারে না দেওয়া হয়, ডিফল্ট হিসেবে [5, 10, 15] সেট কর।
- একটি ফাংশন তৈরি কর, যা একটি অবজেক্ট প্যারামিটার নিবে। অবজেক্টে principal এবং rate থাকবে। যদি অবজেক্ট না পাঠানো হয়, ডিফল্ট principal 1000 এবং rate 5 রাখ। ফাংশন simple interest হিসাব কর, এই ফর্মুলা দিয়ে (principal * rate / 100), তাহলে রেজাল্ট রিটার্ন করবে।
- একটি ফাংশন তৈরি কর, যা একটি অবজেক্ট প্যারামিটার নিবে। অবজেক্টে salary এবং tax থাকবে। যদি অবজেক্ট না পাঠানো হয়, ডিফল্ট salary 50000 এবং tax 10 সেট কর। ফাংশন এর ভিতরে ট্যাক্স এর পার্সেন্ট দিয়ে ট্যাক্স এর টাকার পরিমান বের করবি তারপর স্যালারি থেকে ট্যাক্স এর টাকার পি পরিমান বিয়োগ করে রেজাল্ট রিটার্ন করবি।