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

রহস্যময়ী জাভাস্ক্রিপ্টঃ type of NaN === “number” কেনো?

শেয়ার করুনঃ

যদিও NaN মানে হচ্ছে Not a Number, বাট তারপরেও এটার টাইপ দেখতে গেলে দেখা যায় এটাকে “number” টাইপ দেখানো হচ্ছেঃ

typeof NaN === "number"
// true

আপনারা যদি এখানে ইকমাস্ক্রিপ্ট এর স্পেসেসিফিকেশন দেখেন, তাহলে দেখবেন NaN কে এখানে নাম্বার টাইপ হিসেবে উল্লেখ করা হয়েছে।

NaN হচ্ছে মূলত স্পেসেফিক টাইপের কিছু ভ্যালু যেগুলোকে আমাদের জানাশোনা, অলরেডি আছে, রিয়েল নাম্বার দিয়ে প্রকাশ করতে পারি না। আমাদের নিউমিরেকেলি অনেক নাম্বারই শতভাগ প্রকাশ করা যায় না বিভিন্ন লিমিটেশন এর কারণে(যেমন পাই এর মান), রাউন্ড করে প্রকাশ করতে হয়। NaN ও এরকম স্পেসেফিক কিছু ক্ষেত্রে ইউজ হয়।

আবার আরেকটা জিনিস খেয়াল করবেন যে একটা NaN আরেকটা NaN এর সমানও দেখায় নাঃ

NaN === NaN
// false

এটার মূলত কারণ হচ্ছে এই প্রকাশ করা যায় না ভ্যালুগুলো অ্যাকচুয়ালি ডিফারেন্ট হতে পারে, তাই আপনি হলফ করে বলতে পারবেন না একটা আরেকটার সমান। সেজন্যেই মূলত এখানে false দেখানো হয়েছে। সেইম গ্রেটার দেন, লেস দেন, কম্পারিজন করতে গেলেও দেখবেনঃ

NaN < NaN
// false

NaN > NaN
// false

NaN <= NaN
// false

NaN >= NaN
// false

সবই false , তবে এরা ডিফারেন্ট কিনা সেটা চেক করলে দেখবেন আবার true ই দেখাচ্ছেঃ

NaN !== NaN
// true

তবে মজার ব্যাপার হলো এই NaN এর আইডিয়াটা কিন্তু জাভাস্ক্রিপ্টের ক্ষেত্রেই ইউনিক কোন বিষয় না। এটা অ্যাকচুয়ালি কম্পিউটার সাইন্সেরই কমন একটা প্রিন্সিপ্যাল

NaN ওরফে Not a Number হচ্ছে নিউমেরিক ডেটা টাইপের একটা মেম্বার যেটা প্রকাশ করা যায় না এমন ভ্যালু প্রকাশে ব্যবহৃত হয়। মানে অনেকরকম ভ্যালু প্রকাশেই এটা ব্যবহার করা হতে পারে।

যারা টুকটাক ম্যাথ পারেন তারা অবশ্যই জানেন জিরো কে জিরো দিয়ে ভাগ করলে ফলাফল হচ্ছে আনডিফাইন্ড বা রিয়েল নাম্বার দিয়ে প্রকাশ করা যায় না, সেক্ষেত্রেই কিন্তু এই NaN ব্যবহৃত হয়ঃ

0 / 0
// NaN

তারপর একটা নেগেটিভ নাম্বারের স্কয়ার রুটও রিয়েল নাম্বার দিয়ে প্রকাশ করা যায় না, সেক্ষেত্রে এটাও NaN দিয়ে প্রকাশ করা হয়ঃ

Math.sqrt(-13)
// NaN

তারপরে খেয়াল করেন উপরের দুইটা দুইরকম ম্যাথের ফলাফল, বাট সেই সেইম NaN দিয়েই প্রকাশ করা হচ্ছে। কিন্তু 0 / 0 কিন্তু তাই বলে Math.sqrt(-13) এর সমান না।

চাইলে কিন্তু এদের দুইটার ক্ষেত্রে দুইরকমের জিনিসও ইউজ করা যেতো, বাট এরকম কয়টার ক্ষেত্রে করবেন? সবার জন্য আলাদা আলাদা করতে গেলে ব্যাপারটা একদমই আউট অব কন্ট্রোলে চলে যেতো। তাই এসব ব্যাতিক্রমি ভ্যালু প্রকাশের জন্য NaN ব্যবহার করা হয়।

এ কারণেই NaN নিজে একটা “number” টাইপ আর নিজে নিজের সমান না, বড়ও না, এমনকি ছোটও না।

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

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

জাভাস্ক্রিপ্ট ব্যাসিক
জাভাস্ক্রিপ্টঃ কি, কেন, কখন? জাভাস্ক্রিপ্টঃ কোথায় এবং কিভাবে ইউজ করা হয়? জাভাস্ক্রিপ্টঃ ব্যাসিক ক্রোম ডেভেলপার কন্সোল জাভাস্ক্রিপ্টঃ ভ্যারিয়েবল এবং ডাটা টাইপ জাভাস্ক্রিপ্টঃ অপারেটর নিয়ে সবকিছু জাভাস্ক্রিপ্টঃ কন্ডিশনাল স্টেটমেন্ট নিয়ে সবকিছু জাভাস্ক্রিপ্টঃ লুপ নিয়ে সবকিছু জাভাস্ক্রিপ্টঃ অ্যারে নিয়ে সবকিছু জাভাস্ক্রিপ্টঃ ব্যাসিক অবজেক্ট জাভাস্ক্রিপ্টঃ ব্যাসিক ফাংশন জাভাস্ক্রিপ্টঃ স্টেটমেন্ট আর এক্সপ্রেশন জাভাস্ক্রিপ্টঃ ড্রাই প্রিন্সিপ্যাল জাভাস্ক্রিপ্টঃ নাকি ইকমাস্ক্রিপ্ট? জাভাস্ক্রিপ্টঃ বিহ্যাইন্ড দ্যা সীন জাভাস্ক্রিপ্টঃ হোইস্টিং(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 হচ্ছে?