JavaScript-এ মান বিভিন্ন টাইপের হতে পারে। একটি ভ্যারিয়েবলের টাইপ স্পষ্ট টাইপ কনভার্সনের মাধ্যমে পরিবর্তন করা যায়। এর পাশাপাশি, প্রসঙ্গের প্রয়োজন হলে JavaScript টাইপ কোয়ার্শন (অন্তর্নিহিত টাইপ কনভার্সন)-ও করে।
অন্য অনেক ভাষার মতো JavaScript-এ (ভিন্ন) কোনো টাইপে কাস্ট করার আলাদা কোনো কনস্ট্রাক্ট নেই, তবে বদলে কিছু বিল্ট-ইন হেল্পার ব্যবহার করা যায়।
সবচেয়ে উল্লেখযোগ্য হলো গ্লোবাল অবজেক্ট Boolean, Number এবং String, যেগুলোকে ফাংশন হিসেবে ব্যবহার করে একটি মানকে সংশ্লিষ্ট টাইপে রূপান্তর করা যায়।
Boolean(value) দিয়ে আপনি যেকোনো মানকে বুলিয়ানে রূপান্তর করতে পারেন।
এটা কীভাবে কাজ করে?
এমন একটি নির্দিষ্ট মানের সেট আছে, যাদের ফ্যালসি মান বলা হয়, যেগুলো false-এ রূপান্তরিত হয়।
সবচেয়ে গুরুত্বপূর্ণ হলো, false, 0, খালি স্ট্রিং, null, undefined এবং NaN ফ্যালসি।
MDN-এর "Falsy" নিবন্ধে পুরো তালিকাটি দেখা যায়।
বাকি সব মানের জন্য Boolean true রিটার্ন করে।
এসব মানকে ট্রুথি বলা হয়।
Boolean(-1);
// => true
Boolean(0);
// => false
Boolean(' ');
// => true
Boolean('');
// => false
মনে রাখবেন, বর্ণিত নিয়ম অনুযায়ী JavaScript-এ '0', 'false', [] এবং {} ট্রুথি।
Number(value) দিয়ে একটি মানকে সংখ্যায় রূপান্তর করা যায়।
স্ট্রিংয়ের শুরু ও শেষের হোয়াইটস্পেস উপেক্ষা করা হয় এবং খালি স্ট্রিং 0-তে রূপান্তরিত হয়।
আপনি যদি কোনো নন-প্রিমিটিভ মান বা এমন স্ট্রিং রূপান্তর করতে চেষ্টা করেন যা কোনো সংখ্যা প্রকাশ করে না, তাহলে কোনো এরর থ্রো হবে না।
বরং ফলাফল হয় NaN (Not-A-Number)।
Number(' -12.34 ');
// => -12.34
Number('1,2');
// => NaN
Number('1 2');
// => NaN
Number('');
// => 0
Number('10e3');
// => 10000
Number({ key: '123' });
// => NaN
নিচে দেখুন, অন্য প্রিমিটিভ মানের জন্য Number কী রিটার্ন করে।
Number(true);
// => 1
Number(false);
// => 0
Number(null);
// => 0
Number(undefined);
// => NaN
মনে রাখবেন, শেষ উদাহরণের বিপরীতে, কোনো আর্গুমেন্ট ছাড়া কল করা হলে Number() সংজ্ঞা অনুযায়ী 0 রিটার্ন করে।
JavaScript-এ parseInt ও parseFloat ফাংশনও আছে।
কোন স্ট্রিংগুলো সংখ্যায় রূপান্তর করা যাবে, সে ব্যাপারে এরা আরও শিথিল নিয়ম প্রয়োগ করে।
সেজন্য অপ্রত্যাশিত ফল এড়াতে রূপান্তরের ফাংশন হিসেবে Number-কেই প্রাধান্য দেওয়া উচিত।
parseInt('123a45');
// => 123
Number('123a45');
// => NaN
String(value) দিয়ে আপনি একটি মানকে স্ট্রিং-এ রূপান্তর করতে পারেন।
প্রিমিটিভ মানের ক্ষেত্রে ফলাফল আপনি যা আশা করবেন সেটিই।
String(12.34);
// => '12.34'
String(false);
// => 'false'
String(null);
// => 'null'
String(undefined);
// => 'undefined'
অ্যারের ক্ষেত্রে String ফাংশন প্রতিটি এলিমেন্টের উপর স্ট্রিং রূপান্তর প্রয়োগ করে ফলাফলগুলো কমা দিয়ে জোড়া দেয়।
আপনি নিজেও join মেথড প্রয়োগ করতে পারেন, যেমন সেপারেটর নিজের মতো সাজাতে।
তবে এসব ক্ষেত্রে null ও undefined খালি স্ট্রিং-এ রূপান্তরিত হবে।
String([42, null, true, 'abc']);
// => '42,,true,abc'
অবজেক্টের ক্ষেত্রে ডিফল্টভাবে String এমন একটি লেখা রিটার্ন করে যা বিশেষ কাজে আসে না।
String({ key: 'value' });
// => '[object Object]'
আপনি রূপান্তরের আচরণ নিজের মতো সাজাতে পারেন, যেমন একটি toString মেথড দিয়ে।
javascript.info-র "অবজেক্ট থেকে প্রিমিটিভ রূপান্তর" অংশে বিস্তারিত ব্যাখ্যা আছে।
অবজেক্ট ও অ্যারের জন্য আরও ভালো স্ট্রিং রিপ্রেজেন্টেশন পাওয়ার আরেকটি কমন উপায় হলো JSON এনকোডিং ব্যবহার করা।
JSON.stringify দিয়ে স্ট্রিং-এ এবং JSON.parse দিয়ে আবার অবজেক্ট বা অ্যারে-তে রূপান্তর করতে পারেন।
const obj = {
name: 'Gilda Guerra',
address: {
city: 'Goiânia',
},
};
JSON.stringify(obj);
// => '{"name":"Gilda Guerra","address":{"city":"Goiânia"}}'
কিছু কিছু প্রসঙ্গে, JavaScript কোনো স্টেটমেন্ট মূল্যায়ন করার আগে স্বয়ংক্রিয়ভাবে একটি মানকে অন্য ডেটা টাইপে রূপান্তর করে। এই অন্তর্নিহিত রূপান্তরকেই টাইপ কোয়ার্শন বলা হয়।
কোনো মান বুলিয়ান প্রসঙ্গে ব্যবহার করা হলে JavaScript Boolean ফাংশনের মতো একই নিয়ম প্রয়োগ করে মানটি অন্তর্নিহিতভাবে রূপান্তর করে।
if স্টেটমেন্টের শর্ত যখন বুলিয়ান নয়, তখন শর্তটি পূরণ হয়েছে কি না তা নির্ধারণ করতে কোয়ার্শন প্রয়োগ করা হয়।
একই কথা প্রযোজ্য টার্নারি অপারেটর ?-এর প্রথম অপারেন্ডের ক্ষেত্রেও।
const num = 0;
if (num) {
// this block is NOT executed because 0 is falsy
}
const name = 'Jin';
name ? 'name was provided' : 'no name provided';
// => 'name was provided'
লজিক্যাল NOT অপারেটর !-এর অপারেন্ডও NOT অপারেশন প্রয়োগ করার আগে বুলিয়ানে কোয়ার্স করা হয়।
const name = '';
!name;
// => true
বর্ণিত আচরণের একটি ফল হলো, !!value-এর প্রভাব Boolean(value)-এর মতোই।
তবুও, পড়ার সুবিধার জন্য Boolean ব্যবহার করাই ভালো।
JavaScript লজিক্যাল AND (&&) ও OR (||) অপারেটরের অপারেন্ডেও কোয়ার্শন প্রয়োগ করে।
তবে মনে রাখবেন, এক্সপ্রেশনের ফলাফল বুলিয়ান নাও হতে পারে।
এটি মূল অপারেন্ডগুলোর একটি রিটার্ন করে (দেখুন লজিক্যাল অপারেটর নিয়ে MDN)।
null || 'hello';
// => 'hello'
প্রিমিটিভ মানের ক্ষেত্রে যোগ অপারেটর + ব্যবহার করা হলে এবং একটি অপারেন্ড স্ট্রিং হলে, অন্যটিও স্ট্রিং-এ কোয়ার্স করা হবে।
রূপান্তরের যুক্তি String ফাংশন ব্যবহারের সময়ের মতোই।
এরপর দুটি স্ট্রিং জোড়া লাগানো হয়।
let name;
'hello ' + name;
// => 'hello undefined'
যেসব নন-স্ট্রিং মান টেমপ্লেট স্ট্রিং-এ এমবেড করা থাকে, তাদের ক্ষেত্রেও একই অন্তর্নিহিত রূপান্তর ঘটে।
const degrees = 23;
`It is ${degrees} °C`;
// => 'Is is 23 °C.';
অনেক অপারেটর উপরে ব্যাখ্যা করা Number ফাংশনের যুক্তি অনুযায়ী (প্রয়োজনে) অপারেন্ডগুলোকে সংখ্যায় কোয়ার্স করে।
+ (কোনো স্ট্রিং জড়িত না থাকলে), -, *, /, %, **
+, -
>, >=, <, <=
|, &, ^, ~
এসব অপারেটরের যেকোনোটির বিস্তারিত জানতে MDN-এর অপারেটর তালিকা দেখুন।
কোনো অপারেন্ড সম্ভাব্য স্ট্রিং হলে, ভুল এড়াতে সব সময় স্পষ্টভাবে Number ফাংশন দিয়ে রূপান্তর করাই ভালো।
'1' + '2';
// => '12'
// addition operator in string context as explained above
Number('1') + Number('2');
// => 3
কখনো কখনো স্ট্রিংকে সংখ্যায় কোয়ার্স করতে ইউনারি প্লাস অপারেটর ব্যবহার হতে দেখবেন।
এটি সুপারিশ করা হয় না, কারণ স্পষ্ট Number কলের চেয়ে এটি পড়া অনেক কঠিন।
const value = '42';
+value;
// => 42
Number(value);
// => 42
লুজ ইকুয়ালিটি ও ইনিকুয়ালিটি অপারেটর ==/!= ব্যবহারেও প্রায়ই সংখ্যায় অন্তর্নিহিত রূপান্তর জড়িত থাকে।
তবে এসব অপারেটরের সঠিক যুক্তি বেশ জটিল (দেখুন লুজ ইকুয়ালিটি নিয়ে MDN)।
ফলাফল পূর্বাভাস করা কঠিন এবং কখনো কখনো আপনার প্রত্যাশার বাইরে।
এসব অন্তর্নিহিত রূপান্তর এড়াতে বরং স্ট্রিক্ট ইকুয়ালিটি/ইনিকুয়ালিটি অপারেটর ===/!== ব্যবহার করুন।