JavaScript Data Types: Advanced
Primitive vs reference গভীরে, boxed object, bigint ও symbol, typeof pitfalls, comparing values গুলো — বাংলায়।
এবার primitive আর reference-এর ভেতরের আচরণ — value নাকি reference-এ যায়, কীভাবে copy ও compare হয় — এই গভীর ধারণা interview-এ ও বড় project-এ আসল কাজে লাগে।
Value নাকি Reference?
let a = 10;
let b = a; // value copy
b = 20;
console.log(a); // 10 — a অক্ষত
const obj1 = { key: 1 };
const obj2 = obj1; // reference — একই object
obj2.key = 2;
console.log(obj1.key); // 2 — obj1-ও বদলে গেল!
console.log(obj1 === obj2); // true (একই reference)Primitive value-র মতো copy হয় — আলাদা আলাদা জায়গা। object/array reference-এ যায় — two variable একই জিনিসের দিকে তাকায়। তাই এক জায়গায় বদলালে অন্য সাইটেও দেখা যায়।
Object-কে copy করা
const original = { name: "রহিম", address: { city: "ঢাকা" } };
// Shallow copy — উপরের স্তর আলাদা
const shallow = { ...original };
shallow.address.city = "চট্টগ্রাম";
console.log(original.address.city); // "চট্টগ্রাম" — নিচের স্তর share!
// Deep copy — সব স্তর আলাদা
const deep = structuredClone(original);
deep.address.city = "খুলনা";
console.log(original.address.city); // "চট্টগ্রাম" — অক্ষত{ ...obj } shallow copy — ভেতরের nested object একই reference থেকে যায়। পুরোপুরি আলাদা copy পেতে structuredClone() (আধুনিক) বা JSON.parse(JSON.stringify(obj)) (পুরনো, তবে function/undefined হারায়)।
Object তুলনা
const x = { v: 5 };
const y = { v: 5 };
console.log(x === y); // false — reference আলাদা
const z = x;
console.log(x === z); // true — একই object
// মান দিয়ে তুলনা দরকার?
console.log(JSON.stringify(x) === JSON.stringify(y)); // true (ঢং)
// গভীর তুলনার তৈরি কৌশল
function deepEqual(a, b) {
return JSON.stringify(a) === JSON.stringify(b);
}
console.log(deepEqual(x, y)); // trueobject-কে === দিয়ে তুলনা করলে reference তুলনা হয়, মান নয়। মান দিয়ে তুলতে JSON string-বা বড় ক্ষেত্রে লাইব্রেরি (lodash isEqual) ব্যবহৃত।
Primitive object (boxing)
const text = "বাংলা";
console.log(text.length); // 5 — দেখে মনে হয় property!
console.log(text.toUpperCase()); // "বাংলা"
console.log("জাভাস্ক্রিপ্ট".slice(0, 6)); // "জাভাস্ক্রিপ"
const num = 3.1416;
console.log(num.toFixed(2)); // "3.14"জাভাস্ক্রিপ্ট মুহূর্তের জন্য primitive-কে একটা temporary object-এ মুড়ে দেয় (boxing) — তাই string/number-এ method চালানো যায়। ব্যবহারের পর সেই temporary বাতিল।
bigint
const bigNumber = 9007199254740993n;
const fromString = BigInt("12345678901234567890");
console.log(bigNumber + 1n); // 9007199254740994n
console.log(fromString); // 12345678901234567890n
// bigint আর number মিশানো যায় না:
// bigNumber + 1 // TypeError
console.log(Number(bigNumber)); // 9007199254740992 (সতর্ক!bigint বড় পূর্ণসংখ্যার জন্য। শেষে n বসিয়ে লিখা হয়। বড় precision প্রয়োজন হলে ব্যবহার করুন — তবে number-এর সাথে সরাসরি মেশাবেন না।
symbol
const id1 = Symbol("id");
const id2 = Symbol("id");
console.log(id1 === id2); // false — সবসময় unique
const user = {
name: "রহিম",
[id1]: 123,
};
console.log(user[id1]); // 123
console.log(Object.keys(user)); // ["name"] — symbol loup-এ আসে নাsymbol হলো অনন্য (unique) identifier — একই নাম দিলেও দুটি symbol আলাদা। object-এর key হিসেবে ব্যবহার করলে সহজে conflict হয় না (jQuery-style library-তে দরকারি)।
typeof trap
console.log(typeof null); // "object" ❌
console.log(typeof NaN); // "number" 😅
console.log(typeof []); // "object"
console.log(typeof function(){}); // "function"
// নিরাপদ চেক:
console.log(value === null); // null চেক
console.log(Number.isNaN(NaN)); // NaN চেক
console.log(Array.isArray([])); // array চেকtypeof null === "object" একটি ঐতিহাসিক bug ও স্থায়ী আচরণ। তাই টাইপ চেক করার সময় typeof সাথে লজিকাল চেক যুক্ত করুন।
| ঘটনা | ফলাফল | মন্তব্য |
|---|---|---|
| primitive copy | নিজস্ব value | বদলালে অন্যটি অক্ষত |
| object copy | reference | একই জিনিস |
{ ...obj } | shallow | nested share হয় |
structuredClone | deep | সব স্তর আলাদা |
typeof null | "object" | null চেক করতে === null |
typeof [] | "object" | array চেক Array.isArray |
function-এ object পাঠালে function ভেতরে বদলালে বাইরের object-ও বদলায়। random প্রভাব এড়াতে দরকার হলে structuredClone দিয়ে copy পাঠান।
কমন প্রশ্ন: "আমি কীভাবে object-কে copy করি?" — শুরুতে shallow (...) ও deep (structuredClone) পার্থক্য বলা + nested-এ shallow-র বিপদ বলা।