উত্তর
Closure হলো একটি ফাংশন যা তার বাইরের ফাংশনের ভেরিয়েবলগুলোকে access করতে পারে, এমনকি বাইরের ফাংশন execute হওয়ার পরেও। উদাহরণ: ```javascript function outer() { let count = 0; return function inner() { count++; return count; } } const counter = outer(); console.log(counter()); // 1 console.log(counter()); // 2 ```
উত্তর
১. var: function-scoped, hoisted, পুনরায় declare করা যায়। ২. let: block-scoped, re-declare করা যায় না, কিন্তু মান পরিবর্তন করা যায়। ৩. const: block-scoped, মান পরিবর্তন বা re-assign করা যায় না। আধুনিক জাভাস্ক্রিপ্টে let এবং const ব্যবহার করা বেস্ট প্র্যাকটিস।
উত্তর
Hoisting হলো জাভাস্ক্রিপ্টের এমন একটি মেকানিজম যেখানে ভেরিয়েবল এবং ফাংশন ডিক্লারেশনগুলো কোড রান হওয়ার আগে তাদের স্কোপের উপরে চলে যায়। তবে var-এর ক্ষেত্রে শুধুমাত্র ডিক্লারেশন হোইস্ট হয়, মান নয়। let এবং const হোইস্ট হলেও Temporal Dead Zone-এর কারণে এরর দেয়।
উত্তর
== (Loose Equality): এটি শুধুমাত্র মান চেক করে এবং প্রয়োজনে টাইপ কনভার্সন (Coercion) করে। === (Strict Equality): এটি মান এবং ডাটা টাইপ উভয়ই চেক করে। উদাহরণ: `5 == '5'` আউটপুট true দিবে, কিন্তু `5 === '5'` আউটপুট false দিবে।
উত্তর
this-এর মান নির্ভর করে ফাংশনটি কোথায় এবং কীভাবে কল করা হয়েছে তার ওপর। গ্লোবাল কন্টেক্সটে এটি window অবজেক্টকে বোঝায়, অবজেক্ট মেথডে এটি সেই অবজেক্টকে বোঝায়, আর অ্যারো ফাংশনে এটি তার বাইরের স্কোপের this-কে গ্রহণ করে।
উত্তর
Promise হলো অ্যাসিনক্রোনাস অপারেশন হ্যান্ডেল করার একটি অবজেক্ট। এর ৩টি স্টেট থাকে: ১. Pending: শুরুর অবস্থা। ২. Fulfilled: অপারেশন সফলভাবে শেষ হয়েছে। ৩. Rejected: অপারেশন ব্যর্থ হয়েছে।
উত্তর
async/await হলো প্রমিজ হ্যান্ডেল করার একটি আধুনিক ও সহজ পদ্ধতি। এটি অ্যাসিনক্রোনাস কোডকে দেখতে সিনক্রোনাস কোডের মতো করে তোলে, যা কোড পড়তে ও বুঝতে সুবিধা দেয়। এটি সবসময় একটি প্রমিজ রিটার্ন করে।
উত্তর
জাভাস্ক্রিপ্ট সিঙ্গেল থ্রেডেড হওয়া সত্ত্বেও ইভেন্ট লুপের মাধ্যমে অ্যাসিনক্রোনাস কাজ করে। এটি কল স্ট্যাক (Call Stack) চেক করে, যদি স্ট্যাক খালি থাকে তবে টাস্ক কিউ (Task Queue) থেকে কাজগুলো স্ট্যাকে পাঠিয়ে এক্সিকিউট করে।
উত্তর
জাভাস্ক্রিপ্টে প্রতিটি অবজেক্টের একটি প্রোটোটাইপ থাকে। যখন আমরা কোনো অবজেক্টের প্রপার্টি খুঁজি এবং তা সেখানে না থাকে, তখন জাভাস্ক্রিপ্ট তার প্রোটোটাইপ চেইনে সেটি খোঁজে। এভাবেই এক অবজেক্ট অন্য অবজেক্টের বৈশিষ্ট্য উত্তরাধিকার সূত্রে পায়।
উত্তর
১. call: ফাংশনকে সরাসরি কল করে এবং আর্গুমেন্টগুলো আলাদাভাবে নেয়। ২. apply: ফাংশনকে সরাসরি কল করে কিন্তু আর্গুমেন্টগুলো একটি অ্যারে হিসেবে নেয়। ৩. bind: ফাংশনটিকে সরাসরি কল না করে একটি নতুন ফাংশন রিটার্ন করে যা পরে কল করা যায়।
উত্তর
Shallow Copy শুধুমাত্র মেইন অবজেক্টকে কপি করে কিন্তু নেস্টেড অবজেক্টের রেফারেন্স রেখে দেয়। Deep Copy একদম নতুন একটি কপি তৈরি করে যেখানে নেস্টেড অবজেক্টগুলোরও আলাদা মেমোরি রেফারেন্স থাকে।
উত্তর
অনেকগুলো চাইল্ড এলিমেন্টে আলাদা ইভেন্ট লিসেনার না লাগিয়ে তাদের প্যারেন্ট এলিমেন্টে একটি মাত্র ইভেন্ট লিসেনার লাগানোকে ইভেন্ট ডেলিগেশন বলে। এটি মেমোরি বাঁচায় এবং ডাইনামিক এলিমেন্টের ক্ষেত্রে ভালো কাজ করে।
উত্তর
যে ফাংশন একই ইনপুটের জন্য সবসময় একই আউটপুট দেয় এবং ফাংশনের বাইরে কোনো পরিবর্তন (Side effect) ঘটায় না, তাকে Pure Function বলে।
উত্তর
Debouncing ফাংশন কলকে নির্দিষ্ট সময় পিছিয়ে দেয় যতক্ষণ ইউজার টাইপিং বা অ্যাকশন থামায়। Throttling নিশ্চিত করে যে ফাংশনটি একটি নির্দিষ্ট সময় পরপর একবারই রান করবে।
উত্তর
let বা const দিয়ে ভেরিয়েবল ডিক্লেয়ার করার আগে যখন আমরা সেটি অ্যাক্সেস করার চেষ্টা করি, তখন যে এরর দেয়, সেই সময় বা অবস্থাকেই TDZ বলে। এটি হোইস্টিং থাকা সত্ত্বেও নিরাপদ কোড লিখতে সাহায্য করে।
উত্তর
NaN মানে হলো 'Not-a-Number'। এটি তখন তৈরি হয় যখন কোনো গাণিতিক অপারেশন অবৈধ হয় (যেমন: 'Hello' * 5)। মজার ব্যাপার হলো typeof NaN হলো 'number'।
উত্তর
Object শুধুমাত্র স্ট্রিং বা সিম্বলকে কি (key) হিসেবে নিতে পারে, কিন্তু Map যেকোনো ডাটা টাইপকে (এমনকি অবজেক্টকেও) কি হিসেবে নিতে পারে। এছাড়া Map এর এলিমেন্টগুলো ইনসার্ট করার ক্রম বজায় রাখে।
উত্তর
Undefined মানে হলো একটি ভেরিয়েবল ডিক্লেয়ার করা হয়েছে কিন্তু মান দেওয়া হয়নি। Null হলো একটি অ্যাসাইনমেন্ট ভ্যালু যা দিয়ে বোঝানো হয় ভেরিয়েবলটি বর্তমানে খালি।
উত্তর
Spread (...) অ্যারে বা অবজেক্টকে ছড়িয়ে দেয় বা কপি করে। Rest (...) অনেকগুলো আর্গুমেন্টকে একটি অ্যারেতে পরিণত করে।
উত্তর
যে ফাংশন অন্য কোনো ফাংশনকে আর্গুমেন্ট হিসেবে গ্রহণ করে অথবা একটি ফাংশন রিটার্ন করে, তাকে Higher Order Function বলে। যেমন: map, filter, reduce।
উত্তর
Currying হলো এমন একটি প্রসেস যেখানে একটি ফাংশন যা একাধিক আর্গুমেন্ট নেয়, তাকে এমন একটি ফাংশনের সিরিজে রূপান্তর করা হয় যা প্রতিবার মাত্র একটি আর্গুমেন্ট গ্রহণ করে। ব্যবহার: এটি কোড রিইউজেবিলিটি বাড়াতে এবং ফাংশনাল কম্পোজিশনে সাহায্য করে। উদাহরণ: ```javascript const multiply = a => b => c => a * b * c; console.log(multiply(2)(3)(4)); // 24 ```
উত্তর
Memoization হলো একটি অপ্টিমাইজেশন টেকনিক যেখানে বড় বা জটিল ক্যালকুলেশনের ফলাফল ক্যাশ (cache) করে রাখা হয়। যদি একই ইনপুট দিয়ে আবার ফাংশন কল করা হয়, তবে সেটি নতুন করে ক্যালকুলেশন না করে ক্যাশ থেকে রেজাল্ট দিয়ে দেয়। এটি অ্যাপ্লিকেশনের পারফরম্যান্স এবং স্পিড বহুগুণ বাড়িয়ে দেয়।
উত্তর
IIFE এমন একটি ফাংশন যা ডিফাইন করার সাথে সাথেই রান হয়ে যায়। এর মূল উদ্দেশ্য হলো একটি প্রাইভেট স্কোপ তৈরি করা যাতে গ্লোবাল ভেরিয়েবল কনফ্লিক্ট না হয় এবং ভেরিয়েবলগুলো বাইরের কোড থেকে সুরক্ষিত থাকে।
উত্তর
Generator function হলো এমন ফাংশন যা মাঝপথে থেমে যেতে পারে (yield) এবং পরে আবার সেখান থেকেই শুরু হতে পারে। এটি `function*` দিয়ে ডিফাইন করা হয়। পার্থক্য: সাধারণ ফাংশন একবার রান শুরু করলে শেষ না হওয়া পর্যন্ত থামে না, কিন্তু জেনারেটর ফাংশন ইটারেটর অবজেক্ট রিটার্ন করে এবং কন্ট্রোল ইউজারের হাতে রাখে।
উত্তর
১. Map-এর কি (key) যেকোনো কিছু হতে পারে, কিন্তু WeakMap-এর কি অবশ্যই একটি অবজেক্ট হতে হবে। ২. WeakMap-এর কি-গুলো গারবেজ কালেকশনের জন্য উন্মুক্ত থাকে। অর্থাৎ কি হিসেবে থাকা অবজেক্টটির রেফারেন্স না থাকলে সেটি মেমোরি থেকে অটোমেটিক মুছে যায়। ৩. WeakMap ইটারেবল নয় (লুপ চালানো যায় না)।
উত্তর
জাভাস্ক্রিপ্টে যখন কোনো অবজেক্টের প্রপার্টি অ্যাক্সেস করা হয়, তখন ইঞ্জিন প্রথমে সেই অবজেক্টে খোঁজে। না পেলে তার প্রোটোটাইপে খোঁজে, সেখানেও না পেলে তার উপরের প্রোটোটাইপে খোঁজে। এভাবে খুঁজতে খুঁজতে যতক্ষণ না `null` পায়, এই চেইনটিকেই Prototype Chain বলে।
উত্তর
'use strict' যোগ করলে জাভাস্ক্রিপ্ট ইঞ্জিন কোডকে আরও কঠোরভাবে চেক করে। সুবিধা: ১. অনিচ্ছাকৃত গ্লোবাল ভেরিয়েবল ডিক্লেয়ার করা বন্ধ করে। ২. সাইলেন্ট এররগুলোকে (যে এররগুলো আগে ধরা পড়ত না) থ্রো করে। ৩. কোডকে আরও সিকিউর এবং ফাস্ট করে।
উত্তর
আধুনিক ইঞ্জিনগুলো (যেমন V8) JIT (Just-In-Time) কম্পাইলেশন ব্যবহার করে। প্রথমে কোড পার্স করে AST (Abstract Syntax Tree) তৈরি করে, তারপর সেটিকে ইন্টারপ্রেট করে বাইটকোডে রূপান্তর করে এবং রানটাইমে অপ্টিমাইজ করে মেশিন কোডে কনভার্ট করে।
উত্তর
Optional Chaining (?.) ব্যবহার করলে কোনো প্রপার্টি না থাকলেও এরর দেয় না, undefined রিটার্ন করে। Nullish Coalescing (??) শুধুমাত্র বামের মান null বা undefined হলেই ডানের মানটি নেয়। এটি || অপারেটরের চেয়ে ভালো কারণ এটি 0 বা খালি স্ট্রিংকে মিথ্যা ধরে না।
উত্তর
Object.freeze(): অবজেক্টের কোনো প্রপার্টি অ্যাড, ডিলিট বা চেঞ্জ করা যায় না। এটি পুরোপুরি ইমিউটেবল। Object.seal(): নতুন প্রপার্টি অ্যাড বা ডিলিট করা যায় না, কিন্তু বিদ্যমান প্রপার্টির মান পরিবর্তন করা যায়।
উত্তর
Microtask Queue-এর প্রায়োরিটি বেশি। ইভেন্ট লুপ প্রতিটি ম্যাক্রোটাস্ক (যেমন setTimeout) রান করার আগে মাইক্রোটাস্ক কিউ (যেমন Promises, process.nextTick) পুরোপুরি ক্লিয়ার করে।
উত্তর
Web Worker হলো জাভাস্ক্রিপ্টের একটি ফিচার যা মেইন থ্রেডের বাইরে ব্যাকগ্রাউন্ডে কোড রান করতে দেয়। ব্যবহার: যখন কোনো ভারী ক্যালকুলেশন বা ডাটা প্রসেসিং করতে হয় যা মেইন থ্রেডে করলে ইউজার ইন্টারফেস (UI) হ্যাং হয়ে যেতে পারে, তখন Web Worker ব্যবহার করা হয়।
উত্তর
Shadow DOM হলো ওয়েব কম্পোনেন্টের একটি অংশ যা স্টাইল এবং মার্কআপকে মেইন ডোম থেকে আলাদা (encapsulated) রাখে। এর ফলে কম্পোনেন্টের ভেতরের সিএসএস বাইরের গ্লোবাল স্টাইলের সাথে কনফ্লিক্ট করে না।
উত্তর
Static কিওয়ার্ড ব্যবহার করে ক্লাসের এমন মেথড বা প্রপার্টি তৈরি করা হয় যা ক্লাসের কোনো ইনস্ট্যান্স বা অবজেক্ট তৈরি না করেই সরাসরি ক্লাস থেকে কল করা যায়। এটি মূলত ইউটিলিটি ফাংশন তৈরির জন্য ব্যবহৃত হয়।
উত্তর
Reflect একটি বিল্ট-ইন অবজেক্ট যা ইন্টারসেপ্টেবল জাভাস্ক্রিপ্ট অপারেশনের জন্য মেথড প্রদান করে। এটি মূলত Proxy-র সাথে ব্যবহার করা সহজ এবং এর মেথডগুলো অনেক বেশি রিডেবল ও ক্লিনার।
উত্তর
যখন একটি ফাংশন নিজেকে নিজেই কল করে, তাকে Recursion বলে। ড্র-ব্যাক: সঠিক বেস কেস (Base case) না থাকলে এটি ইনফিনিট লুপে পড়ে যেতে পারে এবং খুব বেশি রিকার্সন কল করলে 'Stack Overflow' এরর দিয়ে মেমোরি ক্র্যাশ করতে পারে।
উত্তর
Proxy অবজেক্ট ব্যবহার করে আপনি অন্য একটি অবজেক্টের চারদিকে একটি র্যাপার তৈরি করতে পারেন। এটি প্রপার্টি রিড, রাইট বা ডিলিট করার মতো অপারেশনগুলোকে ইন্টারসেপ্ট (intercept) করে নিজস্ব লজিক যোগ করতে সাহায্য করে।
উত্তর
ভিউস্পোর্টে (Viewport) কোনো এলিমেন্ট দৃশ্যমান হলো কিনা তা ট্র্যাক করার জন্য এটি ব্যবহৃত হয়। এটি দিয়ে ইমেজ ল্যাজি লোড (Lazy loading), ইনফিনিট স্ক্রল বা অ্যানিমেশন ট্রিগার করার মতো কাজগুলো খুব পারফরম্যান্স-ফ্রেন্ডলি উপায়ে করা যায়।
উত্তর
CORS হলো একটি ব্রাউজার সিকিউরিটি মেকানিজম যা নির্ধারণ করে যে একটি ডোমেইন অন্য কোনো ডোমেইন থেকে ডাটা বা রিসোর্স রিকোয়েস্ট করতে পারবে কিনা। এটি হ্যাকারদের ম্যালিসিয়াস রিকোয়েস্ট থেকে ইউজারকে রক্ষা করে।
উত্তর
History API (যেমন pushState, replaceState) ব্যবহার করে পেজ রিলোড না করেই ব্রাউজারের ইউআরএল পরিবর্তন করা যায়। এর মাধ্যমেই SPA-তে রাউটিং কাজ করে এবং ব্রাউজারের ব্যাক বা ফরওয়ার্ড বাটন কাজ করার সুবিধা পাওয়া যায়।
উত্তর
Call Stack: এটি একটি লিনিয়ার ডাটা স্ট্রাকচার যা ফাংশন এক্সিকিউশন এবং প্রিমিটিভ ভ্যালু স্টোর করে (LIFO পদ্ধতিতে)। Heap: এটি একটি আন-স্ট্রাকচারড মেমোরি স্পেস যেখানে বড় ডাটা যেমন অবজেক্ট এবং অ্যারে স্টোর করা হয়। স্ট্যাকের ভেরিয়েবলগুলো হিপ-এ থাকা অবজেক্টের রেফারেন্স ধারণ করে।
উত্তর
এই অ্যালগরিদমটি 'Root' (গ্লোবাল অবজেক্ট) থেকে শুরু করে প্রতিটি অবজেক্টকে ট্র্যাক করে। যে অবজেক্টগুলো রুট থেকে সরাসরি বা পরোক্ষভাবে অ্যাক্সেস করা যায়, সেগুলোকে 'Mark' করে। বাকি অবজেক্টগুলো (যা অ্যাক্সেসযোগ্য নয়) মেমোরি থেকে মুছে ফেলে (Sweep)।
উত্তর
Polyfill: এটি এমন এক টুকরো কোড যা পুরনো ব্রাউজারে নেই এমন কোনো মডার্ন মেথড (যেমন: Promise, Array.from) নিজ থেকে ইমপ্লিমেন্ট করে দেয়। Transpiler: এটি কোডকে এক ভার্সন থেকে অন্য ভার্সনে রূপান্তর করে (যেমন: Babel ES6 কোডকে ES5 এ রূপান্তর করে)।
উত্তর
যখন কোনো অ্যারের ইনডেক্সগুলো কন্টিনিউয়াস (ধারাবাহিক) হয় না এবং মাঝে অনেক গ্যাপ থাকে, তাকে Sparse Array বলে। জাভাস্ক্রিপ্ট ইঞ্জিন মেমোরি বাঁচাতে এই গ্যাপগুলোর জন্য জায়গা বরাদ্দ করে না, যা বড় ডাটার ক্ষেত্রে মেমোরি সাশ্রয় করে কিন্তু লুপ চালানোর সময় পারফরম্যান্স কিছুটা স্লো করতে পারে।
উত্তর
AbortController একটি সিগন্যাল প্রদান করে যা দিয়ে কোনো চলমান Fetch রিকোয়েস্ট বা অন্য কোনো অ্যাসিনক্রোনাস কাজ মাঝপথে বন্ধ (Cancel) করা যায়। এটি মূলত ইউজারের অপ্রয়োজনীয় নেটওয়ার্ক রিকোয়েস্ট বন্ধ করে ব্যান্ডউইথ বাঁচাতে সাহায্য করে।
উত্তর
একটি ফাংশন ডিক্লেয়ার করার সময় সেটি ঠিক কতগুলো আর্গুমেন্ট গ্রহণ করে তার সংখ্যাকেই ফাংশনটির Arity বলে। এটি `functionName.length` প্রপার্টি দিয়ে চেক করা যায়।
উত্তর
Unary plus অপারেটর একটি অপারেন্ডের আগে বসে সেটিকে দ্রুত সংখ্যায় (Number) রূপান্তর করার চেষ্টা করে। উদাহরণ: `+'5'` রিটার্ন করবে `5` (সংখ্যা হিসেবে)। এটি `Number()` কনস্ট্রাক্টরের একটি শর্টকাট।
উত্তর
Microtask (যেমন: Promises, queueMicrotask) মূলত অত্যন্ত গুরুত্বপূর্ণ কাজের জন্য ব্যবহৃত হয় যা বর্তমান এক্সিকিউশন সাইকেল শেষ হওয়ার সাথে সাথেই হওয়া প্রয়োজন। তাই ইঞ্জিন পরবর্তী ম্যাক্রোটাস্ক (যেমন: setTimeout) নেওয়ার আগে মাইক্রোটাস্ক কিউ পুরোপুরি ক্লিয়ার করে।
উত্তর
এটি এমন একটি অবজেক্ট তৈরি করে যার কোনো প্রোটোটাইপ (Prototype) নেই। অর্থাৎ এই অবজেক্টের ভেতর `toString`, `hasOwnProperty` এর মতো ডিফল্ট মেথডগুলো থাকে না। এটি পিওর ডাটা স্টোর বা ডিকশনারি হিসেবে ব্যবহারের জন্য আদর্শ।
উত্তর
জাভাস্ক্রিপ্টে `Number` টাইপ সর্বোচ্চ `2^53 - 1` পর্যন্ত সংখ্যা নির্ভুলভাবে হ্যান্ডেল করতে পারে। এর চেয়ে বড় পূর্ণসংখ্যা নিয়ে কাজ করার জন্য BigInt ব্যবহার করা হয়। বড় আইডির হিসাব বা ফিন্যান্সিয়াল ক্যালকুলেশনে এটি ব্যবহৃত হয়।
উত্তর
Symbol একটি ইউনিক এবং ইমিউটেবল প্রিমিটিভ। এটি মূলত অবজেক্টের 'Hidden' বা 'Unique' প্রপার্টি কি (key) তৈরি করতে ব্যবহৃত হয় যাতে অন্য কোনো প্রপার্টির সাথে নামের কনফ্লিক্ট না হয় এবং এগুলো লুপে (for...in) ধরা পড়ে না।
উত্তর
এটি ডোম (DOM) ট্রিতে কোনো পরিবর্তন (যেমন এলিমেন্ট অ্যাড, রিমুভ বা অ্যাট্রিবিউট চেঞ্জ) ট্র্যাক করার জন্য ব্যবহৃত হয়। এটি ইভেন্ট লিসেনারের চেয়েও শক্তিশালী কারণ এটি ডোমের স্ট্রাকচারাল চেঞ্জ ডিটেক্ট করতে পারে।
উত্তর
SharedArrayBuffer মেইন থ্রেড এবং ওয়েব ওয়ার্কারের মধ্যে মেমোরি শেয়ার করতে দেয়। এটি পারফরম্যান্স বাড়ালেও 'Spectre' এবং 'Meltdown' এর মতো সিকিউরিটি ভলনারেবিলিটির কারণে অনেক ব্রাউজারে এটি ডিফল্টভাবে ডিজেবল থাকে।
উত্তর
যদি কোনো ফাংশনের শেষ কাজ অন্য একটি ফাংশন কল করা হয়, তবে ইঞ্জিন নতুন স্ট্যাক ফ্রেম তৈরি না করে বর্তমান স্ট্যাকটিই রি-ইউজ করে। একেই TCO বলে। এটি মূলত রিকার্সিভ কলের ক্ষেত্রে কল স্ট্যাক ওভারফ্লো হওয়া থেকে বাঁচায়।
উত্তর
১. Set-এ যেকোনো ডাটা রাখা যায়, WeakSet-এ শুধুমাত্র অবজেক্ট রাখা যায়। ২. WeakSet-এর কি-গুলো গারবেজ কালেকশনের জন্য উন্মুক্ত থাকে। ৩. WeakSet ইটারেবল নয় এবং এতে `size` প্রপার্টি নেই।
উত্তর
এটি এমন একটি ডাটা স্ট্রাকচার যা মডিফাই করার সময় আগের ভার্সনটি ডিলিট না করে সবসময় নতুন ভার্সন তৈরি করে। এটি ইমিউটেবিলিটি বজায় রাখতে সাহায্য করে, যা রিডাক্স (Redux) এর মতো স্টেট ম্যানেজমেন্ট টুলগুলোতে জনপ্রিয়।
উত্তর
যদি কোডের কোনো ফাংশনকে তার রিটার্ন ভ্যালু দিয়ে সরাসরি রিপ্লেস করা যায় এবং এতে প্রোগ্রামের কোনো পরিবর্তন না হয়, তবে তাকে Referential Transparency বলে। এটি পিওর ফাংশনের একটি প্রধান বৈশিষ্ট্য।
উত্তর
১. এটি কোডকে অনেক বেশি রিডেবল এবং ক্লিন করে। ২. এরর হ্যান্ডলিং করার জন্য সিম্পল `try-catch` ব্যবহার করা যায়। ৩. কন্ডিশনাল অ্যাসিনক্রোনাস লজিক লিখতে এটি প্রমিজ চেইনিংয়ের চেয়ে অনেক সহজ।
উত্তর
এটি জাভাস্ক্রিপ্টের একটি ইন্টারনাল মেকানিজম যা কমপ্লেক্স অবজেক্টগুলোকে ডিপ কপি (Deep Copy) করতে ব্যবহৃত হয়। এটি `JSON.stringify` এর চেয়ে শক্তিশালী কারণ এটি সাইক্লিক রেফারেন্স, ম্যাপ এবং সেটকেও কপি করতে পারে।
উত্তর
এটি বড় কোনো ডাটা বা রেসপন্সকে নেটওয়ার্ক থেকে চাঙ্ক (Chunk) হিসেবে রিড করার জন্য ব্যবহৃত হয়। ফলে পুরো ডাটা ডাউনলোড হওয়ার অপেক্ষা না করেই ডাটা প্রসেসিং শুরু করা যায়, যা মেমোরি ইউজ কমিয়ে দেয়।
উত্তর
Object.is() প্রায় স্ট্রিক্ট ইকুয়ালিটির মতোই কিন্তু দুটি বিশেষ ক্ষেত্রে আলাদা: ১. `Object.is(NaN, NaN)` এর মান `true` দেয় (যেখানে === এ false হয়)। ২. `Object.is(+0, -0)` এর মান `false` দেয়।
উত্তর
এর দুটি প্রধান ফেইজ থাকে: ১. Memory Creation Phase: ভেরিয়েবল এবং ফাংশন ডিক্লারেশনের জন্য মেমোরি স্পেস বরাদ্দ করা হয়। ২. Code Execution Phase: কোডগুলো লাইনের পর লাইন রান হয় এবং ভেরিয়েবলগুলোতে মান সেট হয়।
উত্তর
ডেভেলপাররা যখন ব্রাউজারের ডিফল্ট ইভেন্ট (click, submit) ছাড়াও নিজেদের অ্যাপ্লিকেশনের বিশেষ কোনো কাজের জন্য (যেমন: 'userLogin') নতুন ইভেন্ট ফায়ার করতে চান, তখন CustomEvent API ব্যবহার করেন।
উত্তর
এটি সরাসরি বাইনারি ডাটা প্রসেস করার জন্য ব্যবহৃত হয়। সাধারণ অ্যারের চেয়ে এটি অনেক ফাস্ট কারণ এটি ফিক্সড মেমোরি বাফারের সাথে কাজ করে। এটি মূলত WebGL বা অডিও প্রসেসিংয়ের মতো কাজে লাগে।
উত্তর
মাল্টি-থ্রেডিং বা ওয়েব ওয়ার্কারের সাথে কাজ করার সময় যখন একাধিক থ্রেড একই মেমোরি অ্যাক্সেস করে, তখন 'Race Condition' এড়াতে Atomics ব্যবহার করা হয়। এটি প্রতিটি মেমোরি অপারেশনকে অ্যাটমিক বা অখণ্ড রাখে।
উত্তর
মডিউল প্যাটার্ন ব্যবহার করে কোডকে এনক্যাপসুলেট (Encapsulate) করা হয়। এটি কোডকে লজিক্যাল ব্লকে ভাগ করে এবং শুধুমাত্র প্রয়োজনীয় মেথডগুলো পাবলিকলি এক্সপোজ করে বাকিগুলো প্রাইভেট রাখে।
উত্তর
|| অপারেটর সব 'Falsy' ভ্যালুর জন্য ডান পাশের মানটি নেয়। কিন্তু ?? অপারেটর শুধুমাত্র `null` এবং `undefined` এর জন্য ডান পাশের মানটি নেয়। ফলে `0` বা `''` এর মতো ভ্যালিড মানগুলো স্কিপ হয় না।
উত্তর
এটি একটি স্ট্রিং যা ট্রেস করে দেখায় যে এররটি কোডের কোন লাইনে ঘটেছে এবং কোন কোন ফাংশন কলের মাধ্যমে সেই এরর পর্যন্ত আসা হয়েছে। এটি ডিব্যাগিংয়ের জন্য অত্যন্ত গুরুত্বপূর্ণ।
উত্তর
ফাংশনাল কম্পোজিশন হলো ছোট ছোট এবং সহজ ফাংশনকে একত্রিত করে একটি বড় এবং জটিল ফাংশন তৈরি করার প্রক্রিয়া। এটি কোডকে আরও বেশি মডুলার এবং টেস্টেবল করতে সাহায্য করে।
উত্তর
Navigator অবজেক্ট ব্রাউজারের নাম, ভার্সন, ইউজারের অপারেটিং সিস্টেম, ল্যাঙ্গুয়েজ এবং ইউজার বর্তমানে অনলাইন আছে কিনা তা জানায়। এছাড়া এটি দিয়ে ইউজারের জিওলোকেশন অ্যাক্সেস করা যায়।
উত্তর
Optimization Bailout ঘটে যখন জাভাস্ক্রিপ্ট ইঞ্জিন (যেমন V8) একটি ফাংশনকে অপ্টিমাইজ করার পর আবার ডি-অপ্টিমাইজ করতে বাধ্য হয়। এটি সাধারণত ঘটে যদি ফাংশনের প্যারামিটার টাইপ বারবার পরিবর্তন করা হয় (যেমন: একবার Number, একবার String)। এর ফলে পারফরম্যান্স মারাত্মকভাবে কমে যায়।
উত্তর
Ignition হলো V8-এর ইন্টারপ্রেটার যা কোডকে বাইটকোডে রূপান্তর করে সরাসরি রান করে। TurboFan হলো অপ্টিমাইজড কম্পাইলার যা ঘন ঘন চলা কোডগুলোকে (Hot functions) এনালাইসিস করে অত্যন্ত দ্রুত মেশিন কোডে রূপান্তর করে।
উত্তর
জাভাস্ক্রিপ্ট ইঞ্জিন অবজেক্ট প্রপার্টি দ্রুত অ্যাক্সেস করার জন্য ইন্টারনালি 'Hidden Classes' তৈরি করে। যদি দুটি অবজেক্টের প্রপার্টি এবং তাদের অর্ডার একই হয়, তবে তারা একই হিডেন ক্লাস শেয়ার করে, যা মেমোরি এবং স্পিড অপ্টিমাইজ করে।
উত্তর
Chrome DevTools-এর 'Memory' ট্যাব থেকে 'Heap Snapshot' এবং 'Allocation Instrumentation on Timeline' ব্যবহার করা সবচেয়ে কার্যকর। এটি দিয়ে দেখা যায় কোন অবজেক্টগুলো মেমোরি থেকে রিলিজ হচ্ছে না এবং কারা মেমোরি ধরে রাখছে।
উত্তর
Boxing হলো যখন জাভাস্ক্রিপ্ট অটোমেটিক্যালি একটি প্রিমিটিভ ভ্যালুকে (যেমন: string) অবজেক্টে রূপান্তর করে যাতে তার ওপর মেথড কল করা যায়। Unboxing হলো সেই অবজেক্ট থেকে পুনরায় প্রিমিটিভ ভ্যালুটি বের করে আনা।
উত্তর
১. ইউজারের ইনপুট সবসময় স্যানিটাইজ (Sanitize) করা। ২. `innerHTML` এর বদলে `textContent` ব্যবহার করা। ৩. Content Security Policy (CSP) হেডার সেট করা। ৪. আধুনিক ফ্রেমওয়ার্ক (যেমন React) ব্যবহার করা যা ডিফল্টভাবে ইনপুট এস্কেপ করে।
উত্তর
কারণ জাভাস্ক্রিপ্টে ফাংশনকে ভেরিয়েবলে স্টোর করা যায়, অন্য ফাংশনে আর্গুমেন্ট হিসেবে পাঠানো যায় এবং অন্য ফাংশন থেকে রিটার্নও করা যায়। অর্থাৎ ফাংশন এখানে অন্য যেকোনো ডাটা টাইপের মতোই আচরণ করে।
উত্তর
In-place অ্যালগরিদম সরাসরি অরিজিনাল ডাটা স্ট্রাকচারকে পরিবর্তন করে (যেমন: `arr.sort()`) এবং বাড়তি মেমোরি নেয় না। Out-of-place অ্যালগরিদম নতুন ডাটা স্ট্রাকচার রিটার্ন করে (যেমন: `arr.map()`) এবং অরিজিনাল ডাটা ঠিক রাখে।
উত্তর
Lexical Environment-এ বর্তমান স্কোপের ভেরিয়েবল এবং তার প্যারেন্ট স্কোপের রেফারেন্স থাকে। Variable Environment মূলত শুধুমাত্র `var` দিয়ে ডিক্লেয়ার করা ভেরিয়েবলগুলো ধারণ করে। আধুনিক ইঞ্জিনে লেক্সিক্যাল এনভায়রনমেন্টই বেশি ব্যবহৃত হয়।
উত্তর
Proxy অবজেক্টে 'Trap' হলো বিশেষ মেথড (যেমন: get, set, deleteProperty) যা দিয়ে অবজেক্টের ইন্টারনাল অপারেশনগুলোকে হাইজ্যাক করা হয়। এটি ডেভেলপারকে অবজেক্টের বিহেভিয়ার কন্ট্রোল করার ক্ষমতা দেয়।
উত্তর
Monkey Patching হলো রানটাইমে কোনো বিল্ট-ইন অবজেক্ট বা প্রোটোটাইপের (যেমন: `Array.prototype`) ডিফল্ট বিহেভিয়ার পরিবর্তন করা। এটি অনুচিত কারণ এটি থার্ড পার্টি লাইব্রেরির সাথে কনফ্লিক্ট তৈরি করে এবং কোডকে প্রেডিক্টেবল রাখে না।
উত্তর
ব্রাউজারে এনক্রিপশন, ডিক্রিপশন, ডিজিটাল সিগনেচার এবং হ্যাশিং এর মতো অত্যন্ত সিকিউর কাজগুলো করার জন্য এই নেটিভ API ব্যবহার করা হয়। এটি স্ট্যান্ডার্ড জাভাস্ক্রিপ্ট ম্যাথ ফাংশনের চেয়ে অনেক বেশি সুরক্ষিত।
উত্তর
Decorator হলো একটি ফাংশন যা অন্য একটি ক্লাস বা মেথডকে র্যাপ করে তার বিহেভিয়ার পরিবর্তন বা এনহ্যান্স করতে ব্যবহৃত হয়। এটি মূলত সিনট্যাকটিক্যাল সুগার হিসেবে কোডকে আরও ক্লিনার করতে সাহায্য করে।
উত্তর
Promise.all() যদি একটি প্রমিজও ফেইল করে তবে পুরোটা রিজেক্ট হয়ে যায়। কিন্তু Promise.allSettled() সব প্রমিজ শেষ হওয়া পর্যন্ত অপেক্ষা করে এবং প্রতিটির আলাদা স্ট্যাটাস (fulfilled বা rejected) প্রদান করে।
উত্তর
Service Worker হলো একটি স্ক্রিপ্ট যা ব্রাউজারের ব্যাকগ্রাউন্ডে রান হয়। এটি নেটওয়ার্ক রিকোয়েস্ট ইন্টারসেপ্ট করতে পারে, পুশ নোটিফিকেশন পাঠাতে পারে এবং অফলাইন সাপোর্ট বা ক্যাশিং এর জন্য এটি অত্যন্ত গুরুত্বপূর্ণ।
উত্তর
কোড রান করার সময় ইঞ্জিন অবজার্ভ করে কোন ফাংশনগুলো বারবার কল হচ্ছে এবং কোন টাইপের ডাটা পাস হচ্ছে। এই ডেটা কালেকশনকেই প্রোফাইলিং বলে, যা পরে কোড অপ্টিমাইজ করতে ব্যবহৃত হয়।
উত্তর
Mixin হলো একটি অবজেক্ট বা ক্লাস যা অন্য ক্লাসকে ইনহেরিটেন্স ছাড়াই ফাংশনালিটি প্রদান করে। এটি মূলত কোড রিইউজ করার একটি কার্যকর পদ্ধতি যেখানে একাধিক সোর্স থেকে মেথড কপি করা হয়।
উত্তর
Object.entries() একটি অবজেক্টকে [key, value] পেয়ারের অ্যারেতে রূপান্তর করে। আর Object.fromEntries() সেই অ্যারে থেকে পুনরায় অবজেক্ট তৈরি করে।
উত্তর
যদি মাইক্রোটাস্ক কিউতে (Microtask Queue) বারবার নতুন টাস্ক যোগ হতে থাকে, তবে ইঞ্জিন কখনোই ম্যাক্রোটাস্ক কিউতে পৌঁছাতে পারে না। এর ফলে UI রেন্ডারিং বা অন্যান্য ইভেন্ট আটকে যায়, একেই মাইক্রোটাস্ক স্টারভেশন বলে।
উত্তর
Function.length নির্দেশ করে ফাংশনটি কতগুলো ফরমাল প্যারামিটার আশা করে। অন্যদিকে Arguments.length নির্দেশ করে ফাংশনটি কল করার সময় বাস্তবে কতগুলো আর্গুমেন্ট পাস করা হয়েছে।
উত্তর
Cohesion মানে হলো একটি মডিউল বা ফাংশন কতটা ফোকাসড (High cohesion ভালো)। Coupling মানে হলো একটি মডিউল অন্যটির ওপর কতটা নির্ভরশীল (Low coupling ভালো)। ক্লিনার কোডের জন্য High Cohesion এবং Low Coupling বজায় রাখা উচিত।
উত্তর
flat() নেস্টেড অ্যারের লেভেল কমিয়ে একটি সিঙ্গেল অ্যারেতে নিয়ে আসে। flatMap() প্রথমে একটি ম্যাপ অপারেশন চালায় এবং তারপর রেজাল্টকে অটোমেটিক ফ্ল্যাট করে দেয়।
উত্তর
ক্লাসের প্রপার্টির আগে `#` চিহ্ন দিলে সেটি পুরোপুরি প্রাইভেট হয়ে যায়, যা ক্লাসের বাইরে থেকে অ্যাক্সেস বা মডিফাই করা অসম্ভব। এটি এনক্যাপসুলেশনকে আরও শক্তিশালী করে।
উত্তর
যখন কোনো অবজেক্ট মেমোরি থেকে ডিলিট হয়ে যায় কিন্তু কোডের কোনো ভেরিয়েবল এখনও সেই মেমোরি অ্যাড্রেসকে পয়েন্ট করে থাকে, তাকে Dangling Reference বলে। জাভাস্ক্রিপ্টে গারবেজ কালেক্টর সাধারণত এটি হ্যান্ডেল করে মেমোরি সেফটি নিশ্চিত করে।
উত্তর
Intl হলো ইন্টারন্যাশনালাইজেশন API। এটি ল্যাঙ্গুয়েজ অনুযায়ী কারেন্সি ফরম্যাটিং, ডেট-টাইম ফরম্যাটিং এবং স্ট্রিং কম্প্যারিজন করার জন্য ব্যবহৃত হয়।
উত্তর
যদি configurable এর মান false হয়, তবে সেই প্রপার্টিটি পরবর্তীতে ডিলিট করা যায় না এবং এর অ্যাট্রিবিউটগুলোও (যেমন: writable) পরিবর্তন করা যায় না।
উত্তর
WeakRef দিয়ে কোনো অবজেক্টকে এমনভাবে রেফার করা যায় যাতে সেটি গারবেজ কালেকশন হতে বাধা না দেয়। FinalizationRegistry ব্যবহার করা হয় কোনো অবজেক্ট মেমোরি থেকে মুছে যাওয়ার সময় একটি ক্লিনআপ কলব্যাক রান করার জন্য।
উত্তর
Pipe হলো ফাংশনাল প্রোগ্রামিংয়ের একটি কনসেপ্ট যেখানে অনেকগুলো ফাংশনকে এমনভাবে সাজানো হয় যাতে প্রথমটির আউটপুট দ্বিতীয়টির ইনপুট হয় এবং এভাবে চলতে থাকে। এটি কোডকে বাম থেকে ডানে (Left-to-right) পড়তে সাহায্য করে।
উত্তর
জাভাস্ক্রিপ্টের নতুন ফিচার আসার আগে কয়েকটি স্টেজ পার হয় (Stage 0: Proposal, Stage 1: Proposal accepted, Stage 2: Draft, Stage 3: Candidate, Stage 4: Finished)। স্টেজ ৪-এ পৌঁছালে সেটি স্ট্যান্ডার্ড হিসেবে গণ্য হয়।
উত্তর
ব্রাউজারের ইভেন্ট লুপ মূলত UI রেন্ডারিং এবং মাইক্রোটাস্ককে বেশি গুরুত্ব দেয়। অন্যদিকে Node.js-এর ইভেন্ট লুপে 'Phases' (যেমন: Timers, I/O callbacks, Poll, Check) থাকে এবং এটি `process.nextTick` এর মতো শক্তিশালী ফিচার প্রদান করে।