number আর string-এর মতো প্রিমিটিভ ডেটা টাইপ ছাড়াও JavaScript-এ আরও একটি গুরুত্বপূর্ণ ডেটা টাইপ আছে, যাকে বলা হয় object।
অবজেক্ট হলো কী (key) ও মানের জোড়ার সংগ্রহ।
তাই অন্য ভাষায় যাকে সাধারণত ম্যাপ বা ডিকশনারি বলা হয়, সেভাবেই এগুলো ব্যবহার করা যায়।
অন্য ভাষায় ম্যাপের সব মানের প্রায়ই একই ডেটা টাইপ থাকতে হয়। JavaScript-এ কেবল কী (key)-এর টাইপেই সীমাবদ্ধতা আছে: এটা অবশ্যই স্ট্রিং হতে হবে। একটি অবজেক্টের ভেতরের মানগুলো অবশ্য ভিন্ন ভিন্ন টাইপের হতে পারে। এগুলো সংখ্যার মতো প্রিমিটিভ টাইপ হতে পারে, আবার অ্যারে, অন্য অবজেক্ট বা এমনকি ফাংশনও হতে পারে। এ কারণেই অবজেক্ট এত বহুমুখী, আর তাই JavaScript-এ অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP)-এর মূল উপাদানও এগুলোই।
নিচে আমরা অবজেক্টকে সংগ্রহ বা ম্যাপ হিসেবে দেখা নিয়ে আলোচনা করব। অবজেক্টের অন্য ব্যবহারগুলো অন্য কনসেপ্টে আলোচনা করা হবে, যেমন ক্লাস দেখুন।
দ্বিতীয় বন্ধনী ব্যবহার করে আপনি একটি অবজেক্ট লিটারাল তৈরি করেন। চাইলে সরাসরি কিছু এন্ট্রি (কী (key) ও মানের জোড়া) যোগ করতে পারেন। এর জন্য প্রথমে কী (key) লিখুন, তারপর একটি কোলন ও মান।
const emptyObject = {};
const obj = {
favoriteNumber: 42,
greeting: 'Hello World',
useGreeting: true,
address: {
street: 'Trincomalee Highway',
city: 'Batticaloa',
},
fruits: ['melon', 'papaya'],
addNumbers: function (a, b) {
return a + b;
},
};
JavaScript-এ শেষ এন্ট্রির পরে দেওয়া কমা ঐচ্ছিক। এটি ব্যবহারের সুবিধাগুলো এখানে পড়তে পারেন।
আপনার মনে হতে পারে, কী (key)গুলো তো স্ট্রিং হওয়ার কথা, তবু কেন এগুলো উদ্ধৃতি চিহ্নে মোড়ানো নেই। এটি এক ধরনের সংক্ষিপ্ত রূপ। কী (key) যদি JavaScript-এর আইডেন্টিফায়ার-এর নামকরণের নিয়ম মেনে চলে, তাহলে উদ্ধৃতি চিহ্ন বাদ দিতে পারেন। নামে বিশেষ অক্ষর থাকা কী (key)-এর ক্ষেত্রে সাধারণ স্ট্রিং লিখনরীতি ব্যবহার করতে হবে।
const obj = {
'1keyStartsWithNumber': '...',
'key/with/slashes': '...',
'key-with-dashes': '...',
'key with spaces': '...',
'#&()[]{}èä樹keyWithSpecialChars': '...',
};
অনেক সময় অবজেক্ট ডিক্লেয়ার করার সময় বিদ্যমান ভ্যারিয়েবল যোগ করতে চাইবেন।
এতে প্রায়ই name: name-এর মতো কী (key) ও মানের জোড়া তৈরি হয়।
JavaScript-এ একটি সংক্ষিপ্ত রূপ আছে, যেখানে শুধু name লিখলেই চলে।
অবজেক্টের ভেতরে ফাংশন ডিফাইন করার জন্যও একটি সংক্ষিপ্ত রূপ আছে।
সেখানে কোলন ও function কিওয়ার্ড বাদ দিতে পারেন।
const x = 1;
const y = 2;
const obj = {
x: x,
y: y,
calcSum: function (a, b) {
return a + b;
},
};
// Can be shortened to ...
const obj = {
x,
y,
calcSum(a, b) {
return a + b;
},
};
কোনো ভ্যারিয়েবলে রাখা বা এক্সপ্রেশন থেকে পাওয়া নামের কী (key) দিয়ে অবজেক্ট লিটারাল তৈরি করতে চাইলে, ভ্যারিয়েবল বা এক্সপ্রেশনটি তৃতীয় বন্ধনীর ভেতরে রাখতে হবে।
const key = 'greeting';
const obj = {
[key]: 'hello world',
};
console.log(obj);
// => { greeting: 'hello world' }
কোনো নির্দিষ্ট কী (key)-এর মান বের করার দুটি উপায় আছে: ডট নোটেশন ও ব্র্যাকেট নোটেশন।
const obj = { greeting: 'hello world' };
obj.greeting;
// => hello world
obj['greeting'];
// => hello world
// Bracket notation also works with variables.
const key = 'greeting';
obj[key];
// => hello world
সংক্ষিপ্ত রূপ হিসেবে ডট নোটেশন ব্যবহারেরও একই সীমাবদ্ধতা আছে, যা উদ্ধৃতি চিহ্ন বাদ দেওয়ার মতো। এটি কেবল তখনই কাজ করে, যখন কী (key) আইডেন্টিফায়ারের নামকরণের নিয়ম মেনে চলে।
অবজেক্টে না থাকা কোনো কী (key) বের করার চেষ্টা করলে JavaScript undefined রিটার্ন করে।
এ বিষয়ে আরও জানতে Null and Undefined দেখুন।
নেস্টেড অবজেক্ট থেকে মান বের করতে চাইলে কী (key)গুলো একটার পর একটা জুড়ে দিতে পারেন।
const obj = {
address: {
street: 'Trincomalee Highway',
city: 'Batticaloa',
},
};
obj.address.city;
// => 'Batticaloa'
obj['address']['city'];
// => 'Batticaloa'
// Notations can also be mixed.
obj.address['city'];
// => 'Batticaloa'
অ্যাসাইনমেন্ট অপারেটর = দিয়ে আপনি একটি মান যোগ বা বদল করতে পারেন।
এখানেও ডট ও ব্র্যাকেট নোটেশন দুটোই আছে।
const obj = { greeting: 'hello world' };
obj.greeting = 'Hi there!';
obj['greeting'] = 'Welcome.';
obj.newKey1 = 'new value 1';
obj['new key 2'] = 'new value 2';
const key = 'new key 3';
obj[key] = 'new value 3';
delete কিওয়ার্ড দিয়ে অবজেক্ট থেকে একটি কী (key) ও মানের জোড়া মুছে ফেলতে পারেন।
const obj = {
key1: 'value1',
key2: 'value2',
};
delete obj.key1;
delete obj['key2'];
মনে রাখবেন, না থাকা কী (key)-এর জন্য undefined রিটার্ন হলেও, একটি কী (key)-কে undefined সেট করলে এন্ট্রিটি মুছে যায় না।
বরং সবসময় delete ব্যবহার করুন।
hasOwnProperty মেথড দিয়ে আপনি যাচাই করতে পারেন, অবজেক্টে নির্দিষ্ট কোনো কী (key) আছে কি না।
const obj = { greeting: 'hello world' };
obj.hasOwnProperty('greeting');
// => true
obj.hasOwnProperty('age');
// => false
hasOwnProperty উত্তরাধিকারসূত্রে পাওয়া কী (key)-এর জন্য false রিটার্ন করে। সাধারণত এটাই কাঙ্ক্ষিত আচরণ।
অস্তিত্ব যাচাইয়ে উত্তরাধিকারসূত্রে পাওয়া কী (key) ধরতে চাইলে বদলে in অপারেটর ব্যবহার করতে পারেন।
অবজেক্টের সব কী (key)-এর উপর ইটারেট করার জন্য একটি বিশেষ for...in লুপ আছে।
const obj = {
name: 'Ali',
age: 65,
};
for (let key in obj) {
console.log(key, obj[key]);
}
// name Ali
// age 65
মনে হতে পারে, for...in সবসময় কী (key)গুলো যে ক্রমে আছে বা অবজেক্টে যোগ করা হয়েছে (ইনসারশন অর্ডার) সেই ক্রমেই দেখে।
তবুও এর উপর নির্ভর করা উচিত নয়, কারণ কিছু বিশেষ ক্ষেত্রে ক্রম ইনসারশন অর্ডার থেকে আলাদা হতে পারে।
সবসময় এমনভাবে কোড লিখুন যেন ক্রম যেকোনো হতে পারে।
নির্ভরযোগ্য ক্রম দরকার হলে অবজেক্টের বদলে Map বা নেস্টেড [অ্যারে][concept-arrays] ব্যবহার করুন।
অবজেক্টে উত্তরাধিকারসূত্রে পাওয়া কী (key) থাকলে for…in লুপে একটি বিপদ আছে।
সেগুলোও for…in লুপে দেখা হবে।
সাধারণত এটা এড়াতে চাইবেন, তাই নিচে দেখানো মতো সেগুলো এড়িয়ে যেতে হবে।
for (let key in obj) {
if (!obj.hasOwnProperty(key)) {
continue;
}
// ...
}
JavaScript-এ for...of লুপও আছে, যেমন অ্যারের উপর ইটারেট করতে।
মনে রাখা জরুরি, for...in ও for...of পরস্পরের বদলে ব্যবহার করা যায় না; বিস্তারিত জানতে MDN ডকুমেন্টেশন দেখুন।
বিল্ট-ইন Object অবজেক্টটি কোনো নির্দিষ্ট অবজেক্টের সব কী (key), মান বা এন্ট্রি অ্যারে হিসেবে পাওয়ার সহায়ক মেথড দেয়।
const obj = {
name: 'Ali',
age: 65,
};
Object.keys(obj);
// => [ 'name', 'age' ]
Object.values(obj);
// => [ 'Ali', 65 ]
Object.entries(obj);
// => [ [ 'name', 'Ali' ], [ 'age', 65 ] ]
আপনি হয়তো খেয়াল করেছেন, JavaScript-এ একটি খালি অবজেক্ট সম্পূর্ণ খালি নয়।
যেমন, এতে hasOwnProperty মেথড আর toString-এর মতো অন্য মেথড থাকে।
সাধারণত এতে কোনো সমস্যা হয় না, কিন্তু যদি কখনও সত্যিকারের খালি অবজেক্ট তৈরি করার দরকার পড়ে, তাহলে নাল অবজেক্ট ব্যবহার করুন, যা Object.create(null) দিয়ে তৈরি করা যায়।