জাভাস্ক্রিপ্ট, বৈচিত্র্যময় এবং নমনীয় ডেটা প্রকারের একটি ভাষা, মৌলিকভাবে দুটি বিভাগে বিভক্ত: আদিম এবং বস্তু । এই পার্থক্যটি সমস্ত স্তরের বিকাশকারীদের জন্য উপলব্ধি করার জন্য অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি ভিত্তি তৈরি করে যার উপর জাভাস্ক্রিপ্ট কাজ করে। আমাদের বোধগম্যতা দৃঢ় করার জন্য এই ধারণাগুলিকে আবার দেখুন।
আদিম মূল্যবোধ: মৌলিক
"hello"
এবং "farewell"
এর মতো পাঠ্য ডেটাগুলি উদ্ধৃতির মধ্যে ধারণ করা হয়, যা জাভাস্ক্রিপ্টে পাঠ্য ম্যানিপুলেশনের ভিত্তি হিসাবে কাজ করে৷
-5
) বা দশমিক ( 3.14
) হোক না কেন, সংখ্যা হল ভাষার গাণিতিক ক্রিয়াকলাপের ভিত্তি।
আদিমগুলি অপরিবর্তনীয় , যার অর্থ তাদের মান একবার তৈরি করার পরে পরিবর্তন করা যায় না। এই বৈশিষ্ট্যটি প্রায়শই বিভ্রান্তির দিকে পরিচালিত করে, বিশেষ করে যখন আমরা একটি ভেরিয়েবলকে ভুল করি যা মানের জন্যই একটি আদিম মান ধারণ করে।
আদিম যে অপরিবর্তনীয় তা বোঝা জাভাস্ক্রিপ্ট আচরণের অনেক দিক স্পষ্ট করতে সাহায্য করে, বিশেষ করে তুলনা এবং অ্যাসাইনমেন্ট অপারেশনে।
জাভাস্ক্রিপ্টের মাধ্যমে আমাদের যাত্রায়, যদিও আমরা এই ধরনের কিছু সরাসরি ব্যবহার নাও করতে পারি, তাদের ভূমিকা চিনতে এবং বোঝা আমাদের কোডিং টুলকিটকে সমৃদ্ধ করে, আরও পরিশীলিত এবং দক্ষ কোডের জন্য পথ প্রশস্ত করে।
আদিম জগতের বাইরে, জাভাস্ক্রিপ্টের মহাবিশ্ব বস্তু দ্বারা আধিপত্য। এই বিভাগে ডেটা স্ট্রাকচারের একটি বিস্তৃত বিন্যাস রয়েছে, যার মধ্যে কয়েকটি আপনাকে অবাক করে দিতে পারে, যেমন অ্যারে । প্রাথমিকভাবে, আমরা সম্মুখীন হই:
{}
বা অ্যারেগুলির জন্য []
দ্বারা প্রতিনিধিত্ব করা হয়, এই কাঠামোগুলি সম্পর্কিত ডেটা এবং কার্যকারিতাগুলিকে গোষ্ঠীবদ্ধ করার জন্য মেরুদণ্ড।
x => x * 2
হিসাবে প্রকাশ করা হয়, ফাংশনগুলি জাভাস্ক্রিপ্টে প্রথম শ্রেণীর নাগরিক, যা কোডকে ভেরিয়েবলের জন্য বরাদ্দ করা, আর্গুমেন্ট হিসাবে পাস করা বা অন্যান্য ফাংশন থেকে ফিরে আসার অনুমতি দেয়।
বস্তু আদিম থেকে মৌলিকভাবে পৃথক; এগুলি পরিবর্তনযোগ্য এবং আমাদের কোডে সরাসরি ম্যানিপুলেট করা যেতে পারে। একটি সাধারণ ভুল ধারণা হল জাভাস্ক্রিপ্টের সবকিছুকে একটি বস্তু হিসাবে দেখা। আদিম মানের নির্দিষ্ট বস্তুর মতো আচরণের কারণে এটি আংশিকভাবে সত্য। উদাহরণস্বরূপ, "hi".toUpperCase()
অভিব্যক্তিটি প্রশ্ন উত্থাপন করতে পারে: কিভাবে একটি আদিম স্ট্রিং পদ্ধতি থাকতে পারে?
এটি "বক্সিং" নামে পরিচিত একটি প্রক্রিয়ার মাধ্যমে ঘটে, যেখানে জাভাস্ক্রিপ্ট অস্থায়ীভাবে পদ্ধতিগুলি অ্যাক্সেস করার জন্য অবজেক্ট র্যাপারগুলিতে আদিম মানগুলিকে আবৃত করে, শুধুমাত্র অপারেশন শেষ হওয়ার পরে এই বস্তুগুলিকে বাতিল করার জন্য।
এটি জাভাস্ক্রিপ্টের ডিজাইনের একটি আকর্ষণীয় দিক, যা আদিমদেরকে বস্তুর মতো পদ্ধতি থেকে উপকৃত হতে দেয় বস্তুত বস্তু না হয়েও। এই পার্থক্য বোঝা অত্যন্ত গুরুত্বপূর্ণ কারণ আমরা জাভাস্ক্রিপ্টের টাইপোলজির গভীরে অনুসন্ধান করি।
typeof
অপারেটর এবং null
এর অনন্য কেস অন্বেষণ করা হচ্ছে জাভাস্ক্রিপ্টের বিভিন্ন ধরনের ডেটার মধ্যে পার্থক্য করা কখনো কখনো কিছুটা জাদু বলে মনে হতে পারে। আপনার typeof
টুলকিটে একটি শক্তিশালী টুল যা একটি প্রদত্ত মানের প্রকার প্রকাশ করে অপারেটর প্রকারটি লিখুন। এটি অনুশীলনে কীভাবে কাজ করে তা এখানে:
console.log(typeof(5)); // Outputs "number" console.log(typeof("hi")); // Outputs "string" console.log(typeof(undefined)); // Outputs "undefined" console.log(typeof({})); // Outputs "object" console.log(typeof([])); // Outputs "object" console.log(typeof(x => x * 2)); // Outputs "function"
যাইহোক, জাভাস্ক্রিপ্টের রাজ্যে, সবকিছু যেমন মনে হয় তেমন মনে হয় না। উদাহরণ স্বরূপ, null
এর অপারেটরের typeof
ধরন নিন। প্রত্যাশা থাকা সত্ত্বেও, typeof null
"object"
প্রদান করে, যার ফলে অনেক ডেভেলপারকে ধাঁধা লাগে। এই আচরণটি জাভাস্ক্রিপ্টের প্রথম দিকের ডিজাইনের সিদ্ধান্তের মূলে থাকা ভাষার ছত্রাকের মতো একটি বাগ নয়।
মান null
বলতে বোঝানো হয়েছে কোনো অবজেক্টের মানের ইচ্ছাকৃত অনুপস্থিতিকে প্রতিনিধিত্ব করার জন্য, তবুও এটিকে একটি অবজেক্ট হিসেবে typeof
করে। এই ব্যঙ্গটি সুপরিচিত এবং পশ্চাদগামী সামঞ্জস্যের বিষয়ে উদ্বেগের কারণে জাভাস্ক্রিপ্টের বিবর্তন জুড়ে টিকে আছে।
এটা মনে রাখা গুরুত্বপূর্ণ যে, undefined
বিপরীতে, যা নির্দিষ্ট করা হয়নি এমন মানগুলিকে বোঝায়, null
স্পষ্টভাবে 'কোন মান নেই' এর ইচ্ছাকৃত অ্যাসাইনমেন্ট বোঝাতে ব্যবহৃত হয়। যদিও JavaScript null
এবং undefined
এর মধ্যে ব্যবহারে পার্থক্য প্রয়োগ করে না, আপনার কোডে একটি সামঞ্জস্যপূর্ণ পদ্ধতি অবলম্বন করা আপনার অভিপ্রায়কে স্পষ্ট করতে এবং পঠনযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা উভয় ক্ষেত্রেই সাহায্য করতে পারে।
জাভাস্ক্রিপ্টের প্রাণবন্ত বিশ্বে, কোড লেখা প্রশ্ন উত্থাপনের অনুরূপ, এবং ভাষা উত্তর দিয়ে সাড়া দেয়। এই মিথস্ক্রিয়াগুলি আমরা যাকে অভিব্যক্তি বলি তার মাধ্যমে ক্যাপচার করা হয়। জাভাস্ক্রিপ্টে একটি এক্সপ্রেশন হল কোডের যেকোন বৈধ একক যা একটি মান নির্ধারণ করে।
আসুন একটি সাধারণ উদাহরণ দেখি:
console.log(5 + 5); // Outputs 10
এই উদাহরণে, 5 + 5
হল একটি অভিব্যক্তি যা জাভাস্ক্রিপ্ট 10
এর মান দিয়ে মূল্যায়ন করে।
এক্সপ্রেশন হল জাভাস্ক্রিপ্ট কোডের বিল্ডিং ব্লক, আপনার প্রোগ্রামের মধ্যে গতিশীল মিথস্ক্রিয়া এবং গণনা সক্ষম করে। এগুলি উপরের উদাহরণের মতো সহজ বা আরও জটিল হতে পারে। আসলে, অভিব্যক্তি হল ইন্টারেক্টিভ, গতিশীল ওয়েব অ্যাপ্লিকেশন তৈরি করার জন্য ভাষার সাথে আপনার সরাসরি যোগাযোগের লাইন।
যদিও জাভাস্ক্রিপ্টে আদিম ডেটার ধরনগুলি-যেমন স্ট্রিং, সংখ্যা এবং বুলিয়ানগুলি-কে পূর্বনির্ধারিত সত্তা হিসাবে অস্তিত্বে ডাকা হয়, বস্তুগুলি একটি ভিন্ন নীতিতে কাজ করে। প্রতিবার আমরা {}
(কোঁকড়া ধনুর্বন্ধনী) ব্যবহার করি, আমরা শুধু একটি বিদ্যমান ব্লুপ্রিন্ট উল্লেখ করছি না; আমরা একটি একেবারে নতুন বস্তুর অস্তিত্ব আনছি। দুটি সাধারণ বস্তুর সৃষ্টি বিবেচনা করুন:
const cat = {}; const dog = {};
এখানে, cat
এবং dog
স্বতন্ত্র বস্তু, প্রত্যেকের স্মৃতিতে তাদের নিজস্ব স্থান রয়েছে। এই নীতিটি অ্যারে, তারিখ এবং ফাংশন সহ জাভাস্ক্রিপ্টের সমস্ত জটিল ডেটা স্ট্রাকচারকে অন্তর্ভুক্ত করতে নিছক অবজেক্ট লিটারালের বাইরে প্রসারিত হয়।
যদিও এই সত্তাগুলি তৈরি করার বিভিন্ন পদ্ধতি রয়েছে, অবজেক্টের জন্য {}
, অ্যারেগুলির জন্য []
এবং তারিখগুলির জন্য new Date()
ব্যবহার করা অবজেক্ট ইনস্ট্যান্স তৈরির জন্য সবচেয়ে সরাসরি পদ্ধতির মধ্যে রয়েছে।
কিন্তু এই বস্তুর কি হবে যখন তাদের আর প্রয়োজন হয় না? তারা কি জাভাস্ক্রিপ্ট মহাবিশ্বে অনির্দিষ্টকালের জন্য থাকে? উত্তরটি জাভাস্ক্রিপ্টের আবর্জনা সংগ্রহের পদ্ধতির মধ্যে রয়েছে - একটি প্রক্রিয়া যা দক্ষতার সাথে মেমরি পরিষ্কার করে যা আর ব্যবহার করা হয় না।
আবর্জনা সংগ্রহ একটি স্বয়ংক্রিয় ক্রিয়াকলাপ, যার অর্থ আপনার কোডে সেগুলির কোনও উল্লেখ না থাকলে বস্তুগুলি ধ্বংস হয়ে যায় এবং তাদের বরাদ্দ করা মেমরি পুনরায় দাবি করা হয়।
জাভাস্ক্রিপ্টে, মানগুলির তুলনা করা কখনও কখনও গোলকধাঁধায় নেভিগেট করার মতো মনে হতে পারে, একই গন্তব্যে যাওয়ার বিভিন্ন পথ সহ: সমতা বোঝা। মান তুলনা করার তিনটি প্রাথমিক উপায় আছে:
কঠোর সমতা ( ===
): সমতার এই ফর্মটি সবচেয়ে সুনির্দিষ্ট, দুটি অপারেন্ডের মান এবং প্রকার উভয়ই পরীক্ষা করে। এটি জিজ্ঞাসা করার সমতুল্য, "এই দুটি মান কি প্রকার এবং বিষয়বস্তু উভয় ক্ষেত্রেই অভিন্ন?"
আলগা সমতা ( ==
): কঠোর সমতার চেয়ে কম কঠোর, আলগা সমতা তুলনা করার আগে টাইপ জবরদস্তির অনুমতি দেয়। এটি জিজ্ঞাসা করার মতো, "আমরা যদি তাদের প্রকারগুলিকে উপেক্ষা করি তবে কি এই দুটি মান একই হিসাবে বিবেচিত হতে পারে?"
একই মানের সমতা ( Object.is
): এই পদ্ধতিটি কঠোর সমতার অনুরূপ কিন্তু কয়েকটি সমালোচনামূলক পার্থক্য সহ, বিশেষ করে এটি কীভাবে বিশেষ জাভাস্ক্রিপ্ট কেস পরিচালনা করে।
আসুন দেখি Object.is
কাজ করছে:
console.log(Object.is(2, 2)); // true console.log(Object.is({}, {})); // false
কেন Object.is({}, {})
মিথ্যা ফেরত দেয়? কারণ প্রতিটি বস্তু আক্ষরিক {}
মেমরিতে একটি অনন্য বস্তু তৈরি করে, যা Object.is
তাদের গঠনগত মিল থাকা সত্ত্বেও স্বতন্ত্র সত্তা হিসাবে বিবেচনা করে।
যদিও কঠোর সমতা সহজবোধ্য , এটি তার নিজস্ব বিশেষত্বের সেটকে আশ্রয় করে, বিশেষ করে নির্দিষ্ট জাভাস্ক্রিপ্ট মানগুলির সাথে:
NaN === NaN
: আশ্চর্যজনকভাবে, এই তুলনা false
ফেরত দেয়। জাভাস্ক্রিপ্টে, NaN
(Not-a-Number) কে নিজের থেকে অসম হিসাবে বিবেচনা করা হয়, একটি বিরল বৈশিষ্ট্য যা একটি অনির্ধারিত বা ভুল গণনার ফলাফলকে সংকেত দেওয়ার উদ্দেশ্যে।
-0
এবং 0
: উভয় -0 === 0
এবং 0 === -0
জাভাস্ক্রিপ্টের নম্বর সিস্টেমে -0
এবং 0
পৃথক মান হওয়া সত্ত্বেও true
ফেরত দেয়। এই সমতা শূন্যের চিহ্নকে উপেক্ষা করে, শুধুমাত্র এর বিশালতার উপর ফোকাস করে। সুনির্দিষ্ট এবং বাগ-মুক্ত জাভাস্ক্রিপ্ট কোড লেখার জন্য সমতা যাচাইয়ের এই পার্থক্যগুলি বোঝা সবচেয়ে গুরুত্বপূর্ণ। যদিও ===
এবং ==
তাদের ভূমিকা আছে, Object.is
কখন নিয়োগ করতে হবে তা জানা গুরুত্বপূর্ণ হতে পারে, বিশেষ করে NaN
, 0
, এবং -0
জড়িত প্রান্তের ক্ষেত্রে।
এই জ্ঞান ডেভেলপারদের সমতা পরীক্ষা সম্পর্কে অবগত সিদ্ধান্ত নেওয়ার ক্ষমতা দেয়, তাদের কোড বিস্তৃত পরিস্থিতিতে প্রত্যাশিতভাবে আচরণ করে তা নিশ্চিত করে।
যখন জাভাস্ক্রিপ্টে অবজেক্ট প্রপার্টি ম্যানিপুলেট করার কথা আসে, তখন আপনার কাছে দুটি প্রাথমিক টুল থাকে: ডট নোটেশন এবং ব্র্যাকেট নোটেশন । উভয় পদ্ধতি একটি বস্তুর বিষয়বস্তু অ্যাক্সেস এবং পরিবর্তন করার জন্য একটি সরল পথ অফার করে। এখানে একটি দ্রুত প্রাইমার আছে:
object.key
)।
object['key']
)।
এই কৌশলগুলি বস্তুর সাথে মিথস্ক্রিয়া করার ভিত্তি। যাইহোক, বোঝার জন্য একটি গুরুত্বপূর্ণ দিক হল জাভাস্ক্রিপ্ট কীভাবে অবজেক্ট রেফারেন্স পরিচালনা করে। আদিম ডেটা টাইপের বিপরীতে, জাভাস্ক্রিপ্টের অবজেক্টগুলি হল রেফারেন্সড টাইপ, এবং এর মানে হল যে আপনি যখন কোনও অবজেক্টকে ম্যানিপুলেট করেন, আপনি মেমরিতে সেই বস্তুর অবস্থানের একটি রেফারেন্স নিয়ে কাজ করছেন, বস্তুর সরাসরি কপি নয়।
এই ধারণাটিকে জীবন্ত করার জন্য, আসুন একটি উপন্যাসে সহযোগিতা করার জন্য দুই উচ্চাকাঙ্ক্ষী লেখক, এমিলি এবং থমাসকে জড়িত একটি দৃশ্যকল্প বিবেচনা করা যাক। তারা তাদের গল্পের চরিত্র এবং সেটিংস গঠন করতে জাভাস্ক্রিপ্ট অবজেক্ট ব্যবহার করার সিদ্ধান্ত নেয়:
const project = { title: "Adventures in Code", characters: { protagonist: { name: "Alex", traits: ["brave", "curious"] } }, setting: { location: "Virtual World", era: "future" } };
যখন তারা তাদের গল্পের বিকাশ ঘটায়, এমিলি নায়কের দ্বারা অনুপ্রাণিত একটি পার্শ্বকিক চরিত্রের সাথে পরিচয় করিয়ে দেয় কিন্তু একটি অনন্য মোড় নিয়ে:
const sidekick = project.characters.protagonist; sidekick.name = "Sam"; sidekick.traits.push("loyal");
একই সাথে, টমাস তাদের উপন্যাসের সেটিং প্রসারিত করার সিদ্ধান্ত নেয়:
const newSetting = project.setting; newSetting.location = "Cyber City"; newSetting.era = "2040";
প্রথম নজরে, আপনি ভাবতে পারেন কিভাবে এই পরিবর্তনগুলি মূল project
বস্তুকে প্রভাবিত করে। এখানে ফলাফল:
sidekick
কোনো নতুন বস্তু নয় বরং project.characters.protagonist
একটি রেফারেন্স। sidekick
পরিবর্তন করা সরাসরি মূল project
অবজেক্টকে প্রভাবিত করে।
newSetting
হল project.setting
এর একটি রেফারেন্স, যার অর্থ newSetting
এ কোনো পরিবর্তন সরাসরি project.setting
প্রভাবিত করে।এই উদাহরণটি জাভাস্ক্রিপ্টের একটি প্রধান ধারণাকে আন্ডারস্কোর করে: অবজেক্টের সাথে কাজ করা মানে রেফারেন্সের সাথে কাজ করা, এবং যখন আপনি একটি ভেরিয়েবলের জন্য একটি বস্তুকে বরাদ্দ করেন, তখন আপনি সেই বস্তুর একটি রেফারেন্স প্রদান করছেন।
সেই রেফারেন্সের মাধ্যমে আপনি যে কোনও পরিবর্তন করেন তা সেই বস্তুর সমস্ত রেফারেন্স জুড়ে প্রতিফলিত হয়। এই আচরণটি জটিল, আন্তঃসংযুক্ত ডেটা স্ট্রাকচারকে সক্ষম করে কিন্তু অনিচ্ছাকৃত পার্শ্ব প্রতিক্রিয়া এড়াতে সতর্ক ব্যবস্থাপনারও প্রয়োজন।
আমাদের গল্পে, এমিলি এবং থমাসের সহযোগিতামূলক প্রক্রিয়াটি সুন্দরভাবে ব্যাখ্যা করে যে কীভাবে অবজেক্ট রেফারেন্সগুলি কোডিং-এ সৃজনশীল প্রচেষ্টা পরিবেশন করতে পারে, জটিল বর্ণনার ভাগ করা, গতিশীল বিকাশের জন্য অনুমতি দেয়—অথবা, আরও ব্যবহারিক ভাষায়, আপনার অ্যাপ্লিকেশনের মধ্যে জটিল ডেটা স্ট্রাকচার।
জাভাস্ক্রিপ্টে অবজেক্টের সাথে কাজ করার সময়, রেফারেন্স কপি করার প্রকৃতির কারণে সরাসরি অ্যাসাইনমেন্ট অনিচ্ছাকৃত পরিবর্তন হতে পারে। বস্তুর একটি অনুলিপি তৈরি করা মূল বস্তুকে প্রভাবিত না করে নিরাপদ ম্যানিপুলেশন করার অনুমতি দেয়; এইভাবে, আমরা অনিচ্ছাকৃত পরিবর্তনগুলি প্রশমিত করব।
আপনার চাহিদা এবং আপনার কাছে থাকা পরিস্থিতির উপর ভিত্তি করে, আপনি একটি অগভীর অনুলিপি এবং একটি গভীর অনুলিপির মধ্যে বেছে নিতে পারেন।
Object.assign : এই পদ্ধতিটি উৎস থেকে টার্গেট অবজেক্টে বৈশিষ্ট্য কপি করে একটি নতুন অবজেক্ট তৈরি করে ( {}
)। এটি লক্ষ্য করা গুরুত্বপূর্ণ যে Object.assign
একটি অগভীর অনুলিপি সম্পাদন করে, যার অর্থ কোনও নেস্টেড অবজেক্ট বা অ্যারে রেফারেন্স দ্বারা অনুলিপি করা হয়, তাদের মান দ্বারা নয়।
const original = { a: 1, b: { c: 2 } }; const copy = Object.assign({}, original); copy.bc = 3; // Affects both 'copy' and 'original'
স্প্রেড অপারেটর ( ...
): Object.assign
এর অনুরূপ, স্প্রেড অপারেটর মূল বস্তুর বৈশিষ্ট্যগুলিকে একটি নতুন বস্তুতে প্রসারিত করে, যার ফলে একটি অগভীর অনুলিপি হয়।
const copyUsingSpread = { ...original }; copyUsingSpread.bc = 4; // Also affects the 'original' object
JSON.parse এবং JSON.stringify : এই পদ্ধতি অবজেক্টটিকে একটি JSON স্ট্রিং-এ সিরিয়ালাইজ করে এবং তারপরে এটিকে আবার একটি নতুন অবজেক্টে পার্স করে। এটি কার্যকরভাবে একটি গভীর অনুলিপি তৈরি করে কিন্তু ফাংশন, তারিখ অবজেক্ট, অনির্ধারিত, এবং অন্যান্য অ-ক্রমিক মানগুলি পরিচালনা করতে পারে না।
const deepCopy = JSON.parse(JSON.stringify(original)); deepCopy.bc = 5; // Does not affect the 'original' object
লাইব্রেরি : আরও জটিল পরিস্থিতির জন্য, Lodash-এর মতো লাইব্রেরিগুলি ফাংশনগুলি অফার করে (যেমন, _.cloneDeep()
) যা JSON পদ্ধতির চেয়ে আরও কার্যকরভাবে বিভিন্ন ডেটা প্রকার পরিচালনা সহ গভীর ক্লোন অবজেক্ট করতে পারে।
আসুন আমাদের সহযোগিতামূলক লেখার প্রকল্পের উদাহরণটি আবার দেখুন:
const project = { title: "Adventures in Code", characters: { protagonist: { name: "Alex", traits: ["brave", "curious"] } }, setting: { location: "Virtual World", era: "future" } };
মূলটিকে প্রভাবিত না করে প্রকল্পটি সংশোধন করতে:
JSON.parse(JSON.stringify(project))
ব্যবহার করুন।
Object.assign
বা স্প্রেড অপারেটর ব্যবহার করুন যেখানে নেস্টেড কাঠামো একটি উদ্বেগের বিষয় নয়।
একটি অগভীর এবং গভীর অনুলিপির মধ্যে নির্বাচন করা বস্তুর জটিলতা এবং আপনার ম্যানিপুলেশনের নির্দিষ্ট প্রয়োজনীয়তার উপর নির্ভর করে। অগভীর অনুলিপিগুলি সহজ বস্তুর জন্য দ্রুত এবং আরও উপযুক্ত, যখন নেস্টেড স্ট্রাকচার সহ বস্তুগুলির জন্য গভীর অনুলিপিগুলি প্রয়োজনীয়, নিশ্চিত করে যে মূল বস্তুটি অস্পৃশ্য থাকে৷
এই মোকাবিলা করার কৌশলগুলি বোঝার এবং প্রয়োগ করে, আপনি জাভাস্ক্রিপ্টের রেফারেন্স-ভিত্তিক সিস্টেমে আত্মবিশ্বাসের সাথে নেভিগেট করতে পারেন, আপনার ডেটা ম্যানিপুলেশনগুলি সুনির্দিষ্ট এবং ইচ্ছাকৃত তা নিশ্চিত করে।
যেমন একটি উপন্যাসের চরিত্রগুলি তাদের পূর্বপুরুষদের থেকে বৈশিষ্ট্যগুলি উত্তরাধিকারসূত্রে পায়, জাভাস্ক্রিপ্টের বস্তুগুলি তাদের প্রোটোটাইপগুলি থেকে বৈশিষ্ট্য এবং পদ্ধতিগুলি উত্তরাধিকার সূত্রে পায়। এই ধারণাটি গল্প বলার নৈপুণ্যকে প্রতিফলিত করে এমিলি এবং থমাস তাদের উপন্যাস "অ্যাডভেঞ্চারস ইন কোড" এ অনুসন্ধান করেছেন।
প্রোটোটাইপ সম্পর্কে আমাদের বোধগম্যতা আরও গভীর করার জন্য, আসুন তাদের গল্পটি চালিয়ে যাওয়া যাক, একটি নতুন চরিত্রের আর্ক প্রবর্তন করা যাক যা জাভাস্ক্রিপ্টের উত্তরাধিকার মডেলকে প্রতিফলিত করে।
তাদের উপন্যাসের জগতে, "প্রাচীন কোডার" নামে পরিচিত একজন কিংবদন্তী লেখকের অস্তিত্ব রয়েছে, যিনি তার জ্ঞান এবং ভাষার দক্ষতার জন্য বিখ্যাত। এমিলি এবং থমাস এই পৌরাণিক চিত্রের উপর ভিত্তি করে একটি নতুন চরিত্র "কোডার লিও" করার সিদ্ধান্ত নেন, যা কোডারদের পরবর্তী প্রজন্মের প্রতিনিধিত্ব করে।
// The Ancient Coder, known for his profound wisdom const ancientCoder = { wisdom: 100 }; // Coder Leo, a young scribe in training const coderLeo = { __proto__: ancientCoder, age: 15 };
এই আখ্যানে, কোডার লিও সরাসরি "দ্য প্রোটোটাইপ চেইন" নামে পরিচিত একটি জাদুকরী উত্তরাধিকারের মাধ্যমে প্রাচীন কোডারের সাথে যুক্ত। এই সংযোগ লিওকে তার পূর্বপুরুষের বুদ্ধিতে ট্যাপ করতে দেয়।
console.log(coderLeo.wisdom); // 100
প্রোটোটাইপ চেইনের জন্য ধন্যবাদ, কোডার লিও তার যৌবন সত্ত্বেও প্রাচীন কোডারের জ্ঞান অ্যাক্সেস করতে পারে। কিন্তু কি হবে যখন তারা একটি চ্যালেঞ্জ বা বৈশিষ্ট্যের সম্মুখীন হয় যা প্রাচীন কোডারের কাছে ছিল না?
console.log(coderLeo.courage); // undefined
এই পরিস্থিতি জাভাস্ক্রিপ্টের প্রোটোটাইপ সিস্টেমের একটি মূল নীতিকে ব্যাখ্যা করে: যদি বস্তুতে কোনো প্রপার্টি পাওয়া না যায়, তাহলে জাভাস্ক্রিপ্ট প্রোটোটাইপ চেইনটি খুঁজে বের করার জন্য তা খুঁজে বের করবে। যদি সম্পত্তি এখনও পাওয়া না যায়, undefined
ফেরত দেওয়া হয়, যে বৈশিষ্ট্যের অনুপস্থিতি নির্দেশ করে।
তাদের আখ্যানকে আরও এগিয়ে নিতে, এমিলি এবং থমাস অন্বেষণ করেন কীভাবে বংশধরদের মধ্যে অনন্য বৈশিষ্ট্য যোগ করা যায়, তাদের পূর্বপুরুষদের থেকে আলাদা করে:
// Introducing a unique trait to Coder Leo coderLeo.courage = 50; console.log(ancientCoder.courage); // undefined console.log(coderLeo.courage); // 50
এখানে, কোডার লিও সাহসের একটি বৈশিষ্ট্য বিকাশ করে, যা প্রাচীন কোডার থেকে আলাদা। এই পরিবর্তনটি প্রাচীন কোডারের বৈশিষ্ট্যগুলিকে পরিবর্তন করে না, জাভাস্ক্রিপ্টের গতিশীল প্রকৃতির জন্য ধন্যবাদ কীভাবে বস্তু (বা অক্ষর) তাদের প্রোটোটাইপ (বা পূর্বপুরুষ) থেকে স্বাধীনভাবে বিকশিত হতে পারে তা চিত্রিত করে।
গল্পের মধ্যে এই গল্পটি কেবল এমিলি এবং থমাসের উপন্যাসকে অগ্রসর করে না বরং জাভাস্ক্রিপ্টের প্রোটোটাইপ-ভিত্তিক উত্তরাধিকারের উপরও আলোকপাত করে। একটি উপন্যাসের চরিত্রের মতো, বস্তুগুলি তাদের পূর্বপুরুষদের কাছ থেকে বৈশিষ্ট্যগুলি উত্তরাধিকার সূত্রে পেতে পারে। তবুও, তারা তাদের নিজস্ব পথ তৈরি করার ক্ষমতাও রাখে, অনন্য বৈশিষ্ট্যগুলি বিকাশ করে যা তাদের ব্যক্তিগত যাত্রাকে প্রতিফলিত করে।
এমিলি এবং থমাস যখন তাদের উপন্যাস "অ্যাডভেঞ্চারস ইন কোড" এর গভীরে গিয়েছিলেন, তখন তারা একটি রহস্যময় অধ্যায়ে হোঁচট খেয়েছিল: প্রাচীন টোম অফ প্রোটোস। এই টোমটি, তারা আবিষ্কার করেছিল, এটি কেবল একটি প্লট ডিভাইস নয় বরং জাভাস্ক্রিপ্টে প্রোটোটাইপ এবং অন্তর্নির্মিত পদ্ধতিগুলি বোঝার জন্য একটি রূপক - ধারণা যা তাদের গল্পের জগতে এবং কোডিং সম্পর্কে তাদের বোঝার জন্য জাদুর একটি স্তর যুক্ত করবে।
স্ক্রিপ্টসভিলে, তাদের উপন্যাসের কাল্পনিক বিন্যাস, প্রতিটি চরিত্র এবং বস্তু টোম অফ প্রোটোসের ক্ষমতার সাথে আবদ্ধ। এই জাদুকরী বইটি সমস্ত জ্ঞান এবং দক্ষতার উৎস, জাভাস্ক্রিপ্টের প্রোটোটাইপের অনুরূপ যা থেকে বস্তুগুলি বৈশিষ্ট্য এবং পদ্ধতির উত্তরাধিকারী হয়।
// A seemingly ordinary quill in Scriptsville const quill = {};
এমিলি, তার চরিত্র এলির মাধ্যমে, এই কুইলটি অন্বেষণ করে, শুধুমাত্র এটিকে একটি জাদুকরী থ্রেডের মাধ্যমে টোম অফ প্রোটোসের সাথে লিঙ্কযুক্ত খুঁজে পেতে - জাভাস্ক্রিপ্ট অবজেক্টের __proto__
সম্পত্তির সাথে সরাসরি সাদৃশ্য, তাদের প্রোটোটাইপের সাথে সংযুক্ত করে।
console.log(quill.__proto__); // Reveals the Tome's ancient scripts!
এই উদ্ঘাটনটি এলিকে টোমের জ্ঞান অ্যাক্সেস করতে দেয়, যার মধ্যে hasOwnProperty
এবং toString
আহ্বান করার ক্ষমতা সহ, অবজেক্ট প্রোটোটাইপ থেকে উত্তরাধিকারসূত্রে পাওয়া জাভাস্ক্রিপ্টের অন্তর্নির্মিত পদ্ধতিগুলি প্রদর্শন করে।
আখ্যানটি তখন থমাসের চরিত্র, মাস্টার ডোনোভানকে পরিচয় করিয়ে দেয়, একজন বিখ্যাত বেকার যা তার মন্ত্রমুগ্ধ ডোনাটের জন্য পরিচিত। তার রন্ধনসম্পর্কীয় উপহার ভাগ করার জন্য, ডোনোভান একটি বানান তৈরি করেন, অনেকটা জাভাস্ক্রিপ্টে একটি কনস্ট্রাক্টর ফাংশন সংজ্ঞায়িত করার মতো:
function EnchantedDoughnut() { this.flavor = "magic"; } EnchantedDoughnut.prototype.eat = function() { console.log("Tastes like enchantment!"); };
ডোনোভানের তৈরি প্রতিটি ডোনাট মন্ত্রমুগ্ধের সারাংশ বহন করে, যে কেউ এগুলি খায় তাকে জাদু অনুভব করতে দেয়। গল্পের এই অংশটি ব্যাখ্যা করে যে কীভাবে জাভাস্ক্রিপ্টে কনস্ট্রাক্টর ফাংশন দিয়ে তৈরি করা বস্তুগুলি তাদের কনস্ট্রাক্টরের প্রোটোটাইপ থেকে পদ্ধতির উত্তরাধিকারী হয়, ঠিক যেমন ডোনোভানের ডোনাটগুলি খাওয়ার ক্ষমতা উত্তরাধিকার সূত্রে পায়।
স্ক্রিপ্টসভিল যেমন বিকশিত হয়, তেমনি এর যাদুও ঘটে, প্রাচীন বানান থেকে শ্রেণী বিন্যাসের আধুনিক শিল্পে রূপান্তরিত হয়। এমিলি এবং থমাস নতুন সিনট্যাক্সের সাথে ডোনোভানের নৈপুণ্যকে নতুন করে কল্পনা করেন, তার জাদুকে আরও অ্যাক্সেসযোগ্য করে তোলে এবং জাভাস্ক্রিপ্টে সমসাময়িক অনুশীলনের সাথে সারিবদ্ধ করে:
class ModernEnchantedDoughnut { constructor() { this.flavor = "modern magic"; } eat() { console.log("Tastes like modern enchantment!"); } }
এই রূপান্তরটি শুধুমাত্র ডোনোভানের বেকিং আর্টকে আপডেট করে না বরং জাভাস্ক্রিপ্টের বিবর্তনকেও প্রতিফলিত করে, অন্তর্নিহিত প্রোটোটাইপ-ভিত্তিক উত্তরাধিকার সংরক্ষণের সময় ক্লাস সিনট্যাক্সের কমনীয়তা এবং দক্ষতা হাইলাইট করে।
"অ্যাডভেঞ্চারস ইন কোড" তৈরির মাধ্যমে এমিলি এবং থমাসের যাত্রা প্রোটোটাইপ, অন্তর্নির্মিত পদ্ধতি এবং জাভাস্ক্রিপ্টের বিবর্তন বোঝার জন্য একটি চিত্তাকর্ষক রূপক হয়ে ওঠে।
তাদের চরিত্র এবং গল্পের মাধ্যমে, তারা জটিল ধারণাগুলিকে এমনভাবে আলোকিত করে যা আকর্ষক এবং গভীর, দেখায় যে প্রতিটি বস্তু এবং চরিত্র, অনেকটা প্রতিটি জাভাস্ক্রিপ্ট বস্তুর মতো, উত্তরাধিকার এবং উদ্ভাবনের একটি বৃহত্তর, আন্তঃসংযুক্ত ট্যাপেস্ট্রির অংশ।
তাদের গল্প গল্প বলা এবং প্রোগ্রামিং উভয় ক্ষেত্রেই একটি মৌলিক সত্যকে আন্ডারস্কোর করে: বর্তমানকে আয়ত্ত করতে এবং ভবিষ্যতের জন্য উদ্ভাবনের জন্য অতীত বোঝা অপরিহার্য।
স্ক্রিপ্টসভিলের জাদুকরী জগত, এর প্রাচীন টোম, মন্ত্রমুগ্ধ ডোনাট এবং আধুনিক জাদু সহ, জাভাস্ক্রিপ্টের প্রোটোটাইপ সিস্টেমের গভীরতা এবং উত্তরাধিকারের ক্ষমতা অন্বেষণের জন্য একটি প্রাণবন্ত পটভূমি হিসাবে কাজ করে।
এমিলি এবং থমাস যখন তাদের উপন্যাস অ্যাডভেঞ্চারস ইন কোডের গভীরে গিয়েছিলেন, তখন তারা চরিত্র, সেটিংস এবং জাদুকরী আইটেম দিয়ে ভরা জটিল বিশ্ব পরিচালনা করার জন্য একটি উপায়ের প্রয়োজনীয়তা আবিষ্কার করেছিলেন।
তারা স্ক্রিপ্টসভিলের একজন জ্ঞানী লেখক এলির দিকে ফিরেছিল, যা মন্ত্রমুগ্ধকর বস্তু এবং দেশ জুড়ে সাদৃশ্য নিশ্চিত করার দক্ষতার জন্য পরিচিত।
এলি তাদের সাথে একটি জাদুকরী সূত্র ভাগ করেছে, ensureObjectPath
, তাদের বিশ্বের মধ্যে নেস্টেড রাজ্যের অস্তিত্ব নিশ্চিত করতে সক্ষম:
function ensureObjectPath({obj, path}) { path.split('.').reduce((acc, part) => { if (!acc[part]) acc[part] = {}; return acc[part]; }, obj); return obj; } // Ensuring the path to a hidden forest in their novel const world = {}; ensureObjectPath({obj: world, path: 'hidden.forest.clearing'}); console.log(world); // Outputs: { hidden: { forest: { clearing: {} } } }
এলি ব্যাখ্যা করেছেন যে এই মুগ্ধতা তাদের উপন্যাসের মহাবিশ্বে যে কোনও অবস্থান তৈরি করতে দেয়, নিশ্চিত করে যে প্রতিটি চরিত্র অস্তিত্বহীন রাজ্যে প্রবেশের ভয় ছাড়াই তাদের অনুসন্ধানে যাত্রা শুরু করতে পারে।
তদ্ব্যতীত, এলি তাদের আরেকটি বানান, checkForRequiredKeys
সাথে পরিচয় করিয়ে দিয়েছিলেন, যা নিশ্চিত করার জন্য ডিজাইন করা হয়েছে যে প্রতিটি চরিত্র তাদের যাত্রার জন্য প্রয়োজনীয় প্রয়োজনীয় বৈশিষ্ট্যগুলি ধারণ করে:
const REQUIRED_KEYS = ['age', 'address', 'gender']; function checkForRequiredKeys(obj) { REQUIRED_KEYS.forEach(key => { if (!Object.hasOwn(obj, key)) { obj[key] = {}; } }); } // Ensuring every character has the essential attributes const character = { name: "Ellie" }; checkForRequiredKeys(character); console.log(character); // Outputs: { name: "Ellie", age: {}, address: {}, gender: {} }
এই বানানটি এমিলি এবং থমাসকে তাদের চরিত্রগুলিতে জটিলতা বুনতে দেয়, নিশ্চিত করে যে কোনও বিশদ উপেক্ষা করা হয়নি, তাদের বর্ণনা যতই জটিল হয়ে উঠুক না কেন।
তাদের গল্প উন্মোচিত হওয়ার সাথে সাথে, এলি যে মন্ত্রগুলি ভাগ করেছে তা কেবল "অ্যাডভেঞ্চারস ইন কোড"কে সমৃদ্ধ করেনি বরং জাভাস্ক্রিপ্টে অবজেক্ট ম্যানিপুলেশন এবং কাঠামোর অন্তর্নিহিত নীতিগুলিও আলোকিত করেছে।
ঠিক যেভাবে ensureObjectPath
বানান নেস্টেড বাস্তবতা তৈরির জন্য অনুমোদিত, জাভাস্ক্রিপ্ট বিকাশকারীরা তাদের অ্যাপ্লিকেশনের মধ্যে ডেটা গঠনের অনুরূপ শক্তি ব্যবহার করে।
একইভাবে, checkForRequiredKeys
বানান ডেটা অখণ্ডতা নিশ্চিত করার জন্য প্রয়োজনীয় প্রতিরক্ষামূলক প্রোগ্রামিং অনুশীলনগুলিকে প্রতিফলিত করে।
Scriptsville, Emily, Thomas, Ellie এর মন্ত্রমুগ্ধ রাজ্যে আমাদের বিচরণে আমাদের সঙ্গী হয়েছে, জাভাস্ক্রিপ্টের রহস্য উন্মোচন করেছে ভূমির মতই মনোমুগ্ধকর।
দুঃসাহসিক কাজ এবং আবিষ্কারের গল্পের মাধ্যমে, আমরা জাভাস্ক্রিপ্টের হৃদয়ের গভীরে প্রবেশ করেছি, এর সহজ সিনট্যাক্স থেকে জটিল ইঞ্জিনগুলি যা এর পৃষ্ঠের নীচে স্পন্দিত হয়।
এটা অন্য যে কোন যাত্রার মত নয়, যেখানে গল্প বলার জাদু প্রোগ্রামিং এর যুক্তির সাথে মিশে যায়, জাভাস্ক্রিপ্টের মহাবিশ্বের স্তরযুক্ত বিস্ময় প্রকাশ করে।
===
), আলগা সমতা ( ==
) বোঝার গুরুত্ব এবং সূক্ষ্ম তুলনার জন্য Object.is
এর ব্যবহারকে আলোকিত করেছে।
অবজেক্ট প্রপার্টি এবং প্রোটোটাইপস : অবজেক্ট প্রোপার্টিগুলির মধ্যে অনুসন্ধান করে, আমরা অবজেক্টের উত্তরাধিকারে প্রোটোটাইপগুলির মূল ভূমিকা সহ বৈশিষ্ট্যগুলি অ্যাক্সেস এবং পরিবর্তন করার জন্য ডট এবং বন্ধনী নোটেশনের শক্তি আবিষ্কার করেছি।
স্ক্রিপ্টসভিলে উত্তরাধিকার তারের গল্প এবং মন্ত্রমুগ্ধ স্ক্রোলগুলি প্রোটোটাইপ চেইনকে জীবন্ত করে তুলেছে, কীভাবে বস্তুগুলি বৈশিষ্ট্যগুলিকে উত্তরাধিকারসূত্রে প্রাপ্ত এবং ওভাররাইড করে তা প্রদর্শন করে৷
ensureObjectPath
এবং checkForRequiredKeys
, নেস্টেড বস্তুর সাথে কাজ করার এবং প্রয়োজনীয় বৈশিষ্ট্যগুলির উপস্থিতি নিশ্চিত করার জন্য ব্যবহারিক কৌশলগুলি প্রদর্শন করেছে৷
স্ক্রিপ্টসভিলের বর্ণনার লেন্সের মাধ্যমে, আমরা দেখেছি কিভাবে জাভাস্ক্রিপ্টের বৈশিষ্ট্যগুলি যাদুকর এবং যৌক্তিক উভয়ই হতে পারে, যা বিকাশকারীদের সৃজনশীলতা এবং সমস্যা সমাধানের জন্য একটি বিশাল খেলার মাঠ সরবরাহ করে।
স্ক্রিপ্টসভিলের মনোমুগ্ধকর গল্পগুলি কেবল গল্পের চেয়ে বেশি; এগুলি হল প্রোগ্রামিংয়ের শৈল্পিকতার রূপক, আমাদের ডিজিটাল বিশ্বকে দক্ষতার সাথে তৈরি করার জন্য জাভাস্ক্রিপ্টের মূল নীতিগুলি বোঝার গুরুত্ব তুলে ধরে।
এই যাত্রায় বইটি বন্ধ করার সাথে সাথে মনে রাখবেন যে অ্যাডভেঞ্চার এখানেই শেষ নয়। আমরা অন্বেষণ করেছি প্রতিটি ধারণা জাভাস্ক্রিপ্টের গভীরতর বোঝার এবং আয়ত্তের জন্য একটি ধাপ।
এমিলি এবং থমাস যেমন "কোডের অ্যাডভেঞ্চারস" এর গল্প বোনা করেছিলেন, তেমনি আপনিও প্রোগ্রামিংয়ের সীমাহীন মহাবিশ্বের মধ্যে আপনার আখ্যান, মন্ত্রমুগ্ধ বস্তু এবং জাদুকরী রাজ্যগুলি তৈরি করতে পারেন।