রহস্যময়ী জাভাস্ক্রিপ্টঃ 9 + '1’ সমান ‘91’, আবার 91 - ‘1’ সমান 90 হচ্ছে কিভাবে?

আপনারা হয়তো অনেকসময় দেখেছেন যে জাভাস্ক্রিপ্ট এ 9 + '1' সমান '91' আবার 91 - '1' সমান 90 হয়ে যাচ্ছে। ভালো করে খেয়াল করুন এখানে প্রথমটায় একটা নাম্বারের সাথে প্লাস + অপারেটর ইউজ করে একটা স্ট্রিং অ্যাড করা হয়েছে, ফলাফলে নাম্বারটার সাথে ডান পাশে স্ট্রিংটা বসে গিয়ে/যুক্ত হয়ে ফলাফল দেখাচ্ছে। আর পরেরটায় একটা নাম্বারের সাথে মাইনাস - অপারেটর ইউজ করে একটা স্ট্রিং মাইনাস করা হয়েছে, বাট এক্ষেত্রে অ্যাকচুয়ালি ৯১ থেকে ১ বিয়োগ হয়ে সেটার ফলাফলই দেখাচ্ছে। প্রথমে স্ট্রিংটা যোগ না হয়ে পাশে বসলেও পরেরটায় কিন্তু ঠিকই বিয়োগ হয়েছেঃ

9 + '1'
// 91

91 - '1'
// 90

এখানে লক্ষণীয় যে প্লাস + , মাইনাস - এগুলো কিন্তু অপারেটর, জাভাস্ক্রিপ্ট এ এরকম আরো অনেক অপারেটর আছে যেগুলোও ঠিক এরকম কিছু উইয়ার্ড বিহ্যেইভ করে যেগুলো এই সিরিজের পরে আরো দেখানো হবে।

তবে এটা কেনো এমন হচ্ছে সেটা বুঝতে হলে প্রথমেই আমাদের প্লাস + অপারেটরের কাজটা বুঝতে হবে, প্লাস যেমন দুইটা অপারেন্ডের মাঝখানে বসলে দুইটা সংখ্যার মধ্যে যোগ(Addition) করে, ঠিক তেমনি দুইটা স্ট্রিংও কিন্তু অ্যাড(String Concatenation) করেঃ

11 + 11
// 22

'Hello' + ' ' + 'World'
// 'Hello World' 

তো আমাদের প্রথমে উদাহরণে যখন দেখা যায় আমরা নাম্বার ৯ এর সাথে স্ট্রিং ১ যোগ করতে চাচ্ছি, তখন জাভাস্ক্রিপ্ট এখানে যোগ(Additon) করে না, যেহেতু নাম্বারের সাথে স্ট্রিং অ্যাড করা যায় না। এখানে জাভাস্ক্রিপ্ট স্ট্রিং যুক্ত (String Concatenation) করে। এখানে স্ট্রিং যুক্ত করার সময় নাম্বার ৯ যেহেতু স্ট্রিং না, তাই এটাকে অটোমেটিক টাইপ কোয়ারশন ইউজ করে স্ট্রিং এ কনভার্ট করে, তারপর দুইটাকে স্ট্রিং হিসেবে যুক্ত করে। অবশ্যই এটা করা হয় ইকমাস্ক্রিপ্ট এর করা স্পেক বা নিয়ম অনুযায়ী।

এখন আবার এই টাইপ কোয়ারশন(coercion) জিনিসটাই বা কি? হ্যা এটাও একটা ইন্টারেস্টিং বিষয়, চলুন আমরা এবার জাভাস্ক্রিপ্ট এর টাইপ কোয়ারশন(coercion) সম্পর্কে কিছুটা ধারনা নেই।

টাইপ কোয়ারশন(Coercion)

টাইপ কোয়ারশন বলতে মূলত বুঝানো হয় অটোমেটিকালি একটা ভ্যালুর একটা নির্দিষ্ট ডেটা টাইপ থেকে আরেকটা ডেটা টাইপে কনভার্ট হয়ে যাওয়াটাকে। এটা হতে পারে নাম্বার থেকে স্ট্রিং, স্ট্রিং থেকে নাম্বারে বা বুলিয়ান থেকে নাম্বার ইত্যাদি ইত্যাদিতে অটোমেটিক কনভার্ট হয়ে যাওয়া বিভিন্ন অপারেটর ইউজ করার সময়।

