রহস্যময়ী জাভাস্ক্রিপ্টঃ ('b' + 'a'+ + 'a' + 'a').toLowerCase() নাকি বানানা ('banana') হয়?!?!

আপনারা অনেকেই হয়তো এই সমস্যাটা বিভিন্ন জায়গায় দেখেছেন যে ('b' + 'a'+ + 'a' + 'a').toLowerCase() সমান বানানা 'banana' দেখাচ্ছেঃ

('b' + 'a'+ + 'a' + 'a').toLowerCase()
// 'banana'

toLowerCase এর কাজ হচ্ছে আউটিপুটটাকে ছোটো হাতের অক্ষরে নেওয়া, এটা বাদ দিলে আউটপুটটা অনেকটা প্রেডিক্টেবল হতে পারে অনেকের কাছেঃ

'b' + 'a'+ + 'a' + 'a'
// 'ba**NaN**a'

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

ইউনারি প্লাস অপারেটর

জাভাস্ক্রিপ্টসহ অন্যান্য প্রোগ্রামিং ল্যাংগুয়েজ এই + জিনিসটার অনেক কাজ থাকতে পারে। যেমন দুই অপারেন্ডের মাঝে বসলে অ্যাডিশন অপারেটর হিসেবে কাজ করে, আবার একটা অপারেন্ডের আগে পিছে বসলে ইউনারি অপারেটর হিসেবে কাজ করে, যেমনঃ ইউনারি প্লাস(+x), ইউনারি মাইনাস(-x), ইউনারি ইনক্রিমেন্ট(++x, x++), ইউনারি ডিক্রিমেন্ট(--x, x--) অপারেটর হিসেব কাজ করতে পারে। ইউনারি প্লাস + অপারেটর অপারেন্ডের আগে বসে অপারেন্ডকে নাম্বারে কনভার্ট করার চেষ্টা করবে যদি নাম্বার না হয়ে থাকেঃ

+'4'
// 4

কিন্তু আবার যদি সেই ভ্যালুকে নাম্বারে নেওয়া না যায় তাহলে এটা NaN রিটার্ন করেঃ

+'a'
// NaN

অপারেটর প্রেসিডেন্স(Presedence)

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

মূল সমস্যা

এবার আমাদের এই দুইটার ব্যাপারে কনসেপ্ট ক্লিয়ার থাকলে আমরা আমাদের মূল সমস্যাটির দিকে ফোকাস করতে পারিঃ

'b' + 'a'+ + 'a' + 'a'

এখানে খেয়াল করবেন মাঝখানে এরকম 'a'+ + 'a' আছে, যেখানে একটা আসলে ইউনারি প্লাস + অপারেটর(দ্বিতীয় + টা), আর আরেকটা অ্যাডিশন + অপারেটর। প্রেসিডেন্স যেহেতু ইউনারি প্লাস + অপারেটর এর বেশী তাই প্রথমে +'a’ অংশটার হিসাব হবেঃ

+'a'
// NaN

এটা হয়ে গেলেই আমাদের আসল রেজাল্ট অনেকটা প্রেডিক্টেবল হয়ে যায়, কারণ এটার পড় বাকি অংশে অ্যাডিশন অপারেটর + এর কারসাজি হবেঃ

'b' + 'a'+ NaN + 'a'

এখানে যেহেতু কেউই নাম্বার না, তাই এখানে অ্যাডিশন প্লাস + অপারেটরটি স্ট্রিং হিসেবে যুক্ত(String Concatenation) করার কাজ করবেঃ

'b' + 'a'+ NaN + 'a'
// 'ba' + NaN + 'a'

'ba' + NaN + 'a'
// 'baNaN' + 'a'

'baNaN' + 'a'
// 'baNaNa'

ঠিক এভাবেই পুরোটার ফলাফল হয়ে গেলো ‘baNaNa’, তারপর এটাকে ছোটো হাতের অক্ষরে নিলেঃ

'baNaNa'.toLowerCase()
// 'banana'

সর্বশেষে ঠিক এভাবেই ('b' + 'a'+ + 'a' + 'a').toLowerCase() সমান বানানা 'banana’ হয়ে গেলো।

শেয়ার করুন

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

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

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