২২ ডিসেম্বর, ২০২২
পড়তে মিনিট লাগতে পারে

রহস্যময়ী জাভাস্ক্রিপ্টঃ 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

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

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

ট্যাগঃ
শেয়ার করুনঃ

ক্রমানুসারে এই জাভাস্ক্রিপ্ট সিরিজঃ

জাভাস্ক্রিপ্ট ব্যাসিক
জাভাস্ক্রিপ্টঃ কি, কেন, কখন? জাভাস্ক্রিপ্টঃ কোথায় এবং কিভাবে ইউজ করা হয়? জাভাস্ক্রিপ্টঃ ব্যাসিক ক্রোম ডেভেলপার কন্সোল জাভাস্ক্রিপ্টঃ ভ্যারিয়েবল এবং ডাটা টাইপ জাভাস্ক্রিপ্টঃ অপারেটর নিয়ে সবকিছু জাভাস্ক্রিপ্টঃ কন্ডিশনাল স্টেটমেন্ট নিয়ে সবকিছু জাভাস্ক্রিপ্টঃ লুপ নিয়ে সবকিছু জাভাস্ক্রিপ্টঃ অ্যারে নিয়ে সবকিছু জাভাস্ক্রিপ্টঃ ব্যাসিক অবজেক্ট জাভাস্ক্রিপ্টঃ ব্যাসিক ফাংশন জাভাস্ক্রিপ্টঃ স্টেটমেন্ট আর এক্সপ্রেশন জাভাস্ক্রিপ্টঃ ড্রাই প্রিন্সিপ্যাল জাভাস্ক্রিপ্টঃ নাকি ইকমাস্ক্রিপ্ট? জাভাস্ক্রিপ্টঃ বিহ্যাইন্ড দ্যা সীন জাভাস্ক্রিপ্টঃ হোইস্টিং(Hoisting) নিয়ে ধারণা জাভাস্ক্রিপ্টঃ স্কোপ(Scope) নিয়ে ধারণা জাভাস্ক্রিপ্টঃ ক্লোজারস(Closures) নিয়ে ধারণা জাভাস্ক্রিপ্টঃ ইফি, Immediately Invoked Function Expressions (IIFE)
জাভাস্ক্রিপ্ট অ্যাডভান্স
জাভাস্ক্রিপ্ট অ্যাডভান্সঃ ‘this’ কীওয়ার্ড জাভাস্ক্রিপ্ট অ্যাডভান্সঃ call(), bind() এবং apply() মেথড জাভাস্ক্রিপ্ট অ্যাডভান্সঃ অবজেক্ট ওরিয়েন্টেড জাভাস্ক্রিপ্ট জাভাস্ক্রিপ্ট অ্যাডভান্সঃ ফাংশন কন্সট্রাকটর(Constructor) এবং ‘new’ কীওয়ার্ড জাভাস্ক্রিপ্ট অ্যাডভান্সঃ ইনহেরিট্যান্স (Inheritance) জাভাস্ক্রিপ্ট অ্যাডভান্সঃ স্ট্রিক্ট (Strict) মোড
জাভাস্ক্রিপ্ট ইএস ৬(ES6)
জাভাস্ক্রিপ্ট ইএস ৬(ES6): নতুন কি আছে? জাভাস্ক্রিপ্ট ইএস ৬(ES6): let এবং const দিয়ে ভ্যারিয়েবল ডিক্লেয়ার করা জাভাস্ক্রিপ্ট ইএস ৬(ES6):ইফি (Immediately Invoked Function Expressions) জাভাস্ক্রিপ্ট ইএস ৬(ES6): টেমপ্লেট লিটারেল(Template Literal) ও স্ট্রিং মেথড জাভাস্ক্রিপ্ট ইএস ৬(ES6): অ্যারো (Arrow) ফাংশন ও লেক্সিক্যাল(Lexical) ‘this’ কীওয়ার্ড জাভাস্ক্রিপ্ট ইএস ৬(ES6): অ্যারে জাভাস্ক্রিপ্ট ইএস ৬(ES6): স্প্রেড(Spread) অপারেটর জাভাস্ক্রিপ্ট ইএস ৬(ES6): ডি-স্ট্রাকচারিং (Destructuring) জাভাস্ক্রিপ্ট ইএস ৬(ES6): রেস্ট(Rest) প্যারামিটার জাভাস্ক্রিপ্ট ইএস ৬(ES6): ডিফল্ট(Default) প্যারামিটার জাভাস্ক্রিপ্ট ইএস ৬(ES6): ম্যাপ (Map) জাভাস্ক্রিপ্ট ইএস ৬(ES6): ক্লাস (Class) জাভাস্ক্রিপ্ট ইএস ৬(ES6): ক্লাস ও ইনহেরিট্যান্স (Inheritance) জাভাস্ক্রিপ্ট ইএস ৬(ES6): সব ইনভারোমেন্ট এ ইএস৬
নিত্যদিনের জাভাস্ক্রিপ্ট
নিত্যদিনের জাভাস্ক্রিপ্টঃ ফার্স্ট ক্লাস ফাংশন ও হাইয়ার অর্ডার ফাংশন নিত্যদিনের জাভাস্ক্রিপ্টঃ map(), filter() ও reduce() নিত্যদিনের জাভাস্ক্রিপ্টঃ some() ও every() মেথড নিত্যদিনের জাভাস্ক্রিপ্টঃ অবজেক্ট এ লুপ চালানো নিত্যদিনের জাভাস্ক্রিপ্টঃ ডট নোটেশন এবং ব্র্যাকেট নোটেশন নিত্যদিনের জাভাস্ক্রিপ্টঃ ম্যাথ (Math) অবজেক্ট নিত্যদিনের জাভাস্ক্রিপ্টঃ ডেট (Date) অবজেক্ট নিত্যদিনের জাভাস্ক্রিপ্টঃ লজিক্যাল অপারেটর অর (।।) এবং অ্যান্ড (&&) নিত্যদিনের জাভাস্ক্রিপ্টঃ কন্ডিশনাল/টার্নারি (Ternary) অপারেটর নিত্যদিনের জাভাস্ক্রিপ্টঃ রেগুলার এক্সপ্রেশন (Regular Expression) নিত্যদিনের জাভাস্ক্রিপ্টঃ এরর হ্যান্ডলিং (Error Handling) নিত্যদিনের জাভাস্ক্রিপ্টঃ ডেভেলপার কন্সোল (Console) নিত্যদিনের জাভাস্ক্রিপ্টঃ অ্যাসিনক্রোনাস (Asynchronous) নিত্যদিনের জাভাস্ক্রিপ্টঃ কলব্যাক(Callback) ফাংশন নিত্যদিনের জাভাস্ক্রিপ্টঃ প্রমিস (Promise) নিত্যদিনের জাভাস্ক্রিপ্টঃ async এবং await
রহস্যময়ী জাভাস্ক্রিপ্ট
রহস্যময়ী জাভাস্ক্রিপ্টঃ type of NaN === “number” কেনো? রহস্যময়ী জাভাস্ক্রিপ্টঃ 9 + '1’ সমান ‘91’, আবার 91 - ‘1’ সমান 90 হচ্ছে কিভাবে? রহস্যময়ী জাভাস্ক্রিপ্টঃ true + true + true === 3, true - true === 0 হচ্ছে কিভাবে? রহস্যময়ী জাভাস্ক্রিপ্টঃ [] === 0 মিথ্যা(false) হলেও [] == 0 আবার সত্য(true) হয় কিভাবে? রহস্যময়ী জাভাস্ক্রিপ্টঃ [] === ‘’ মিথ্যা(false) হলেও [] == ‘’ আবার সত্য(true) হয় কিভাবে? রহস্যময়ী জাভাস্ক্রিপ্টঃ [] + [] খালি স্ট্রিং(’’) হচ্ছে কেনো? রহস্যময়ী জাভাস্ক্রিপ্টঃ [] + {} আবার কেনো '[object Object]’ দেখাচ্ছে? রহস্যময়ী জাভাস্ক্রিপ্টঃ {} + [] আবার শূন্য(0) কেনো? রহস্যময়ী জাভাস্ক্রিপ্টঃ [] + {} === {} + [] কিভাবে সত্য true হচ্ছে?