আপনারা অনেকে হয়তো এই জিনিসটা খেয়াল করেছেন যে কখনো একটা খালি অ্যারে আর একটা খালি অবজেক্ট অ্যাডিশন অপারেটর +
দিয়ে অ্যাড করলে একটা উইয়ার্ড ফলাফল দেখায়। খেয়াল করবেন কিন্তু এখানে আগে খালি অ্যারেটি এসেছে, আর পরে অবজেক্টটিঃ
[] + {}
// '[object Object]'
এখানেও সেই অ্যাডিশন অপারেটর +
এর কারসাজি চলছে। আমরা জানি যে এই +
অপারেটরটি দুইটা অপারেন্ডের মাঝখানে বসলে এটা দুইরকমের কাজ করতে পারে। একটা তো হচ্ছে সরাসরি যোগ করা, আরেকটা হচ্ছে স্ট্রিং যুক্ত(String Concatenation) করে। এখানে যেহেতু এর দুইপাশের অপারেন্ডই নাম্বার না, তাই এদেরকে মূলত স্ট্রিং হিসেবে যুক্ত করা হয়েছে। তবে তার পূর্বে টাইপ কোয়ারশনের সাহায্যে এদেরকে ইকমাস্ক্রিপ্টের স্টান্ডার্ড অনুযায়ী একটা প্রিমিটিভ ভ্যালুতে বা এখানে স্ট্রিং এ কনভার্ট করা হয়েছেঃ
String([])
// ''
String({})
// '[object Object]'
স্বভাবতই এখন এদেরকে স্ট্রিং হিসেবে যুক্ত করতে আমাদের সেই ফলাফলই দেখতে পাবঃ
[] + {}
// '[object Object]'
'' + '[object Object]'
// '[object Object]'
এখন এখানে যদি খালি অ্যারে না থেকে অ্যারেতে কিছু থাকতো, তাহলেও সেইম আচরণই পেতেন। অ্যারে এবং অবজেক্টটি স্ট্রিং এ কনভার্ট হতো এবং শেষে এদেরকে স্ট্রিং হিসেবে যুক্ত করা হতোঃ
[1, 2] + {}
// '1,2[object Object]'
কিন্তু আবার যদি অবজেক্টটা খালি না হতো তাহলে কিন্তু আবার একটু অন্যরকম বা উইয়ার্ড ব্যাপারই লক্ষ্য করবেনঃ
[1, 2] + { name: 'Code with Zonayed' }
// '1,2[object Object]'
এটা হবার মূল কারণ হচ্ছে অবজেক্ট খালি হউক আর যাই হউক এটাকে স্ট্রিং এ নিলে সবসময়েই সেই সেইম ফলাফলঃ
String({ name: 'Code with Zonayed' })
// '[object Object]'
অবজেক্টকে স্ট্রিং এ কনভার্ট করা হয় ইকমাস্ক্রিপ্ট এর স্টান্ডার্ড অনুযায়ী। তাছাড়া এখানে আরেকটু উইয়ার্ড ব্যাপার আছে, সেটা হচ্ছে আপনি যদি এটাকে রিভার্স করে এমন {} + []
এর ফলাফল দেখেন তাহলে দেখবেন সেটা সম্পূর্ণ ভিন্ন একটা ফলাফল দেখাচ্ছে। এটা নিয়ে বিস্তারিত পরের পর্বে আলোচনা করবো।