পল্টিবাজ নট (!), ডাবল দিলে কট
দুনিয়াতে কে যে ভালো, আর কে যে খারাপ— সেটা চেহারা দেখে বুঝা যায় না। পোশাক-আশাক দেখেও বুঝা যায় না। দেখা যায় ভিতরটা দেখে। পরীক্ষা-নিরীক্ষা করে। জাভাস্ক্রিপ্টেও মাঝেমধ্যে কনফিউজড হয়ে যাবি, কে যে true টাইপের, আর কে যে false টাইপের। কারণ, একটা প্রোগ্রামিং ল্যাঙ্গুয়েজে অনেক ধরনের জিনিস আছে। কিছু পজিটিভ, আবার কিছু নেগেটিভ। যেগুলা true টাইপের, তাদেরকে truthy বলে, আর যেগুলা false টাইপের, সেগুলাকে falsy বলে।
এইগুলা নিয়ে আমি কয়েকটা বলে দিচ্ছি। এগুলা মুখস্থ করার দরকার নেই। জাস্ট দেখে রাখ—
Truthy:
কোনো কিছুর ভ্যালু যদি সত্য হয়, তাহলে সেটা অবশ্যই true হবে।
সংখ্যার মধ্যে শূন্য ছাড়া অন্য যেকোনো পজিটিভ সংখ্যা ( 0-এর চাইতে বড় যেকোনো সংখ্যা) বা নেগেটিভ সংখ্যা (0-এর চাইতে ছোট যেকোনো সংখ্যা ) সত্য বা true হিসেবে আচরণ করবে।
const x = -4;
if (x) {
console.log("value of x is truthy");
} else {
console.log("value of x is falsy");
}
Output: value of x is truthyempty string ('') হলে সেটা false হবে। আর empty string ('') ছাড়া যেকোনো string সত্য হবে। এমনকি যদি একটা ক্যারেক্টার থাকে বা কোটেশনের মধ্যে যদি স্পেসও থাকে (' '), তাহলে সেটা true হবে।
const x = "a";
if (x) {
console.log("value of x is truthy");
} else {
console.log("value of x is falsy");
}
Output: value of x is truthyযদিও 0-কে false ধরবে। তারপরেও 0 যদি কোটেশনের মধ্যে থাকে, তাহলে সে কিন্তু সংখ্যা না; বরং একটা স্ট্রিং হয়ে গেছে। আবার সে কিন্তু খালি স্ট্রিং না; বরং কোটেশনের মধ্যে কিছু একটা আছে। তাই এইটা কিন্তু true হবে। অর্থাৎ 0 হবে false, কিন্ত '0' হবে true।
একইভাবে false নিজে false, তবে false যদি স্ট্রিং আকারে থাকে, 'false' তাইলে সে কিন্তু স্ট্রিং। এবং এম্পটি স্ট্রিং না, তাই 'false' কিন্তু সত্য হবে।
Empty object { } এবং empty array [ ] দুটোই true হিসেবে গণ্য হয়।
Falsy:
- কোনো কিছুর ভ্যালু যদি মিথ্যা হয়, তাহলে সেটা false হবে।
- কোনো ভেরিয়েবলের মান যদি শূন্য(0) হয়, সেটা false হবে।
- Empty string হলে সেটা false হবে।
- কোনো কিছু যদি undefined থাকে, তখন সেটা false হবে।
- null ভ্যালুও false হয়।
পল্টিবাজ নট (!)
অনেক আগে তুই পল্টিবাজ ! (নট) অপারেটর দেখছিলি। সে ভ্যালুটার উল্টো (inverse) করে। এইটাকে লজিক্যাল নট বলে। এটা কোনো কিছু true হলে তাকে false করে দেবে, আর false হলে তাকে true করে দেবে।
আর তুই যদি কোনো কিছুর falsy অবস্থা চেক করতে চাস, যেমন কোনো ভ্যালু false হলে তারপর শর্তের ভিতরে ঢুকতে চাস, সেক্ষেত্রে if-এর পরে শর্তের মধ্যে false হতে পারে, এমন ভেরিয়েবল বা ভ্যালুর আগে not (!) চিহ্ন দিয়ে দিবি। তাহলে সেই ভ্যালু false বা falsy কিছু হলে সে শর্তের ভিতরে চলে যাবে।
const y = '';
if(!y) {
console.log('value of y is falsy');
}
Output: value of y is falsyডাবল নট !!
একটা নট দিলে পল্টি মারে। দুইটা নট দিলে কী হবে? দুইবার পল্টি মারবে। অর্থাৎ প্রথম নট একবার উল্টাবে, সেকেন্ড নট আবার উল্টাবে। এটাই ডাবল নটের মূল কনসেপ্ট— তুই যে ভ্যালু দিলি, সেটা Boolean হিসেবে true না false, সেটা বের করে।
console.log(!!"hello"); // true
console.log(!!42); // true
console.log(!!{}); // true
console.log(!![]); // true
console.log(!!""); // false
console.log(!!0); // false
console.log(!!null); // false
console.log(!!undefined); // false
console.log(!!NaN); // falseডাবল নট দিয়ে যেকোনো ভ্যালুকে Boolean টাইপে (true, false) খুব সহজে কনভার্ট করা যায়।
const value = "coding";
console.log(!!value); // true!! দিয়ে তুই চট করে দেখে নিতে পারবি, কোনো ভ্যালু truthy নাকি falsy।
const value = 0;
if (!!value) {
console.log("Truthy");
} else {
console.log("Falsy");
}
Output: Falsyসহজভাবে বললে—
! – একবার উল্টো করে।
!! – দুইবার উল্টো করে আসল অবস্থায় ফেরায় Boolean হিসেবে।
Practice:
- একটা if কন্ডিশনের মধ্যে 'false' লিখে চেক কর। 'false' কি সত্য টাইপের ভ্যালু হিসেবে আচরণ করে, নাকি করে না।
- একটা খালি অবজেক্টে { } কোনো প্রোপার্টি নাই। এইটা কী falsy একটা ভ্যালু। চেক কর if-এর ভিতরে শর্ত হিসেবে লিখে।
- একটা খালি অ্যারে [ ] কোনো উপাদান নাই। এইটা কি truthy ভ্যালু। চেক কর if-এর ভিতরে শর্ত হিসেবে লিখে।
- একটা অ্যারে [ ] আছে, এইটার সামনে !! দিলে কী পাওয়া যাবে।