ঠিক একারণেই উপরে আমরা প্লাস + অপারেটর ইউজ করার কারণে, আর একপাশে একটা স্ট্রিং থাকার কারণে, স্ট্রিং এ সাথে যেহেতু যোগ সম্ভব না তাই স্ট্রিং হিসেবে নাম্বারটাও স্ট্রিং এ কনভার্ট হয়ে, দুইটা স্ট্রিং যুক্ত হয়ে এরকম ফলাফল এসেছে। আশা করি এটা ক্লিয়ার এবার।

তবে তাহলে পরেরটা আবার এরকম কেনো হচ্ছে, নাম্বার ৯১ থেকে স্ট্রিং ১ মাইনাস করায় আবার ঠিকঠাক বিয়োগই হয়ে যাচ্ছে কেন? উত্তর সেই অলমোস্ট সেইমই। প্রথমেই দেখেন এক্ষেত্রে প্লাস + অপারেটরের দুইরকম কাজ থাকলেও মাইনাস - অপারেটর দুইটা অপারেন্ড এর মাঝখানে বসলে এর কাজ কিন্তু একটাই, সেটা হচ্ছে বিয়োগ করা।

আর তাই এখানে প্রথমে নাম্বার ৯১ এর সাথে মাইনাস - অপারেটর ইউজ করায় পরে যদি নন-নাম্বার কিছু থাকে জাভাস্ক্রিপ্ট চেষ্টা করবে সেটাকে নাম্বারে কনভার্ট করতে টাইপ কোয়ারশন ইউজ করে(নিয়ম অনুযায়ী)। এখানে লাকিলি আমাদের এমন একটা স্ট্রিংই আছে যেটাকে অ্যাকচুয়ালি নাম্বারে কনভার্ট করা যায়ঃ

Number('1')
// 1

ফলাফলে নাম্বার ৯১ থেকে নাম্বার ১ বিয়োগ হয়ে ফলাফলে নাম্বার ৯০ হয়েছেঃ

91 - '1'
// 90

এখন কথা আসে এখানে নাম্বার না থেকে যদি স্ট্রিং থাকতো তাহলে ফলাফল কি আসতো? জাভাস্ক্রিপ্ট তারপরেও ট্রাই করবে নাম্বারে কনভার্ট করতে, কিন্তু এটা যেহেতু নাম্বারে কনভার্ট করা যাবে না তাই ফলাফল NaN দেখাবেঃ

91 - '20one'
// NaN 

ঘটনা আসলে টাইপ কোয়ারশনের সময়েই ঘটে গিয়েছেঃ

Number('20one') 
// NaN

91 - NaN
// NaN

আশা করি এবার বিষয়টা আপনাদের কাছে পরিষ্কার হয়েছে। এখন থেকে এরকম যতরকমের জিনিস দেখবেন, একটু এভাবে চিন্তা করে দেখবেন। তাহলেই আপনাদের কাছে ফলাফলটা পরিষ্কার হয়ে যাবে। তাছাড়া কখন কোন ডেটা টাইপকে কোন ডেটা টাইপে টাইপ কয়ারশন ইউজ করা হবে সেটা নির্ভর করে অপারেটরের উপরে এবং ইকমাস্ক্রিপ্ট এর ডিফাইন করা স্পেক অনুযায়ী।

তবে টাইপ কোয়ারশন নিয়ে আলোচনা এখানেই শেষ না, এটার আরো কমপ্লিকেটেড বিষয় নিয়ে আমরা আস্তে আস্তে সামনের পর্বগুলোতে আলোচনা করবো।

শেয়ার করুন

লেখাটি ভাল লাগলে সোশ্যাল মিডিয়ায় শেয়ার করুন। আপনার কলিগ, বন্ধু কিংবা প্রিয় কারও কাজে লাগতে পারে। জানেন তো, শেয়ারিং ইজ কেয়ারিং!

সাবস্ক্রিপশন সেন্টার

প্রতিদিন ওয়েবসাইটে আসা আপনার জন্য কষ্টকর হতে পারে। তাই যখনই আমি নতুন ব্লগ পোস্ট, সিরিজ, বই বা ভিডিও পাবলিশ করব,
তখনই তা আপনার ইমেইলে পেতে সাবস্ক্রাইব করুন। নো স্প্যামিং প্রমিজ!