📜 JavaScript পরিচিতি ও বেসিক ধারণা — সম্পূর্ণ নোট
এই সেকশনে JavaScript-এর ইতিহাস, সংস্করণ, কীভাবে চালাতে হয় এবং প্রথম কোড লেখার সবকিছু বাংলায় বিস্তারিত আলোচনা করা হয়েছে।
🔷 What is JavaScript? — JavaScript কী?
JavaScript হলো একটি প্রোগ্রামিং ভাষা যা ওয়েবপেজকে ইন্টারেক্টিভ ও জীবন্ত করে তোলে। বাটনে ক্লিক করলে কিছু হওয়া, ফর্ম যাচাই করা, ছবি স্লাইড করা, পপআপ দেখানো — এসব কাজ JavaScript করে।
JavaScript একটি Interpreted ভাষা — অর্থাৎ কোড আগে compile করতে হয় না, ব্রাউজার সরাসরি পড়ে চালিয়ে দেয়। এটি Lightweight এবং Object-Oriented বৈশিষ্ট্যসম্পন্ন।
HTML → "এখানে একটা বাটন আছে।" (কাঠামো)
CSS → "বাটনটা নীল রঙের।" (সাজসজ্জা)
JS → "বাটনে ক্লিক করলে মেসেজ দেখাবে।" (কার্যকলাপ)
JavaScript দিয়ে যা করা যায়:
| কাজের ধরন | উদাহরণ |
|---|---|
| ওয়েবপেজ ইন্টারেক্টিভ করা | বাটন ক্লিক, ফর্ম যাচাই, মেনু খোলা |
| ডায়নামিক কন্টেন্ট | নতুন ডেটা লোড করা, পেজ reload ছাড়াই পরিবর্তন |
| Animation ও Effects | স্লাইডশো, পপআপ, স্ক্রল অ্যানিমেশন |
| Server-side প্রোগ্রামিং | Node.js দিয়ে backend তৈরি |
| Mobile App | React Native দিয়ে Android/iOS অ্যাপ |
| Game Development | ব্রাউজার গেম তৈরি |
🔷 History of JavaScript — JavaScript-এর ইতিহাস
JavaScript-এর জন্ম একটি মজার গল্প। মাত্র ১০ দিনে তৈরি হওয়া এই ভাষাটি আজ বিশ্বের সবচেয়ে জনপ্রিয় প্রোগ্রামিং ভাষাগুলোর একটি।
সময়রেখা Timeline
| সাল | ঘটনা |
|---|---|
| ১৯৯৫ | Brendan Eich Netscape কোম্পানিতে মাত্র ১০ দিনে JavaScript তৈরি করেন। প্রথম নাম ছিল Mocha। |
| ১৯৯৫ | Mocha → LiveScript নামে release হয়। |
| ১৯৯৫ | LiveScript → JavaScript নামকরণ হয় (Java-এর জনপ্রিয়তাকে কাজে লাগাতে)। |
| ১৯৯৬ | Microsoft নিজেদের ব্রাউজারের জন্য JScript তৈরি করে। |
| ১৯৯৭ | ECMAScript (ES1) — JavaScript-এর প্রথম আন্তর্জাতিক মান প্রতিষ্ঠিত হয়। |
| ২০০৯ | Node.js তৈরি হয় — JavaScript এখন সার্ভারেও চলতে পারে। |
| ২০১৫ | ES6 (ES2015) — সবচেয়ে বড় আপডেট। let, const, Arrow
Function ইত্যাদি যোগ হয়। |
| ২০২৩+ | প্রতি বছর নতুন ফিচার যোগ হচ্ছে। JavaScript এখন বিশ্বের #১ জনপ্রিয় ভাষা। |
🔷 JavaScript Versions — JavaScript-এর সংস্করণ
JavaScript-এর official নাম হলো ECMAScript। ECMA International নামের সংস্থা এই ভাষার মান নির্ধারণ করে। প্রতিটি নতুন সংস্করণকে ES + সংখ্যা দিয়ে চেনা যায়।
| সংস্করণ | সাল | গুরুত্বপূর্ণ সংযোজন | গুরুত্ব |
|---|---|---|---|
| ES1 | ১৯৯৭ | প্রথম মান — মৌলিক ভাষা কাঠামো | ঐতিহাসিক |
| ES3 | ১৯৯৯ | Regular Expression, try/catch | গুরুত্বপূর্ণ |
| ES5 | ২০০৯ | strict mode, JSON সাপোর্ট, Array methods |
⭐ শিখতে হবে |
| ES6 / ES2015 | ২০১৫ | let, const, Arrow Function, Class, Template Literal, Promise |
⭐⭐ সবচেয়ে গুরুত্বপূর্ণ |
| ES7 / ES2016 | ২০১৬ | async/await, Exponentiation (**) |
⭐ দরকারি |
| ES8 / ES2017 | ২০১৭ | Object.entries(), String padding | দরকারি |
| ES2020+ | ২০২০~ | Optional Chaining (?.), Nullish Coalescing (??) |
আধুনিক JS |
🔷 How to Run JavaScript — JavaScript কীভাবে চালাবে?
JavaScript চালানোর বেশ কয়েকটি উপায় আছে। শুরুতে সবচেয়ে সহজ পদ্ধতিগুলো জানো:
পদ্ধতি ১ — Browser Console সবচেয়ে সহজ
যেকোনো ব্রাউজারে (Chrome/Firefox) F12 চাপো → Console ট্যাবে ক্লিক করো → সরাসরি JavaScript লিখে Enter চাপো — কোড চলে যাবে।
পদ্ধতি ২ — HTML ফাইলে লিখে Browser-এ খোলো শেখার জন্য ভালো
Notepad বা যেকোনো text editor-এ একটি .html ফাইল তৈরি করো,
ভেতরে <script> ট্যাগে JS লিখো, তারপর ফাইলটি ব্রাউজারে খোলো।
পদ্ধতি ৩ — VS Code + Browser (Live Server) পেশাদার পদ্ধতি
VS Code ডাউনলোড করো → Live Server extension ইনস্টল করো → HTML ফাইলে right-click করে "Open with Live Server" ক্লিক করো। কোড পরিবর্তন করলে ব্রাউজার স্বয়ংক্রিয়ভাবে আপডেট হবে।
পদ্ধতি ৪ — Node.js (Terminal-এ) Advanced
Node.js ইনস্টল করলে ব্রাউজার ছাড়াই Terminal-এ JavaScript চালানো যায়। এটি একটু advanced — শুরুতে শুধু জানলেই হবে।
🔷 JavaScript কোথায় কাজ করে?
JavaScript মূলত দুটি পরিবেশে কাজ করে:
| পরিবেশ | কীভাবে চলে? | কী কাজে লাগে? | উদাহরণ |
|---|---|---|---|
| Client-side (Browser) | ব্রাউজারের JavaScript Engine চালায় | UI ইন্টারেক্টিভ করা, DOM পরিবর্তন | Chrome (V8), Firefox (SpiderMonkey) |
| Server-side (Node.js) | Node.js Runtime চালায় | API তৈরি, ডেটাবেজ, ফাইল পরিচালনা | Express.js, Next.js backend |
JavaScript Engine কী? Engine
প্রতিটি ব্রাউজারে একটি JavaScript Engine থাকে যা JS কোড পড়ে কম্পিউটারের বোঝার মতো ভাষায় রূপান্তর করে।
| ব্রাউজার | JavaScript Engine |
|---|---|
| Google Chrome | V8 |
| Mozilla Firefox | SpiderMonkey |
| Safari | JavaScriptCore (Nitro) |
| Microsoft Edge | V8 (Chromium-based) |
| Node.js | V8 (Chrome-এর Engine ব্যবহার করে) |
🔷 HTML-এ JavaScript যোগ করার উপায়
JavaScript তিনভাবে HTML-এ লেখা যায়:
১. Inline JavaScript এড়িয়ে চলো
সরাসরি HTML ট্যাগের ভেতরে লেখা হয়। ছোট পরীক্ষায় কাজে লাগলেও বড় প্রজেক্টে এটি এড়িয়ে চলা উচিত।
২. Internal JavaScript শেখার জন্য ভালো
HTML ফাইলের ভেতরে <script> ট্যাগে লেখা হয়।
শেখার সময় এটাই বেশি ব্যবহার করা হয়।
৩. External JavaScript সবচেয়ে ভালো পদ্ধতি
আলাদা .js ফাইলে কোড লিখে HTML-এ src দিয়ে লিঙ্ক করা হয়।
এটাই সবচেয়ে পেশাদার ও পরিষ্কার পদ্ধতি।
defer ও async — কখন ব্যবহার করবে? Bonus
<head>-এ script রাখলে defer ব্যবহার করো —
এতে HTML পুরো লোড হওয়ার পরে JS চলবে।
<script> ট্যাগ সবসময়
</body> এর ঠিক আগে রাখো — এতে পেজ আগে লোড হয়, তারপর JavaScript চলে।
🔷 প্রথম JavaScript কোড লেখা
JavaScript শুরু করার জন্য এই Output পদ্ধতিগুলো আগে ভালো করে জানো:
১. console.log()
সবচেয়ে বেশি ব্যবহৃত
ব্রাউজারের Console-এ কিছু দেখাতে ব্যবহার করো। F12 চেপে Developer Tools খুলে Console ট্যাবে দেখো।
২. alert()
পপআপ
ব্রাউজারে পপআপ মেসেজ দেখায়। ব্যবহারকারী OK না চাপা পর্যন্ত পেজ থামে।
৩. document.write()
সাবধানে ব্যবহার করো
সরাসরি ওয়েবপেজে লেখা দেখায়। তবে সতর্কতা — পেজ লোডের পরে ব্যবহার করলে পুরো পেজ মুছে যায়।
৪. innerHTML
সবচেয়ে কার্যকর
নির্দিষ্ট HTML element-এর ভেতরে কন্টেন্ট বসাতে বা পরিবর্তন করতে ব্যবহার হয়। বাস্তব প্রজেক্টে এটাই সবচেয়ে বেশি ব্যবহৃত।
Debug করতে →
console.log()ব্যবহারকারীকে জানাতে →
alert()পেজে কন্টেন্ট বসাতে →
innerHTML
🔷 JavaScript-এ Comment
Comment হলো কোডের ভেতরে নোট লেখার উপায়। ব্রাউজার এটা পড়ে না বা চালায় না — শুধু প্রোগ্রামারের জন্য।
১. Single-line Comment — //
একলাইন
২. Multi-line Comment — /* */
বহুলাইন
৩. Comment দিয়ে কোড বন্ধ রাখা Debugging Trick
Debug করার সময় কোনো লাইন সাময়িকভাবে বন্ধ রাখতে Comment ব্যবহার করো।
🔷 দ্রুত রেফারেন্স — JavaScript বেসিক
| বিষয় | কমান্ড / তথ্য | উদাহরণ / নোট |
|---|---|---|
| Console-এ দেখানো | console.log() |
Debug-এর জন্য সবচেয়ে বেশি ব্যবহৃত |
| পপআপ দেখানো | alert() |
ব্যবহারকারীকে জানাতে |
| পেজে কন্টেন্ট বসানো | innerHTML |
বাস্তব কাজে সবচেয়ে বেশি ব্যবহৃত |
| Single-line Comment | // নোট |
একলাইনের ব্যাখ্যা |
| Multi-line Comment | /* নোট */ |
একাধিক লাইনের ব্যাখ্যা |
| External JS যোগ করা | <script src="app.js"></script> |
সবচেয়ে ভালো পদ্ধতি |
| Defer ব্যবহার | <script defer> |
HTML লোডের পরে JS চালায় |
| সবচেয়ে গুরুত্বপূর্ণ সংস্করণ | ES5 ও ES6 | ES6 = ২০১৫, সবচেয়ে বড় আপডেট |
| JavaScript-এর জনক | Brendan Eich | ১৯৯৫ সালে মাত্র ১০ দিনে তৈরি |
| Official নাম | ECMAScript | ECMA International কর্তৃক মান নির্ধারিত |
| Chrome-এর JS Engine | V8 | Node.js-ও V8 ব্যবহার করে |
🧠 নিজেকে যাচাই করো
1. JavaScript কী?
2. JS কোথায় লেখা যায়?
3. console.log() কী করে?
✏️ Task — এখন তুমি করো
Browser console খোলো (F12)। console.log() দিয়ে তোমার নাম, বয়স ও শহর print করো।
Portfolio-এ প্রথম JavaScript যোগ করো — welcome message দেখাও।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
📦 All About JavaScript Variables — সম্পূর্ণ নোট
এই সেকশনে JavaScript Variable কী, কীভাবে তৈরি করতে হয়, Hoisting, Scope সহ সবকিছু বাংলায় বিস্তারিত আলোচনা করা হয়েছে।
🔷 Variable কী?
Variable হলো একটি নামওয়ালা বাক্স বা পাত্র — যেখানে তথ্য রাখা যায়, পড়া যায় এবং প্রয়োজনে পরিবর্তন করা যায়।
বাস্তব উদাহরণ — একটি দোকানের হিসাবের খাতায় যেমন "মোট বিক্রয়", "মজুদ পণ্য", "লাভ" আলাদা ঘরে লেখা থাকে — প্রোগ্রামে সেগুলোই Variable।
Declaration ও Initialization গুরুত্বপূর্ণ পার্থক্য
| পদক্ষেপ | অর্থ | উদাহরণ |
|---|---|---|
| Declaration | Variable-এর নাম তৈরি করা | let score; |
| Initialization | প্রথমবার মান দেওয়া | let score = 0; |
| Assignment | পরে নতুন মান দেওয়া | score = 100; |
🔷 Variable Declarations — Variable তৈরির তিনটি উপায়
JavaScript-এ Variable তৈরি করতে তিনটি keyword ব্যবহার হয়:
১. var
পুরনো পদ্ধতি — এড়িয়ে চলো
ES6 (2015) আসার আগে JavaScript-এ var ছাড়া আর কোনো উপায় ছিল না।
এটি Function-scoped এবং একই নামে বারবার declare করা যায়,
যা অনেক সময় অপ্রত্যাশিত bug তৈরি করে।
let বা const ব্যবহার করো।
২. let
আধুনিক — সবচেয়ে বেশি ব্যবহৃত
ES6-এ আসা let হলো আধুনিক পরিবর্তনযোগ্য Variable।
এটি Block-scoped — { } এর বাইরে দেখা যায় না।
৩. const
স্থায়ী মানের জন্য
স্থায়ী তথ্যের জন্য। একবার মান দিলে আর পরিবর্তন করা যাবে না। Declare করার সময়ই মান দিতে হবে।
const মানে Variable-এর
reference স্থায়ী — তাই Object-এর ভেতরের property বা Array-এর item পরিবর্তন করা যায়,
কিন্তু পুরো নতুন Object বা Array assign করা যায় না।
🔷 var, let, const — পার্থক্য এক নজরে
| বৈশিষ্ট্য | var |
let |
const |
|---|---|---|---|
| Scope (কার্যক্ষেত্র) | Function Scope | Block Scope | Block Scope |
| মান পরিবর্তন (Reassign) | ✅ পারবে | ✅ পারবে | ❌ পারবে না |
| আবার Declare (Redeclare) | ✅ পারবে | ❌ পারবে না | ❌ পারবে না |
| Declare ছাড়াই মান ব্যবহার | ✅ (undefined আসে) | ❌ Error আসে | ❌ Error আসে |
| Hoisting | ✅ (undefined সহ) | ✅ (TDZ — Error) | ✅ (TDZ — Error) |
| Declare-এ মান বাধ্যতামূলক | ❌ না | ❌ না | ✅ হ্যাঁ, বাধ্যতামূলক |
| কখন ব্যবহার করবে? | ❌ এড়িয়ে চলো | ✅ পরিবর্তনযোগ্য মান | ✅ স্থায়ী মান |
→ সবসময় আগে
const চেষ্টা করো।→ মান পরে বদলাতে হবে মনে হলে
let ব্যবহার করো।→
var ভুলে যাও।
🔷 Naming Rules — Variable-এর নাম দেওয়ার নিয়ম
Variable-এর নাম দেওয়ার সময় JavaScript-এর নির্দিষ্ট নিয়ম মানতে হয়:
বাধ্যতামূলক নিয়ম অবশ্যই মানতে হবে
| নিয়ম | সঠিক উদাহরণ ✅ | ভুল উদাহরণ ❌ |
|---|---|---|
অক্ষর, _, বা $ দিয়ে শুরু করতে হবে |
name, _count, $price |
1name, 2age |
| Space ব্যবহার করা যাবে না | firstName, user_name |
first name |
হাইফেন (-) ব্যবহার করা যাবে না |
totalPrice |
total-price |
| Reserved word ব্যবহার করা যাবে না | myLet, constValue |
let, const, if |
| Case-sensitive (বড়-ছোট হাতে পার্থক্য আছে) | age ≠ Age ≠ AGE |
— |
গুরুত্বপূর্ণ Reserved Words নাম হিসেবে ব্যবহার নিষিদ্ধ
Naming Convention — কোন স্টাইলে নাম দেবে? Best Practice
| স্টাইল | উদাহরণ | কখন ব্যবহার? |
|---|---|---|
| camelCase | totalScore, isLoggedIn, getUserName |
✅ সাধারণ Variable ও Function — সবচেয়ে জনপ্রিয় |
| UPPER_CASE | MAX_SIZE, API_URL, TAX_RATE |
Constant — যে মান কখনো বদলাবে না |
| PascalCase | UserProfile, ProductItem |
Class ও Constructor Function-এর জন্য |
| _underscore | _privateData |
Private বোঝাতে (অনানুষ্ঠানিক) |
→ নাম দেখেই বোঝা যাওয়া উচিত কী রাখা আছে।
→
x = 25 — বোঝা যাচ্ছে না।→
studentAge = 25 — স্পষ্ট ও পরিষ্কার। ✅
🔷 Variable-এ কী রাখা যায়? — Data Types
JavaScript একটি Dynamically Typed ভাষা — Variable declare করার সময় ধরন বলতে হয় না, মান দিলে JavaScript নিজেই বুঝে নেয়।
Primitive Data Types মৌলিক ধরন
| ধরন | কী রাখে? | উদাহরণ | typeof |
|---|---|---|---|
| String | লেখা বা টেক্সট | "হ্যালো", 'ঢাকা' |
"string" |
| Number | যেকোনো সংখ্যা | 42, 3.14, -10 |
"number" |
| BigInt | অনেক বড় সংখ্যা | 9007199254740991n |
"bigint" |
| Boolean | সত্য বা মিথ্যা | true, false |
"boolean" |
| null | ইচ্ছাকৃত খালি | null |
"object" ⚠️ |
| undefined | মান দেওয়া হয়নি | undefined |
"undefined" |
| Symbol | অনন্য পরিচয় | Symbol("id") |
"symbol" |
Non-Primitive (Reference) Types জটিল ধরন
| ধরন | কী রাখে? | উদাহরণ |
|---|---|---|
| Object | Key-Value জোড়ায় একাধিক তথ্য | { name: "করিম", age: 22 } |
| Array | তালিকা আকারে একাধিক মান | ["ঢাকা", "চট্টগ্রাম", "সিলেট"] |
| Function | পুনরায় ব্যবহারযোগ্য কোড ব্লক | function greet() { ... } |
null → আমি জেনেশুনে খালি রেখেছি।undefined → মান দেওয়াই হয়নি (JavaScript নিজে বসায়)।
🔷 Hoisting — উপরে তোলা
Hoisting হলো JavaScript-এর একটি বিশেষ আচরণ — কোড চালানোর আগে
JavaScript সব Declaration গুলো সেই Scope-এর একদম উপরে নিয়ে যায়।
তবে var, let ও const ভিন্নভাবে আচরণ করে।
var এর Hoisting
undefined সহ উঠে যায়
let ও const এর Hoisting — Temporal Dead Zone (TDZ)
TDZ
let ও const-ও Hoisting হয়, কিন্তু এরা
Temporal Dead Zone (TDZ)-এ থাকে। Declaration-এর আগে
access করলে ReferenceError আসে।
Function Hoisting পুরো Function উপরে যায়
Function Declaration সম্পূর্ণভাবে উপরে চলে যায় — তাই define করার আগেই call করা যায়।
Hoisting সারসংক্ষেপ এক নজরে
| ধরন | Hoist হয়? | আগে ব্যবহার করলে? |
|---|---|---|
| var | ✅ হ্যাঁ | undefined পাবে |
| let | ✅ হ্যাঁ (TDZ) | ❌ ReferenceError |
| const | ✅ হ্যাঁ (TDZ) | ❌ ReferenceError |
| Function Declaration | ✅ সম্পূর্ণ | ✅ ঠিকঠাক কাজ করবে |
🔷 Variable Scopes — কার্যক্ষেত্র
Scope হলো একটি Variable কোথায় কোথায় দেখা বা ব্যবহার করা যাবে তার সীমানা। JavaScript-এ তিন ধরনের Scope আছে।
১. Global Scope সর্বত্র দেখা যায়
কোনো Function বা Block-এর বাইরে declare করা Variable হলো Global। পুরো প্রোগ্রামের যেকোনো জায়গা থেকে এটি ব্যবহার করা যায়।
২. Function Scope Function-এর ভেতরে সীমাবদ্ধ
Function-এর ভেতরে declare করা Variable শুধু সেই Function-এর ভেতরেই থাকে। বাইরে থেকে access করা যায় না।
৩. Block Scope { } এর ভেতরে সীমাবদ্ধ
{ } দিয়ে ঘেরা যেকোনো অংশই Block।
let ও const Block-scoped —
Block-এর বাইরে এদের দেখা যায় না।
Scope Chain — ভেতর থেকে বাইরে খোঁজা Scope Chain
ভেতরের Scope সবসময় বাইরের Scope-এর Variable খুঁজে পায়। কিন্তু বাইরের Scope ভেতরের Variable দেখতে পায় না।
Scope তুলনা — এক নজরে Summary
| Scope ধরন | কোথায় দেখা যায়? | কোন keyword? |
|---|---|---|
| Global Scope | সর্বত্র — পুরো প্রোগ্রামে | var, let, const |
| Function Scope | শুধু সেই Function-এর ভেতরে | var, let, const |
| Block Scope | শুধু সেই { }-এর ভেতরে |
let, const (var নয়) |
🔷 দ্রুত রেফারেন্স — JavaScript Variables
| বিষয় | তথ্য / Keyword | উদাহরণ / নোট |
|---|---|---|
| পরিবর্তনযোগ্য Variable | let |
let count = 0; |
| স্থায়ী Variable | const |
const PI = 3.14; |
| পুরনো পদ্ধতি (এড়াও) | var |
Function-scoped, সমস্যাজনক |
| টেক্সট | String | let name = "করিম"; |
| সংখ্যা | Number | let age = 22; |
| সত্য / মিথ্যা | Boolean | let ok = true; |
| ইচ্ছাকৃত খালি | null | let val = null; |
| মান নেই | undefined | let x; → undefined |
| Type জানা | typeof |
typeof "abc" → "string" |
| var Hoisting | undefined সহ উপরে যায় | আগে ব্যবহার করলে undefined পাবে |
| let/const Hoisting | TDZ-এ থাকে | আগে ব্যবহার করলে ReferenceError |
| Global Scope | সর্বত্র দেখা যায় | Function-এর বাইরে declare করা |
| Function Scope | Function-এর ভেতরে সীমাবদ্ধ | বাইরে access করলে Error |
| Block Scope | { }-এর ভেতরে সীমাবদ্ধ |
শুধু let ও const |
| Naming Style | camelCase | totalScore, isLoggedIn |
| Constant Style | UPPER_CASE | MAX_SIZE, API_URL |
🧠 নিজেকে যাচাই করো
1. const ও let-এর পার্থক্য?
2. var কেন এড়ানো উচিত?
3. Template literal কী?
✏️ Task — এখন তুমি করো
const, let দিয়ে portfolio information store করো। Template literal দিয়ে introduce করো।
Portfolio-এ variables দিয়ে তোমার তথ্য রাখো।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
🗂️ JavaScript Data Types — সম্পূর্ণ নোট
এই সেকশনে JavaScript-এর সব Data Type, Prototype, Prototypal Inheritance, Built-in Objects সহ প্রতিটি বিষয় বাংলায় উদাহরণসহ বিস্তারিত আলোচনা করা হয়েছে।
🔷 Data Types কী ও কেন প্রয়োজন?
Data Type হলো তথ্যের ধরন বা প্রকার — অর্থাৎ একটি Variable-এ কোন ধরনের তথ্য রাখা আছে তা বোঝানোর উপায়।
সহজ উদাহরণ — "ঢাকা" একটি লেখা, 42 একটি সংখ্যা, true
একটি সত্য/মিথ্যা মান। কম্পিউটার এদের আলাদাভাবে মেমোরিতে রাখে এবং
আলাদা নিয়মে কাজ করে।
কেন প্রয়োজন? কারণ
| কারণ | ব্যাখ্যা | উদাহরণ |
|---|---|---|
| মেমোরি সাশ্রয় | ধরন অনুযায়ী সঠিক পরিমাণ মেমোরি ব্যবহার হয় | সংখ্যার জন্য লেখার মতো বেশি জায়গা লাগে না |
| সঠিক অপারেশন | কোন ধরনে কী কাজ করা যাবে তা নির্ধারণ করে | "৫" + ২ = "৫২" বনাম ৫ + ২ = ৭ |
| Error ধরা | ভুল type-এ কাজ করলে সতর্ক করে | লেখার উপর গণিত করলে NaN আসে |
| কোড বোঝা সহজ | কোড পড়লে বোঝা যায় কোথায় কী তথ্য রাখা | let isActive = true — স্পষ্ট |
JavaScript = Dynamically Typed Language বিশেষত্ব
JavaScript হলো Dynamically Typed — Variable declare করার সময় type বলতে হয় না, মান দিলেই JavaScript নিজে বুঝে নেয়।
Data Types-এর দুটি বিভাগ শ্রেণিবিভাগ
| বিভাগ | ধরনগুলো | বৈশিষ্ট্য | কীভাবে সংরক্ষিত? |
|---|---|---|---|
| Primitive | String, Number, Boolean, null, undefined, BigInt, Symbol | একটিমাত্র সরল মান। Immutable (পরিবর্তন হয় না)। | Stack-এ সরাসরি মান রাখে |
| Non-Primitive (Reference) | Object, Array, Function | একাধিক মান ধারণ করে। Mutable (পরিবর্তন করা যায়)। | Heap-এ মান, Stack-এ শুধু address রাখে |
🔷 ১. String — টেক্সট বা লেখা
String হলো যেকোনো লেখা, শব্দ বা বাক্য। কোটেশন মার্কের মধ্যে রাখলে JavaScript সেটাকে String হিসেবে চেনে।
| কোটেশন ধরন | উদাহরণ | বিশেষত্ব |
|---|---|---|
Single Quote ' ' |
let city = 'ঢাকা'; |
সাধারণ ব্যবহার |
Double Quote " " |
let name = "করিম"; |
সাধারণ ব্যবহার |
Backtick ` ` |
let msg = `হ্যালো ${name}`; |
Template Literal — Variable ও expression ঢোকানো যায় |
Escape Characters বিশেষ চিহ্ন
গুরুত্বপূর্ণ String Methods Methods
| Method | কাজ | উদাহরণ |
|---|---|---|
.length |
String-এর দৈর্ঘ্য | "ঢাকা".length → 4 |
.toUpperCase() |
সব বড় হাতে | "hello".toUpperCase() → "HELLO" |
.toLowerCase() |
সব ছোট হাতে | "HELLO".toLowerCase() → "hello" |
.trim() |
দুপাশের Space সরায় | " হ্যালো ".trim() → "হ্যালো" |
.includes(str) |
String আছে কিনা | "বাংলাদেশ".includes("বাংলা") → true |
.indexOf(str) |
কোন position-এ আছে | "hello".indexOf("l") → 2 |
.slice(start, end) |
অংশ বের করা | "বাংলাদেশ".slice(0, 5) → "বাংলা" |
.replace(old, new) |
অংশ বদলানো | "হ্যালো".replace("হ্যালো", "নমস্কার") |
.split(sep) |
Array-এ ভাগ করা | "ক,খ,গ".split(",") → ["ক","খ","গ"] |
.startsWith(str) |
দিয়ে শুরু? | "বাংলা".startsWith("বাং") → true |
.endsWith(str) |
দিয়ে শেষ? | "বাংলা".endsWith("লা") → true |
.repeat(n) |
n বার পুনরাবৃত্তি | "হা".repeat(3) → "হাহাহা" |
.padStart(n, char) |
বাম দিকে পূরণ | "5".padStart(3, "0") → "005" |
[index] |
নির্দিষ্ট অক্ষর | "hello"[1] → "e" |
let clean = " হ্যালো ".trim(); — এভাবে result রাখো।
🔷 ২. Number — সংখ্যা
JavaScript-এ Number দিয়ে পূর্ণ সংখ্যা, দশমিক সংখ্যা এবং ঋণাত্মক সংখ্যা সব একই type-এ রাখা হয়।
বিশেষ Number মান Special Values
| মান | অর্থ | কখন আসে? | উদাহরণ |
|---|---|---|---|
| NaN | Not a Number — বৈধ সংখ্যা নয় | ভুল গণনায় | "abc" * 2 → NaN |
| Infinity | ধনাত্মক অনন্ত | শূন্য দিয়ে ভাগ | 1 / 0 → Infinity |
| -Infinity | ঋণাত্মক অনন্ত | ঋণাত্মক শূন্য দিয়ে ভাগ | -1 / 0 → -Infinity |
| MAX_SAFE_INTEGER | নিরাপদ সর্বোচ্চ পূর্ণ সংখ্যা | 9007199254740991 পর্যন্ত | Number.MAX_SAFE_INTEGER |
NaN === NaN সবসময় false দেয়!
NaN চেক করতে সবসময় Number.isNaN() বা isNaN() ব্যবহার করো।
গুরুত্বপূর্ণ Number Methods ও Functions Methods
| Method / Function | কাজ | উদাহরণ |
|---|---|---|
.toFixed(n) |
n দশমিক ঘর রেখে String ফেরত | (3.14159).toFixed(2) → "3.14" |
Number(val) |
অন্য type-কে Number-এ রূপান্তর | Number("42") → 42 |
parseInt(str) |
String থেকে পূর্ণ সংখ্যা | parseInt("42.9px") → 42 |
parseFloat(str) |
String থেকে দশমিক সংখ্যা | parseFloat("3.14abc") → 3.14 |
Number.isNaN(val) |
NaN কিনা নির্ভরযোগ্যভাবে চেক | Number.isNaN(NaN) → true |
Number.isFinite(val) |
সীমিত সংখ্যা কিনা | Number.isFinite(Infinity) → false |
Number.isInteger(val) |
পূর্ণ সংখ্যা কিনা | Number.isInteger(4.5) → false |
🔷 ৩. Boolean — সত্য বা মিথ্যা
Boolean-এ শুধু দুটো মান থাকে — true (সত্য) বা
false (মিথ্যা)। শর্ত পরীক্ষায় এটি সবচেয়ে বেশি ব্যবহৃত।
Truthy ও Falsy — অত্যন্ত গুরুত্বপূর্ণ! ⭐ মুখস্থ করো
JavaScript-এ if() শর্তে Boolean ছাড়া অন্য মানও ব্যবহার করা যায়।
কিছু মান false-এর মতো আচরণ করে — এদের Falsy বলে।
বাকি সব মানকে Truthy বলে।
| Falsy মান | উদাহরণ | if()-তে ফলাফল |
|---|---|---|
false |
if (false) |
❌ ঢোকে না |
0 |
if (0) |
❌ ঢোকে না |
"" (খালি string) |
if ("") |
❌ ঢোকে না |
null |
if (null) |
❌ ঢোকে না |
undefined |
if (undefined) |
❌ ঢোকে না |
NaN |
if (NaN) |
❌ ঢোকে না |
false, 0, "", null,
undefined, NaN — মাত্র এই ৬টি।
বাকি সব Truthy — এমনকি "false" (string), [],
{} সবই Truthy।
🔷 ৪. undefined — সংজ্ঞায়িত হয়নি
undefined মানে Variable তৈরি হয়েছে কিন্তু এখনো কোনো মান দেওয়া হয়নি। JavaScript নিজেই এই মান বসিয়ে দেয় — আমরা সাধারণত নিজে দিই না।
কোথায় কোথায় undefined আসে? কারণ
undefined নিজে assign করো না।
Variable খালি রাখতে চাইলে null ব্যবহার করো।let value = null; ← এভাবে করো, let value = undefined; নয়।
🔷 ৫. null — ইচ্ছাকৃত শূন্যতা
null মানে ইচ্ছাকৃতভাবে কিছু নেই — আমরা নিজে দিই বোঝাতে যে "এখানে এখনো কোনো মান নির্ধারণ করা হয়নি।"
null vs undefined — পার্থক্য তুলনা
| বিষয় | null |
undefined |
|---|---|---|
| কে দেয়? | প্রোগ্রামার নিজে | JavaScript নিজে |
| অর্থ | ইচ্ছাকৃত "কিছু নেই" | মান দেওয়া হয়নি |
| typeof | "object" ⚠️ (bug) |
"undefined" |
| Loose equality | null == undefined → true |
null == undefined → true |
| Strict equality | null === undefined → false |
null === undefined → false |
🔷 ৬. BigInt — বিশাল সংখ্যা
JavaScript-এর সাধারণ Number type নিরাপদে সর্বোচ্চ
9,007,199,254,740,991 (2⁵³ - 1) পর্যন্ত পূর্ণ সংখ্যা
রাখতে পারে। এর বেশি বড় সংখ্যার জন্য BigInt ব্যবহার হয়।
→ BigInt ও Number একসাথে গণনা করা যায় না — আগে convert করতে হবে।
→
BigInt + Number → TypeError→ দশমিক সংখ্যা (float) BigInt-এ রাখা যায় না।
→ সাধারণ প্রোগ্রামিংয়ে BigInt বিরল — বিশেষ ক্ষেত্রে (ব্যাংক, ক্রিপ্টো) দরকার হয়।
🔷 ৭. Symbol — অনন্য পরিচয়
Symbol হলো ES6-এ আসা একটি অনন্য (unique) primitive type। প্রতিবার Symbol তৈরি করলে সেটি সম্পূর্ণ নতুন ও অনন্য — একই বর্ণনা দিলেও দুটো Symbol কখনো সমান হয় না।
🔷 ৮. Object — জটিল তথ্য পাত্র
Object হলো Key-Value জোড়ায় একাধিক তথ্য একসাথে রাখার পাত্র। JavaScript-এ Object হলো সবচেয়ে শক্তিশালী এবং বহুল ব্যবহৃত data structure।
Object তৈরির উপায় Creation
Property Access — দুটি পদ্ধতি Access
Property যোগ, পরিবর্তন ও মুছে ফেলা CRUD
Nested Object ও Method Advanced
গুরুত্বপূর্ণ Object Methods Built-in
| Method | কাজ | উদাহরণ |
|---|---|---|
Object.keys(obj) |
সব key-এর Array | → ["name", "age"] |
Object.values(obj) |
সব value-এর Array | → ["করিম", 25] |
Object.entries(obj) |
key-value জোড়ার Array | → [["name","করিম"],["age",25]] |
Object.assign(target, src) |
একটি object-এ অন্যটি merge | Object কপি বা একত্র করতে |
Object.freeze(obj) |
Object পরিবর্তন বন্ধ করে | Immutable object তৈরি করতে |
hasOwnProperty(key) |
নিজস্ব property আছে কিনা | obj.hasOwnProperty("name") |
🔷 Prototype — প্রতিটি Object-এর অদৃশ্য অভিভাবক
JavaScript-এ প্রতিটি Object-এর একটি লুকানো সংযোগ থাকে আরেকটি Object-এর সাথে — এটাই সেই Object-এর Prototype। কোনো property খুঁজে না পেলে JavaScript স্বয়ংক্রিয়ভাবে Prototype-এ গিয়ে খোঁজে।
Prototype Chain কীভাবে কাজ করে? Chain
Prototype Chain-এর শেষ Root
Array ও Function-ও Object সব Object
🔷 Prototypal Inheritance — উত্তরাধিকার
Prototypal Inheritance মানে একটি Object আরেকটি Object-এর properties ও methods উত্তরাধিকার সূত্রে পেতে পারে — কোড পুনরায় লিখতে হয় না।
পদ্ধতি ১ — Object.create()
সরাসরি
পদ্ধতি ২ — Constructor Function + .prototype
Classical
পদ্ধতি ৩ — ES6 class (Syntactic Sugar)
আধুনিক পদ্ধতি
ES6-এর class হলো Constructor Function ও Prototype-এর সুন্দর লেখার পদ্ধতি —
পেছনে একই Prototype-ভিত্তিক কাজ হয়।
class আসলে Prototype-ভিত্তিক Inheritance-এরই
সুন্দর রূপ — JavaScript-এ Class-based Inheritance নেই।
🔷 typeof Operator — Data Type জানার উপায়
typeof operator যেকোনো মান বা Variable-এর Data Type কী তা
String হিসেবে ফেরত দেয়।
typeof সম্পূর্ণ ফলাফল টেবিল Reference
| মান | typeof ফলাফল | নোট |
|---|---|---|
"লেখা" |
"string" |
— |
42, 3.14, NaN, Infinity |
"number" |
NaN ও Infinity-ও Number! |
true, false |
"boolean" |
— |
undefined |
"undefined" |
— |
null |
"object" |
⚠️ ঐতিহাসিক bug! |
{}, new Date() |
"object" |
— |
[] |
"object" |
⚠️ Array-ও "object"! |
function(){} |
"function" |
Function একটি object, কিন্তু typeof "function" দেয় |
Symbol() |
"symbol" |
— |
42n |
"bigint" |
— |
Array ও null সঠিকভাবে চেক করা সঠিক পদ্ধতি
🔷 Built-in Objects — JavaScript-এর তৈরি বস্তু
JavaScript নিজেই কিছু Object তৈরি করে দিয়ে রেখেছে যা ব্যবহারের জন্য import করতে হয় না — সরাসরি ব্যবহার করা যায়।
১. Math Object — গণিতের হাতিয়ার Math
| Property / Method | কাজ | উদাহরণ |
|---|---|---|
Math.PI |
π এর মান | → 3.141592653589793 |
Math.round(n) |
নিকটতম পূর্ণ সংখ্যায় | Math.round(4.6) → 5 |
Math.floor(n) |
নিচের পূর্ণ সংখ্যায় | Math.floor(4.9) → 4 |
Math.ceil(n) |
উপরের পূর্ণ সংখ্যায় | Math.ceil(4.1) → 5 |
Math.abs(n) |
পরম মান (সর্বদা ধনাত্মক) | Math.abs(-7) → 7 |
Math.max(...n) |
সর্বোচ্চ মান | Math.max(3,9,1) → 9 |
Math.min(...n) |
সর্বনিম্ন মান | Math.min(3,9,1) → 1 |
Math.pow(base, exp) |
ঘাত (power) | Math.pow(2,10) → 1024 |
Math.sqrt(n) |
বর্গমূল | Math.sqrt(25) → 5 |
Math.random() |
0 থেকে 1-এর মধ্যে random | Math.random() → 0.472... |
২. Date Object — তারিখ ও সময় Date
৩. Array — তালিকা Array
| Method | কাজ | উদাহরণ |
|---|---|---|
.push(item) |
শেষে যোগ | [1,2].push(3) → [1,2,3] |
.pop() |
শেষেরটা সরায় | [1,2,3].pop() → [1,2] |
.unshift(item) |
শুরুতে যোগ | [1,2].unshift(0) → [0,1,2] |
.shift() |
শুরুরটা সরায় | [1,2,3].shift() → [2,3] |
.map(fn) |
প্রতিটিতে function চালায় | [1,2].map(x => x*2) → [2,4] |
.filter(fn) |
শর্তপূরণকারী রাখে | [1,2,3].filter(x => x>1) → [2,3] |
.find(fn) |
প্রথম মিল খোঁজে | [1,2,3].find(x => x>1) → 2 |
.includes(item) |
আছে কিনা | [1,2,3].includes(2) → true |
.join(sep) |
String-এ পরিণত | ["ক","খ"].join("-") → "ক-খ" |
.sort() |
সাজানো | [3,1,2].sort() → [1,2,3] |
.slice(s, e) |
অংশ বের করা | [1,2,3,4].slice(1,3) → [2,3] |
.forEach(fn) |
প্রতিটিতে function চালায় | কোনো নতুন array ফেরত দেয় না |
৪. JSON Object — তথ্য আদান-প্রদান JSON
JSON (JavaScript Object Notation) হলো ডেটা আদান-প্রদানের সবচেয়ে জনপ্রিয় format। API থেকে ডেটা সাধারণত JSON-এ আসে।
🔷 Type Coercion — স্বয়ংক্রিয় Type রূপান্তর
Type Coercion মানে JavaScript স্বয়ংক্রিয়ভাবে এক type-এর মানকে অন্য type-এ রূপান্তর করে — এটি অনেক সময় বিভ্রান্তিকর ফলাফল দেয়।
Implicit Coercion — JS নিজে করে সাবধান!
==) type ignore করে
তুলনা করে, অনেক বিভ্রান্তিকর ফলাফল দেয়।
সবসময় === (strict equality) ব্যবহার করো।
Explicit Conversion — আমরা নিজে করি নিরাপদ
| রূপান্তর | পদ্ধতি | উদাহরণ |
|---|---|---|
| যেকোনো → Number | Number(), parseInt(), parseFloat() |
Number("42") → 42 |
| যেকোনো → String | String(), .toString() |
String(100) → "100" |
| যেকোনো → Boolean | Boolean() |
Boolean(0) → false |
🔷 দ্রুত রেফারেন্স — JavaScript Data Types
| Data Type | typeof ফলাফল | উদাহরণ মান | বিশেষ নোট |
|---|---|---|---|
| String | "string" |
"হ্যালো", 'ঢাকা' |
Immutable। Template literal-এ ${} ব্যবহার করো। |
| Number | "number" |
42, 3.14, NaN |
NaN ও Infinity-ও Number। ===-এ NaN চেক হয় না। |
| Boolean | "boolean" |
true, false |
Falsy: false, 0, "", null, undefined, NaN |
| undefined | "undefined" |
undefined |
JS নিজে দেয়। নিজে দিও না। |
| null | "object" ⚠️ |
null |
ইচ্ছাকৃত শূন্যতা। চেক করতে === null ব্যবহার করো। |
| BigInt | "bigint" |
42n |
সংখ্যার শেষে n। Number-এর সাথে mix করা যায় না। |
| Symbol | "symbol" |
Symbol("id") |
সর্বদা unique। Object-এর private key হিসেবে ব্যবহার। |
| Object | "object" |
{ key: value } |
Reference type। Copy করলে একই object point করে। |
| Array | "object" ⚠️ |
[1, 2, 3] |
Array চেক করতে Array.isArray() ব্যবহার করো। |
| Function | "function" |
function(){} |
Function-ও আসলে Object। |
গুরুত্বপূর্ণ বিষয় একনজরে Summary
| বিষয় | সঠিক পদ্ধতি |
|---|---|
| Array চেক | Array.isArray(arr) |
| null চেক | val === null |
| NaN চেক | Number.isNaN(val) |
| Strict তুলনা | === ব্যবহার করো, == নয় |
| Object copy | { ...obj } বা Object.assign({}, obj) |
| Prototype-ভিত্তিক Inheritance | class + extends ব্যবহার করো |
| Type রূপান্তর | Number(), String(), Boolean() ব্যবহার করো |
| Object ↔ JSON | JSON.stringify() / JSON.parse() |
🧠 নিজেকে যাচাই করো
1. typeof null?
2. JavaScript-এ কতটি primitive type?
3. Array কোন type?
✏️ Task — এখন তুমি করো
typeof operator দিয়ে বিভিন্ন value-এর type check করো। console-এ দেখো।
বিভিন্ন data type দিয়ে portfolio information store করো।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
🔄 JavaScript Type Casting — সম্পূর্ণ নোট
এই সেকশনে JavaScript-এ Type Casting কী, Implicit ও Explicit Casting-এর পার্থক্য, String/Number/Boolean রূপান্তর এবং সাধারণ ভুলগুলো বাংলায় বিস্তারিত আলোচনা করা হয়েছে।
🔷 Type Casting কী ও কেন প্রয়োজন?
Type Casting (বা Type Conversion) মানে এক Data Type-এর মানকে
অন্য Data Type-এ রূপান্তর করা। যেমন "42" (String) কে
42 (Number)-এ রূপান্তর।
সহজ উদাহরণ — ব্যবহারকারী ফর্মে বয়স লিখলে সেটা সবসময় String হিসেবে আসে। কিন্তু গণনা করতে হলে সেটাকে Number-এ রূপান্তর করতে হয়।
কখন Type Casting দরকার হয়? Use Cases
| পরিস্থিতি | সমস্যা | সমাধান |
|---|---|---|
| HTML Form Input | ইনপুট সবসময় String হিসেবে আসে | Number() দিয়ে রূপান্তর |
| API Response | JSON-এ সংখ্যা String হতে পারে | parseInt() / parseFloat() |
| Display করা | Number-কে পেজে দেখাতে String লাগে | String() বা .toString() |
| Condition চেক | কোনো মান আছে কিনা নিশ্চিত করা | Boolean() বা !! |
| URL Parameter | URL-এ সব মান String | parseInt() দিয়ে রূপান্তর |
দুই ধরনের Type Casting প্রকারভেদ
| ধরন | কে করে? | উদাহরণ | নিরাপদ? |
|---|---|---|---|
| Implicit Casting (Type Coercion) |
JavaScript নিজে স্বয়ংক্রিয়ভাবে | "5" + 3 → "53" |
⚠️ বিপজ্জনক |
| Explicit Casting (Type Conversion) |
প্রোগ্রামার নিজে জেনেশুনে করে | Number("5") + 3 → 8 |
✅ নিরাপদ |
🔷 Type Conversion VS Type Coercion — বিস্তারিত পরিচয়
Type Conversion এবং Type Coercion — দুটো শব্দ একই কাজ (type পরিবর্তন) বোঝায়, কিন্তু কে করছে তাতে পার্থক্য। JavaScript- এ এই দুটো ভিন্ন অর্থে ব্যবহার হয়।
মূল পার্থক্য Definition
| বিষয় | Type Conversion (Explicit) | Type Coercion (Implicit) |
|---|---|---|
| কে করে? | প্রোগ্রামার নিজে | JavaScript Engine নিজে |
| কীভাবে? | Explicit function/method ডেকে | Operator বা Context দেখে স্বয়ংক্রিয়ভাবে |
| নিয়ন্ত্রণ | ✅ সম্পূর্ণ নিয়ন্ত্রণে | ⚠️ JavaScript নিজেই সিদ্ধান্ত নেয় |
| নির্ভরযোগ্যতা | ✅ পূর্বানুমানযোগ্য ফলাফল | ⚠️ অপ্রত্যাশিত ফলাফল হতে পারে |
| উদাহরণ | Number("5") |
"5" - 0 |
| ব্যবহার করা উচিত? | ✅ সবসময় পছন্দনীয় | ❌ সাধারণত এড়িয়ে চলো |
একই কাজ — দুই পদ্ধতিতে তুলনা
JavaScript কোথায় কোথায় Coercion করে? Coercion ঘটার জায়গা
| কোথায়? | কীভাবে Coercion হয়? | উদাহরণ |
|---|---|---|
| + Operator | যেকোনো একটি String হলে সব String-এ | 1 + "2" → "12" |
| - * / % Operator | String থাকলে Number-এ রূপান্তর | "6" / "2" → 3 |
| == Comparison | ভিন্ন type হলে Coercion করে তুলনা | 0 == false → true |
| if() / while() | যেকোনো মান → Boolean-এ | if("") → false |
| Template Literal | সব মান → String-এ | `${42}` → "42" |
| Logical Operator | || &&-এ Truthy/Falsy চেক |
"" || "default" → "default" |
JavaScript-এর বিখ্যাত অদ্ভুত Coercion 🤯 অবাক করা
[] == false বা [] == ![] — এগুলো বাস্তব কোডে
ধরা কঠিন bug তৈরি করে।
সংক্ষিপ্ত সারাংশ Summary
| লক্ষ্য | Coercion (এড়িয়ে চলো) ⚠️ | Conversion (ব্যবহার করো) ✅ |
|---|---|---|
| → Number | "5" - 0 বা +"5" |
Number("5") বা parseInt("5", 10) |
| → String | 5 + "" |
String(5) বা (5).toString() |
| → Boolean | !!val (অনেকে ব্যবহার করেন) |
Boolean(val) |
| তুলনা | == (Loose) |
=== (Strict) |
→ Type Coercion = JavaScript চুপচাপ নিজেই করে — অনেক সময় ভুল ফলাফল।
→ Type Conversion = তুমি নিজে জেনেশুনে করো — নিরাপদ ও পূর্বানুমানযোগ্য।
→ পেশাদার কোডে সবসময় Explicit Conversion ব্যবহার করো।
🔷 Type Coercion — বিস্তারিত (Implicit)
Type Coercion হলো JavaScript-এর এমন একটি আচরণ যেখানে কোনো operator বা expression-এ ভিন্ন type-এর মান ব্যবহার হলে JavaScript Engine নিজেই একটিকে রূপান্তর করে নেয় — প্রোগ্রামার না জানলেও।
১. String Coercion — কখন ও কীভাবে? String Context
নিচের পরিস্থিতিতে JavaScript মানকে String-এ Coerce করে:
| পরিস্থিতি | উদাহরণ | কী হয়? |
|---|---|---|
+ operator-এ একটি String |
"বয়স: " + 22 |
22 → "22", ফলে "বয়স: 22" |
Template Literal ${} |
`মান: ${true}` |
true → "true" |
String() function (Explicit) |
String(null) |
null → "null" |
২. Number Coercion — কখন ও কীভাবে? Number Context
নিচের পরিস্থিতিতে JavaScript মানকে Number-এ Coerce করে:
| Operator / Context | উদাহরণ | Coercion নিয়ম |
|---|---|---|
Arithmetic - * / % ** |
"10" * 2 |
"10" → 10, ফলে 20 |
Unary + ও - |
+"42" |
"42" → 42 |
Comparison < > <= >= |
"5" > 3 |
"5" → 5, ফলে true |
Bitwise | & ^ |
"7" | 0 |
"7" → 7, ফলে 7 |
"10" > "9" → false কারণ উভয়ই String হলে
character-by-character তুলনা হয় — "1" < "9"।
Number-এর সাথে তুলনায় Number Coercion হয়।
৩. Boolean Coercion — কখন ও কীভাবে? Boolean Context
নিচের context-এ JavaScript মানকে Boolean-এ Coerce করে:
let name = userInput || "অতিথি";
→ userInput falsy (খালি বা null) হলে "অতিথি" default হিসেবে ব্যবহার হবে।isLoggedIn && showDashboard();
→ isLoggedIn true হলেই showDashboard() চলবে।
৪. Abstract Equality (==) — Coercion-এর নিয়ম
== এর রহস্য
== (Loose Equality) অপারেটর নির্দিষ্ট নিয়মে Coercion করে
তুলনা করে। নিয়মগুলো জানলে অদ্ভুত ফলাফলগুলো বোঝা যায়:
| তুলনা | Coercion নিয়ম | ফলাফল |
|---|---|---|
null == undefined |
বিশেষ নিয়ম — শুধু এরা পরস্পর equal | true |
null == 0 |
null শুধু undefined-এর সাথে == | false |
"5" == 5 |
String → Number: "5"→5 |
true |
true == 1 |
Boolean → Number: true→1 |
true |
false == 0 |
Boolean → Number: false→0 |
true |
false == "" |
false→0, ""→0 |
true |
[] == false |
false→0, []→""→0 |
true |
[] == ![] |
![]→false→0, []→""→0 |
true 🤯 |
"0" == false |
false→0, "0"→0 |
true |
=== ব্যবহার করবে:
==-এর Coercion নিয়ম মনে রাখা কঠিন এবং অনেক সময়
অপ্রত্যাশিত bug তৈরি করে। === (Strict Equality)
কোনো Coercion করে না — type ও মান উভয়ই মিললে তবেই true।
🔷 Type Conversion — বিস্তারিত (Explicit)
Type Conversion মানে প্রোগ্রামার নিজে সচেতনভাবে কোনো মানকে ভিন্ন type-এ রূপান্তর করে। এটি সবসময় পূর্বানুমানযোগ্য ও নিরাপদ।
String Conversion — বিস্তারিত নিয়ম → String
| মূল মান | Type | String() ফলাফল |
ব্যাখ্যা |
|---|---|---|---|
0 |
Number | "0" |
— |
-0 |
Number | "0" |
⚠️ -0 কিন্তু "0" দেখায় |
NaN |
Number | "NaN" |
— |
Infinity |
Number | "Infinity" |
— |
-Infinity |
Number | "-Infinity" |
— |
true |
Boolean | "true" |
— |
false |
Boolean | "false" |
— |
null |
null | "null" |
.toString()-এ Error! |
undefined |
undefined | "undefined" |
.toString()-এ Error! |
[] |
Array | "" |
খালি array = খালি string |
[1,2,3] |
Array | "1,2,3" |
comma দিয়ে জোড়া |
{} |
Object | "[object Object]" |
সব plain object |
function(){} |
Function | "function(){}" |
Function-এর source code |
Number Conversion — বিস্তারিত নিয়ম → Number
| মূল মান | Type | Number() |
parseInt() |
parseFloat() |
|---|---|---|---|---|
"42" |
String | 42 |
42 |
42 |
"3.14" |
String | 3.14 |
3 ✂️ |
3.14 |
"42px" |
String | NaN ⚠️ |
42 ✅ |
42 ✅ |
"px42" |
String | NaN |
NaN |
NaN |
"" |
String | 0 ⚠️ |
NaN |
NaN |
" 42 " |
String | 42 (space ছাঁটে) |
42 |
42 |
true |
Boolean | 1 |
NaN |
NaN |
false |
Boolean | 0 |
NaN |
NaN |
null |
null | 0 |
NaN |
NaN |
undefined |
undefined | NaN |
NaN |
NaN |
[] |
Array | 0 |
NaN |
NaN |
[5] |
Array | 5 |
NaN |
NaN |
[1,2] |
Array | NaN |
NaN |
NaN |
{} |
Object | NaN |
NaN |
NaN |
Boolean Conversion — বিস্তারিত নিয়ম → Boolean
| মান | Boolean() |
মনে রাখার উপায় |
|---|---|---|
false |
false | নিজেই false |
0, -0, +0 |
false | সব শূন্য false |
0n |
false | BigInt শূন্য |
"" / '' / `` |
false | খালি string |
null |
false | "কিছু নেই" |
undefined |
false | "মান নেই" |
NaN |
false | "সংখ্যা নয়" |
| বাকি সব মান | true | "০" string, [], {}, -1 সব Truthy! |
Conversion চেইন — ধাপে ধাপে Step by Step
Conversion VS Coercion — পাশাপাশি তুলনা Final Comparison
| লক্ষ্য | Coercion (Implicit) ⚠️ | Conversion (Explicit) ✅ | পার্থক্য |
|---|---|---|---|
| "42" → Number | "42" - 0 = 42 |
Number("42") = 42 |
উভয়ই কাজ করে, Explicit পরিষ্কার |
| "42px" → Number | "42px" - 0 = NaN |
parseInt("42px", 10) = 42 |
Explicit-এ সঠিক ফলাফল! |
| 42 → String | 42 + "" = "42" |
String(42) = "42" |
উভয়ই কাজ করে, Explicit স্পষ্ট |
| "" → Boolean | if ("") = false |
Boolean("") = false |
উভয়ই সঠিক |
| [] → Boolean | if ([]) = true (Truthy) |
Boolean([]) = true |
খালি array কিন্তু Truthy — বিভ্রান্তিকর! |
| তুলনা | "5" == 5 = true |
Number("5") === 5 = true |
Explicit-এই নিরাপদ |
→ Coercion = JavaScript নিজেই করে, কোড ছোট কিন্তু বিপজ্জনক।
→ Conversion = তুমি নিজে করো, কোড একটু বেশি কিন্তু নিরাপদ ও পরিষ্কার।
→
parseInt("42px", 10) কখনো "42px" - 0 দিয়ে করো না।→ সবসময়
=== ব্যবহার করো — ==-এর Coercion নিয়ম মুখস্থ না করে।
🔷 Implicit Type Casting — JavaScript নিজে যা করে
Implicit Casting-এ JavaScript নিজেই ভিন্ন type-এর মান একসাথে ব্যবহার করার সময় রূপান্তর করে। এটি প্রায়ই অপ্রত্যাশিত ফলাফল দেয়।
+ অপারেটর — সবচেয়ে বিভ্রান্তিকর
সাবধান!
- * / % অপারেটর — সংখ্যায় রূপান্তর করে
Numeric Context
Comparison-এ Implicit Casting == এড়িয়ে চলো
if() Context-এ Implicit Casting
Boolean Context
→ সবসময়
=== ব্যবহার করো, == নয়।→ মান রূপান্তর করতে হলে সবসময় Explicit Casting ব্যবহার করো।
→ কখনো
+ দিয়ে Number-এ রূপান্তর করো না (+"5"),
বরং Number("5") ব্যবহার করো।
🔷 Explicit Casting ১ — String-এ রূপান্তর
যেকোনো মানকে String-এ রূপান্তর করার তিনটি প্রধান উপায় আছে।
পদ্ধতি ১ — String(value)
সবচেয়ে নিরাপদ
পদ্ধতি ২ — .toString()
Radix সহ
পদ্ধতি ৩ — Template Literal সহজ পদ্ধতি
String রূপান্তর — সম্পূর্ণ টেবিল Reference
| মূল মান | মূল Type | String ফলাফল |
|---|---|---|
42 |
Number | "42" |
3.14 |
Number | "3.14" |
0 |
Number | "0" |
NaN |
Number | "NaN" |
Infinity |
Number | "Infinity" |
true |
Boolean | "true" |
false |
Boolean | "false" |
null |
null | "null" |
undefined |
undefined | "undefined" |
[1, 2, 3] |
Array | "1,2,3" |
{a: 1} |
Object | "[object Object]" |
→ সাধারণভাবে:
String(value) — সবকিছু handle করে, নিরাপদ।→ সংখ্যার ভিত্তি বদলাতে:
(num).toString(16) ← hex ইত্যাদি।→ পেজে দেখাতে: Template Literal
`${value}`।
🔷 Explicit Casting ২ — Number-এ রূপান্তর
যেকোনো মানকে Number-এ রূপান্তর করার বেশ কয়েকটি পদ্ধতি আছে। প্রতিটির আলাদা আচরণ জানা দরকার।
পদ্ধতি ১ — Number(value)
কঠোর রূপান্তর
পদ্ধতি ২ — parseInt(string, radix)
পূর্ণ সংখ্যা
পদ্ধতি ৩ — parseFloat(string)
দশমিক সংখ্যা
Number রূপান্তর — সম্পূর্ণ তুলনা টেবিল Reference
| মূল মান | Number() |
parseInt() |
parseFloat() |
|---|---|---|---|
"42" |
42 |
42 |
42 |
"3.14" |
3.14 |
3 ✂️ |
3.14 |
"42abc" |
NaN ⚠️ |
42 ✅ |
42 ✅ |
"abc" |
NaN |
NaN |
NaN |
"" (খালি) |
0 |
NaN ⚠️ |
NaN ⚠️ |
true |
1 |
NaN |
NaN |
false |
0 |
NaN |
NaN |
null |
0 |
NaN |
NaN |
undefined |
NaN |
NaN |
NaN |
→ পুরো String সংখ্যা হলে:
Number("42")→ String-এর শুরুতে সংখ্যা, পেছনে text থাকলে:
parseInt("42px")→ দশমিক দরকার হলে:
parseFloat("3.14rem")→ ফর্ম ইনপুটে সবসময়:
Number(input) বা parseInt(input, 10)
🔷 Explicit Casting ৩ — Boolean-এ রূপান্তর
যেকোনো মানকে Boolean-এ রূপান্তর করার দুটি পদ্ধতি আছে। এটি Falsy ও Truthy মান বোঝার সাথে সরাসরি সংযুক্ত।
পদ্ধতি ১ — Boolean(value)
স্পষ্ট পদ্ধতি
পদ্ধতি ২ — !! (Double Negation)
সংক্ষিপ্ত
Boolean রূপান্তর — সম্পূর্ণ Truthy/Falsy টেবিল ⭐ মুখস্থ করো
| মান | Boolean ফলাফল | ধরন | নোট |
|---|---|---|---|
false |
false | Boolean | — |
0, -0 |
false | Number | — |
0n |
false | BigInt | BigInt শূন্য |
"", '', `` |
false | String | খালি string |
null |
false | null | — |
undefined |
false | undefined | — |
NaN |
false | Number | — |
"0" |
true | String | ⚠️ "0" String, শূন্য নয়! |
"false" |
true | String | ⚠️ "false" String! |
[] |
true | Array | ⚠️ খালি array-ও Truthy! |
{} |
true | Object | ⚠️ খালি object-ও Truthy! |
| যেকোনো সংখ্যা ≠ 0 | true | Number | ঋণাত্মকও Truthy |
| যেকোনো non-empty String | true | String | Space-ও Truthy |
Boolean("false") → true — কারণ এটি একটি non-empty String!Boolean("0") → true — কারণ এটি String, Number 0 নয়!Boolean([]) → true — খালি Array-ও Truthy!
🔷 Object থেকে Primitive রূপান্তর
JavaScript কোনো Object-কে Primitive-এ রূপান্তর করার দরকার হলে
সেই Object-এর valueOf() ও toString() method ব্যবহার করে।
valueOf() ও toString()
Default আচরণ
Custom Object-এ রূপান্তর নিয়ন্ত্রণ Override
🔷 সাধারণ Type Casting ভুল ও সমাধান
JavaScript-এ Type Casting নিয়ে অনেক সাধারণ ভুল হয়। উদাহরণসহ দেখো কোথায় সমস্যা এবং কীভাবে ঠিক করতে হয়:
ভুল ১ — ফর্ম ইনপুটে গণনা সাধারণ ভুল
ভুল ২ — NaN চেক সাধারণ ভুল
ভুল ৩ — == দিয়ে তুলনা সাধারণ ভুল
ভুল ৪ — parseInt ছাড়া radix ভালো অভ্যাস
ভুল ৫ — খালি Array ও Object-এর Boolean অবাক করা আচরণ
🔷 দ্রুত রেফারেন্স — JavaScript Type Casting
Explicit Casting পদ্ধতিসমূহ Methods
| লক্ষ্য Type | সেরা পদ্ধতি | বিকল্প | এড়িয়ে চলো |
|---|---|---|---|
| → String | String(val) |
`${val}` |
val + "" |
| → Number (পূর্ণ) | Number(val) |
parseInt(val, 10) |
+val, val * 1 |
| → Number (দশমিক) | parseFloat(val) |
Number(val) |
+val |
| → Boolean | Boolean(val) |
!!val |
Implicit (if ছাড়া) |
Implicit Casting — বিপজ্জনক উদাহরণ এক নজরে মনে রাখো
| Expression | ফলাফল | কেন? |
|---|---|---|
"5" + 3 |
"53" ⚠️ |
String + Number = Concatenation |
"5" - 3 |
2 |
- শুধু Number-এ কাজ করে, "5" → 5 |
true + 1 |
2 |
true → 1 |
null + 1 |
1 |
null → 0 |
undefined + 1 |
NaN |
undefined → NaN |
"5" == 5 |
true ⚠️ |
== type ignore করে |
"5" === 5 |
false ✅ |
=== type সহ তুলনা |
Boolean("0") |
true ⚠️ |
"0" String, শূন্য নয় |
Boolean([]) |
true ⚠️ |
Object সবসময় Truthy |
Number("") |
0 ⚠️ |
খালি String = 0 |
parseInt("", 10) |
NaN |
parseInt খালি String = NaN |
Type Casting-এর মূল নিয়ম Golden Rules
| # | নিয়ম |
|---|---|
| ১ | সবসময় === ব্যবহার করো, == এড়িয়ে চলো। |
| ২ | রূপান্তর করতে Explicit পদ্ধতি (Number(), String()) ব্যবহার করো। |
| ৩ | NaN চেক করতে Number.isNaN() ব্যবহার করো। |
| ৪ | ফর্ম ইনপুট গণনায় ব্যবহারের আগে Number() দিয়ে রূপান্তর করো। |
| ৫ | parseInt()-এ সবসময় radix (10) দাও। |
| ৬ | Array খালি কিনা arr.length === 0 দিয়ে চেক করো, !arr নয়। |
| ৭ | +value বা value * 1 দিয়ে Implicit Casting করো না। |
🧠 নিজেকে যাচাই করো
1. Number('123') কী return করে?
2. NaN মানে কী?
3. Boolean('') কী return করে?
✏️ Task — এখন তুমি করো
'123', true, null, [] — এগুলো Number() ও Boolean()-এ convert করে দেখো।
Portfolio-এ age calculator বানাও — type casting ব্যবহার করো।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
🏗️ JavaScript Data Structures — সম্পূর্ণ নোট
এই সেকশনে JavaScript-এর Array, Object, Map, Set, WeakMap, WeakSet, Stack ও Queue — সব Data Structure বাংলায় উদাহরণসহ আলোচনা করা হয়েছে।
🔷 Data Structures কী ও কেন প্রয়োজন?
Data Structure হলো তথ্য সংগঠিতভাবে সংরক্ষণ ও পরিচালনা করার পদ্ধতি। সঠিক Data Structure বেছে নিলে প্রোগ্রাম দ্রুত ও কার্যকরভাবে কাজ করে।
সহজ উদাহরণ — একটি শ্রেণির ছাত্রছাত্রীর নামের তালিকা রাখতে Array, প্রতিটি ছাত্রের তথ্য (নাম, বয়স, ঠিকানা) রাখতে Object সবচেয়ে উপযুক্ত।
| Data Structure | কী রাখে? | কখন ব্যবহার করবে? | ES Version |
|---|---|---|---|
| Array | তালিকা আকারে একাধিক মান | ক্রম গুরুত্বপূর্ণ হলে, index দিয়ে access | ES1 |
| Object | Key-Value জোড়া | নামযুক্ত তথ্য রাখতে | ES1 |
| Map | Key-Value জোড়া (যেকোনো Key) | Key যেকোনো type হলে, iteration দরকার হলে | ES6 |
| Set | অনন্য (unique) মানের সংগ্রহ | duplicate বাদ দিতে, membership চেক | ES6 |
| WeakMap | Object Key সহ Key-Value | Private data, memory leak এড়াতে | ES6 |
| WeakSet | Object-এর unique সংগ্রহ | Object tracking, memory safe | ES6 |
| Stack | LIFO — শেষে রাখা, আগে বের হয় | Undo/Redo, Function call stack | Array দিয়ে তৈরি |
| Queue | FIFO — আগে রাখা, আগে বের হয় | Task queue, Print queue | Array দিয়ে তৈরি |
🔷 Indexed Collections — সংখ্যাভিত্তিক সংগ্রহ
Indexed Collections হলো সেই Data Structure যেখানে প্রতিটি মান একটি numeric index দিয়ে access করা যায়। JavaScript-এ দুই ধরনের Indexed Collection আছে।
| ধরন | কী রাখে? | Index | ব্যবহার |
|---|---|---|---|
| Array | যেকোনো type মিশিয়ে | 0, 1, 2 ... | সাধারণ তালিকা, সব ধরনের কাজ |
| Typed Array | শুধু নির্দিষ্ট numeric type | 0, 1, 2 ... | Binary data, WebGL, Audio/Video, Network |
🔷 Array — তালিকা
Array হলো index-ভিত্তিক তালিকা যেখানে ক্রমানুসারে একাধিক মান
রাখা যায়। Index সবসময় 0 থেকে শুরু।
Array তৈরি ও Access Creation
Array Destructuring ES6
Spread Operator (...)
ES6
Mutating Methods — মূল Array পরিবর্তন করে মূল পরিবর্তন হয়
| Method | কাজ | উদাহরণ | Return |
|---|---|---|---|
.push(item) |
শেষে যোগ | arr.push(4) |
নতুন length |
.pop() |
শেষেরটা সরায় | arr.pop() |
সরানো element |
.unshift(item) |
শুরুতে যোগ | arr.unshift(0) |
নতুন length |
.shift() |
শুরুরটা সরায় | arr.shift() |
সরানো element |
.splice(i, n, ...items) |
নির্দিষ্ট জায়গায় যোগ/বাদ | arr.splice(1, 2) |
সরানো elements |
.sort(fn) |
সাজানো | arr.sort() |
সাজানো Array |
.reverse() |
উল্টানো | arr.reverse() |
উল্টানো Array |
.fill(val, s, e) |
মান দিয়ে পূরণ | arr.fill(0) |
পরিবর্তিত Array |
Non-Mutating Methods — নতুন Array ফেরত দেয় মূল অপরিবর্তিত
| Method | কাজ | উদাহরণ |
|---|---|---|
.slice(s, e) |
অংশ বের করে নতুন Array | [1,2,3,4].slice(1,3) → [2,3] |
.concat(...arr) |
জোড়া লাগিয়ে নতুন Array | [1,2].concat([3,4]) → [1,2,3,4] |
.join(sep) |
String-এ পরিণত | ["ক","খ"].join("-") → "ক-খ" |
.indexOf(val) |
প্রথম index খোঁজে | [1,2,3].indexOf(2) → 1 |
.lastIndexOf(val) |
শেষ index খোঁজে | [1,2,1].lastIndexOf(1) → 2 |
.includes(val) |
আছে কিনা | [1,2,3].includes(2) → true |
.flat(depth) |
Nested array সমতল করে | [1,[2,[3]]].flat(2) → [1,2,3] |
.toReversed() |
উল্টো নতুন Array (ES2023) | মূল অপরিবর্তিত |
.toSorted(fn) |
সাজানো নতুন Array (ES2023) | মূল অপরিবর্তিত |
Iterative Methods — প্রতিটি element-এ কাজ করে Iteration
Static Array Methods Static
sort() সাবধান: কোনো function না দিলে
সব মান String-এ convert করে sort করে।
তাই [10, 2, 1].sort() → [1, 10, 2] (ভুল!)।
সংখ্যার জন্য সবসময় .sort((a, b) => a - b) দাও।
🔷 Typed Arrays — নির্দিষ্ট ধরনের সংখ্যার Array
Typed Array হলো নির্দিষ্ট numeric type-এর binary data রাখার বিশেষ Array। সাধারণ Array-এর মতো দেখতে হলেও এটি শুধু নির্দিষ্ট ধরনের সংখ্যা রাখে এবং মেমোরি অনেক কার্যকরভাবে ব্যবহার করে।
ArrayBuffer — Binary Data-র ভিত্তি Buffer
Typed Array-এর প্রকারসমূহ Types
| Type | প্রতি element | মানের পরিসর | ব্যবহার |
|---|---|---|---|
Int8Array |
1 byte | -128 থেকে 127 | ছোট পূর্ণ সংখ্যা |
Uint8Array |
1 byte | 0 থেকে 255 | ছবির pixel, binary data |
Uint8ClampedArray |
1 byte | 0 থেকে 255 (clamped) | Canvas pixel data |
Int16Array |
2 bytes | -32768 থেকে 32767 | Audio data |
Uint16Array |
2 bytes | 0 থেকে 65535 | — |
Int32Array |
4 bytes | -2³¹ থেকে 2³¹-1 | সাধারণ integer |
Uint32Array |
4 bytes | 0 থেকে 2³²-1 | — |
Float32Array |
4 bytes | 32-bit float | WebGL, 3D graphics |
Float64Array |
8 bytes | 64-bit float | সাধারণ Number-এর মতো |
BigInt64Array |
8 bytes | BigInt পূর্ণ সংখ্যা | বড় সংখ্যা |
Typed Array ব্যবহার Usage
DataView — Mixed Type Buffer Reading DataView
→ Canvas API-তে pixel manipulation (
Uint8ClampedArray)।→ WebGL-এ 3D vertex data (
Float32Array)।→ Web Audio API-তে sound data (
Float32Array)।→ Fetch API বা WebSocket-এ binary data পড়তে।
→ সাধারণ কাজে ব্যবহার করো না — normal Array-ই যথেষ্ট।
🔷 Object — Key-Value Store
Object হলো Key-Value জোড়ায় তথ্য সংরক্ষণের পাত্র। Key সবসময় String বা Symbol — এটিই Array-এর সাথে মূল পার্থক্য।
Object তৈরি, Access ও পরিবর্তন Basics
Object Destructuring ও Spread ES6
গুরুত্বপূর্ণ Object Static Methods Methods
🔷 Keyed Collections — Key-ভিত্তিক সংগ্রহ
Keyed Collections হলো সেই Data Structure যেখানে প্রতিটি মান একটি Key দিয়ে চেনা যায়। Indexed Collection (Array)-এর মতো সংখ্যাভিত্তিক নয় — এখানে Key যেকোনো কিছু হতে পারে।
| Collection | Key-এর type | Value | Garbage Collection | Iterable |
|---|---|---|---|---|
| Map | যেকোনো type | যেকোনো type | ❌ না | ✅ হ্যাঁ |
| WeakMap | শুধু Object | যেকোনো type | ✅ হ্যাঁ | ❌ না |
| Set | মানটিই Key | Unique মান | ❌ না | ✅ হ্যাঁ |
| WeakSet | শুধু Object | Object-ই মান | ✅ হ্যাঁ | ❌ না |
→
Object → সাধারণ structured data, JSON-friendly।→
Map → যখন Key যেকোনো type হবে বা ঘন ঘন add/delete হবে।→
Set → যখন শুধু unique মান রাখতে হবে।→
WeakMap/WeakSet → memory-sensitive private data।
🔷 Map — উন্নত Key-Value Store
Map হলো ES6-এর Key-Value structure। Object-এর মতো হলেও Map-এ Key যেকোনো type-এর হতে পারে — Object, Array, Function, Number সবকিছু।
Map vs Object — পার্থক্য Comparison
| বিষয় | Object | Map |
|---|---|---|
| Key-এর type | শুধু String বা Symbol | যেকোনো type |
| Insertion Order | সাধারণত বজায় থাকে (integer key ছাড়া) | সর্বদা বজায় থাকে |
| Size জানা | Object.keys(obj).length |
map.size |
| Iteration | for...in, Object.entries() |
সরাসরি iterable |
| Default Key | Prototype-এর key থাকে | শুধু নিজের key |
| Performance | সাধারণ data-এ ভালো | ঘন ঘন add/delete-এ ভালো |
Map তৈরি ও Methods Usage
Map পরিষ্কার ও কখন ব্যবহার করবে? Use Cases
🔷 Set — অনন্য মানের সংগ্রহ
Set-এ প্রতিটি মান সর্বদা অনন্য — একই মান দুবার রাখা যায় না। Duplicate মান যোগ করলে চুপচাপ উপেক্ষিত হয়।
Set তৈরি ও Methods Usage
Array থেকে Duplicate সরানো সেরা ব্যবহার
Set দিয়ে গণিতের Set অপারেশন Set Operations
🔷 WeakMap ও WeakSet
WeakMap ও WeakSet হলো Map ও Set-এর বিশেষ সংস্করণ। এদের Key হতে হবে Object। Key-এর Object অন্য কোথাও reference না থাকলে JavaScript Garbage Collector স্বয়ংক্রিয়ভাবে মেমোরি মুক্ত করে।
WeakMap vs Map পার্থক্য Comparison
| বিষয় | Map | WeakMap |
|---|---|---|
| Key-এর type | যেকোনো type | শুধু Object |
| Iterable | ✅ হ্যাঁ | ❌ না |
| .size | ✅ আছে | ❌ নেই |
| Garbage Collection | Reference থাকলেও মেমোরিতে | Key Object সরলে auto-clean |
| ব্যবহার | General purpose | Private data, Cache |
WeakMap-এর Practical ব্যবহার — Private Data Use Case
→ DOM element-এর সাথে data যুক্ত করতে (element মুছলে data auto-clean)।
→ Class-এর private data রাখতে।
→ Cache তৈরিতে যেখানে Object সরলে cache-ও সরবে।
সাধারণ ক্ষেত্রে Map ও Set-ই যথেষ্ট।
🔷 Structured Data — কাঠামোবদ্ধ তথ্য
Structured Data হলো নির্দিষ্ট কাঠামো মেনে সংগঠিত তথ্য। JavaScript-এ Structured Data মূলত তিন ধরনের:
| ধরন | কী? | ব্যবহার |
|---|---|---|
| JSON | Text-based structured format | API, Config file, localStorage |
| ArrayBuffer | Raw binary data block | File, Network, WebGL (আগে আলোচিত) |
| SharedArrayBuffer | Multiple thread-এ shared memory | Web Workers, Parallel processing |
SharedArrayBuffer — Shared Memory Advanced
🔷 JSON — JavaScript Object Notation
JSON (JavaScript Object Notation) হলো structured data সংরক্ষণ ও আদান-প্রদানের সবচেয়ে জনপ্রিয় text format। API call, Config file, localStorage — সব জায়গায় JSON ব্যবহার হয়।
JSON Format-এর নিয়ম Format
| JavaScript | JSON-এ সম্ভব? | JSON রূপ |
|---|---|---|
"হ্যালো" |
✅ | "হ্যালো" |
42, 3.14 |
✅ | 42, 3.14 |
true, false |
✅ | true, false |
null |
✅ | null |
{ key: "val" } |
✅ (Key double quote-এ) | {"key": "val"} |
[1, 2, 3] |
✅ | [1, 2, 3] |
undefined |
❌ | বাদ যায় বা null |
function(){} |
❌ | বাদ যায় |
Symbol() |
❌ | বাদ যায় |
new Date() |
⚠️ String হিসেবে | "2025-01-01T00:00:00.000Z" |
JSON.stringify() — Object → JSON String
Serialize
JSON.parse() — JSON String → Object
Deserialize
JSON দিয়ে Deep Clone Trick
JSON-এর সীমাবদ্ধতা Limitations
| সমস্যা | উদাহরণ | সমাধান |
|---|---|---|
| Function বাদ যায় | stringify({fn: () => {}}) → {} |
Function ছাড়া data রাখো |
| Date String হয়ে যায় | parse(stringify(new Date())) → String |
Reviver দিয়ে new Date() করো |
| Circular Reference Error | Object নিজেকেই reference করলে | Replacer দিয়ে বাদ দাও |
| undefined বাদ যায় | stringify({a: undefined}) → {} |
null ব্যবহার করো |
| Map/Set সাপোর্ট নেই | Map/Set → {} হয়ে যায় |
Array-এ convert করো |
localStorage-এ JSON ব্যবহার Practical
🔷 Stack — LIFO কাঠামো
Stack হলো LIFO (Last In, First Out) কাঠামো। সহজ উপমা — বাসনের স্তূপ: সর্বশেষ রাখা বাসনটি সর্বপ্রথম তোলা হয়।
| Operation | অর্থ | Array Method |
|---|---|---|
| push(item) | Stack-এর উপরে রাখো | array.push(item) |
| pop() | উপর থেকে বের করো | array.pop() |
| peek() | উপরেরটা শুধু দেখো (বের করো না) | array[array.length - 1] |
| isEmpty() | খালি কিনা | array.length === 0 |
Stack-এর Practical ব্যবহার — Undo/Redo Real-world
({[]}) সঠিক কিনা চেক করা)।
🔷 Queue — FIFO কাঠামো
Queue হলো FIFO (First In, First Out) কাঠামো। সহজ উপমা — দোকানের লাইন: যে আগে এসেছে সে আগে সেবা পাবে।
| Operation | অর্থ | Array Method |
|---|---|---|
| enqueue(item) | Queue-এর শেষে যোগ | array.push(item) |
| dequeue() | Queue-এর শুরু থেকে বের করো | array.shift() |
| front() | সামনেরটা শুধু দেখো | array[0] |
| isEmpty() | খালি কিনা | array.length === 0 |
Queue-এর Practical ব্যবহার — Task Processing Real-world
🔷 দ্রুত রেফারেন্স — JavaScript Data Structures
কোন Data Structure কখন ব্যবহার করবে? Decision Guide
| পরিস্থিতি | সেরা পছন্দ | কারণ |
|---|---|---|
| তালিকা রাখতে হবে, ক্রম গুরুত্বপূর্ণ | Array | Index-ভিত্তিক, সহজ iteration |
| নামযুক্ত তথ্য রাখতে হবে | Object | Dot notation, JSON-friendly |
| Key যেকোনো type হবে | Map | Object, Number, Function — যেকোনো Key |
| Duplicate বাদ দিতে হবে | Set | Unique মান guarantee করে |
| মেমোরি leak এড়াতে private data | WeakMap | Garbage Collection সাপোর্ট করে |
| Object visit করা হয়েছে কিনা ট্র্যাক | WeakSet | Object Garbage Collected হলে auto-remove |
| Undo/Redo, Function call tracking | Stack | LIFO — শেষেরটা আগে দরকার |
| Task queue, Notification | Queue | FIFO — আগেরটা আগে প্রক্রিয়া |
Array-এর গুরুত্বপূর্ণ Methods এক নজরে Array
| ধরন | Methods |
|---|---|
| Mutating (মূল বদলায়) | push, pop, shift, unshift, splice, sort, reverse, fill |
| Non-Mutating (নতুন ফেরত) | slice, concat, join, indexOf, includes, flat, toSorted, toReversed |
| Iterative (প্রতিটিতে কাজ) | forEach, map, filter, reduce, find, findIndex, some, every, flatMap |
| Static | Array.isArray(), Array.from(), Array.of() |
Map ও Set-এর Methods এক নজরে Map / Set
| Method | Map | Set |
|---|---|---|
| যোগ করা | .set(key, val) |
.add(val) |
| মান পড়া | .get(key) |
— (iteration দিয়ে) |
| আছে কিনা | .has(key) |
.has(val) |
| মুছে ফেলা | .delete(key) |
.delete(val) |
| সব মোছা | .clear() |
.clear() |
| সংখ্যা | .size |
.size |
🧠 নিজেকে যাচাই করো
1. Array-এর push() কী করে?
2. Object-এ property access কীভাবে?
3. Array.map() কী করে?
✏️ Task — এখন তুমি করো
তোমার skills array তৈরি করো। push, pop, map, filter, find ব্যবহার করো।
Portfolio-এর skills ও projects Array ও Object দিয়ে manage করো।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
⚖️ JavaScript Equality Comparisons — সম্পূর্ণ নোট
এই সেকশনে JavaScript-এর সমতা তুলনার সব পদ্ধতি — Abstract Equality (==),
Strict Equality (===), SameValue (Object.is()), এবং SameValueZero — বাংলায়
উদাহরণসহ আলোচনা করা হয়েছে।
🔷 Equality Comparisons কী ও কেন প্রয়োজন?
Equality Comparison হলো দুটো মান সমান কিনা তা যাচাই করার পদ্ধতি। JavaScript-এ এটি অন্য ভাষার চেয়ে জটিল — কারণ এখানে Type Coercion (type রূপান্তর) ঘটতে পারে।
সহজ উদাহরণ — "5" == 5 লিখলে JavaScript বলে true,
কিন্তু "5" === 5 লিখলে বলে false।
এই পার্থক্যটুকু না বুঝলেই বাগ তৈরি হয়।
| তুলনার পদ্ধতি | Operator / Method | Type Coercion? | বিশেষত্ব | ES Version |
|---|---|---|---|---|
| Abstract Equality | == |
✅ হ্যাঁ | Type ভিন্ন হলে convert করে তুলনা করে | ES1 |
| Strict Equality | === |
❌ না | Type ও মান দুটোই মিলতে হবে | ES3 |
| SameValue | Object.is() |
❌ না | NaN === NaN এবং +0 ≠ -0 সঠিকভাবে |
ES6 |
| SameValueZero | Map, Set, includes() | ❌ না | NaN সমান, কিন্তু +0 ও -0 সমান | ES6 |
🔷 Abstract Equality — == (Loose Equality)
Abstract Equality (==)-তে দুটো মানের type ভিন্ন হলে
JavaScript স্বয়ংক্রিয়ভাবে একটিকে অন্যটির type-এ রূপান্তর করে তুলনা করে।
এই প্রক্রিয়াকে Type Coercion বলে।
Type Coercion-এর নিয়মাবলী Rules
| তুলনা | ফলাফল | কারণ |
|---|---|---|
"5" == 5 |
true |
String "5" → Number 5-এ convert হয় |
0 == false |
true |
false → Number 0-এ convert হয় |
1 == true |
true |
true → Number 1-এ convert হয় |
null == undefined |
true |
বিশেষ নিয়ম — এই দুটো পরস্পর সমান |
null == 0 |
false |
null শুধু undefined-এর সাথেই সমান |
"" == 0 |
true |
খালি String → Number 0 |
"0" == false |
true |
"0" → 0, false → 0 |
[] == false |
true |
[] → "" → 0, false → 0 |
NaN == NaN |
false |
NaN কখনো নিজের সাথেও সমান নয় |
==-এর একমাত্র ভালো ব্যবহার
Use Case
== সাবধান: null == null চেক ছাড়া
অন্য ক্ষেত্রে == ব্যবহার করলে অপ্রত্যাশিত bug তৈরি হতে পারে।
সবসময় === ব্যবহার করো — ESLint-ও এটাই suggest করে।
🔷 Strict Equality — === (সবচেয়ে বেশি ব্যবহৃত)
Strict Equality (===)-তে কোনো Type Coercion হয় না।
তুলনা করা দুটো মানের type ও মান — উভয়ই হুবহু মিলতে হবে।
এটিই সবচেয়ে নিরাপদ ও প্রস্তাবিত পদ্ধতি।
Strict Equality কীভাবে কাজ করে? Algorithm
| তুলনা | ফলাফল | কারণ |
|---|---|---|
"5" === 5 |
false |
Type ভিন্ন (String vs Number) |
5 === 5 |
true |
Type ও মান একই |
true === 1 |
false |
Type ভিন্ন (Boolean vs Number) |
null === undefined |
false |
Type ভিন্ন |
null === null |
true |
Type ও মান একই |
NaN === NaN |
false |
NaN কখনো নিজের সাথেও সমান নয় ⚠️ |
+0 === -0 |
true |
=== এ +0 ও -0 সমান (Object.is-এ নয়) |
[] === [] |
false |
দুটো আলাদা Object reference |
{} === {} |
false |
দুটো আলাদা Object reference |
Primitive vs Reference Equality গুরুত্বপূর্ণ
ব্যবহারিক উদাহরণ Practical
=== ব্যবহার করো।
শুধুমাত্র null/undefined একসাথে চেক করতে == null ব্যবহার করা যেতে পারে।
ESLint-এর eqeqeq rule চালু রাখলে == ব্যবহার করলে সতর্কবার্তা দেবে।
🔷 SameValue — Object.is()
SameValue (Object.is()) হলো ES6-এর সবচেয়ে precise equality পদ্ধতি।
এটি ===-এর মতোই কাজ করে, শুধু দুটো বিশেষ ক্ষেত্রে পার্থক্য আছে।
=== বনাম Object.is() পার্থক্য
Comparison
| তুলনা | === ফলাফল |
Object.is() ফলাফল |
পার্থক্য আছে? |
|---|---|---|---|
NaN, NaN |
false |
true |
✅ হ্যাঁ |
+0, -0 |
true |
false |
✅ হ্যাঁ |
5, 5 |
true |
true |
❌ একই |
"ক", "ক" |
true |
true |
❌ একই |
null, null |
true |
true |
❌ একই |
[], [] |
false |
false |
❌ একই |
Object.is() ব্যবহার
Usage
কখন Object.is() দরকার হয়?
Use Cases
🔷 SameValueZero — Map, Set ও includes()-এর ভেতরের algorithm
SameValueZero হলো JavaScript-এর অভ্যন্তরীণ algorithm।
এটি সরাসরি call করা যায় না, তবে Map, Set,
Array.prototype.includes() এবং String.prototype.includes()
এই algorithm ব্যবহার করে।
চার Equality পদ্ধতির তুলনা Full Comparison
| তুলনা | == |
=== |
Object.is() |
SameValueZero |
|---|---|---|---|---|
NaN, NaN |
false |
false |
true ✅ |
true ✅ |
+0, -0 |
true |
true |
false |
true |
"5", 5 |
true |
false |
false |
false |
null, undefined |
true |
false |
false |
false |
1, 1 |
true |
true |
true |
true |
SameValueZero কোথায় দেখা যায়? Examples
.includes() ব্যবহার করো —
.indexOf() NaN খুঁজে পায় না। অথবা Number.isNaN() দিয়ে নিজে চেক করো।
🔷 Type Coercion — স্বয়ংক্রিয় type রূপান্তর
Type Coercion হলো JavaScript-এর স্বয়ংক্রিয় type রূপান্তর। দুই ধরনের Coercion আছে — Implicit (JavaScript নিজে করে) ও Explicit (প্রোগ্রামার নিজে করে)।
Falsy ও Truthy মান Boolean Context
| মান | Boolean রূপান্তর | ধরন |
|---|---|---|
false |
false |
Falsy |
0, -0, 0n |
false |
Falsy |
"", '', `` |
false |
Falsy (খালি String) |
null |
false |
Falsy |
undefined |
false |
Falsy |
NaN |
false |
Falsy |
1, -1, 0.5 |
true |
Truthy |
"0", " ", "false" |
true |
Truthy (খালি নয় এমন String) |
[], {} |
true |
Truthy (খালি হলেও!) |
| যেকোনো function | true |
Truthy |
Implicit Coercion-এর বিপদজনক উদাহরণ সাবধান
🔷 Equality-র বিশেষ ক্ষেত্র — Edge Cases
NaN — "Not a Number"-এর বিশেষ আচরণ Edge Case
null ও undefined-এর তুলনা null / undefined
Object ও Array তুলনার সঠিক পদ্ধতি Deep Equal
🔷 Relational Comparison — <, >, <=,
>=
Relational Operators দুটো মানের মধ্যে ছোট-বড় সম্পর্ক নির্ণয় করে। Type Coercion এখানেও প্রযোজ্য।
🔷 দ্রুত রেফারেন্স — JavaScript Equality Comparisons
কোন Equality Method কখন ব্যবহার করবে? Decision Guide
| পরিস্থিতি | সেরা পছন্দ | কারণ |
|---|---|---|
| সাধারণ সব তুলনা | === |
Type-safe, নিরাপদ, প্রস্তাবিত |
| null বা undefined একসাথে চেক | == null |
দুটোই ধরা পড়ে, সংক্ষিপ্ত |
| NaN কিনা চেক | Number.isNaN() |
শুধু NaN-এর জন্য true, নির্ভরযোগ্য |
| +0 ও -0 আলাদা করতে | Object.is() |
+0 ও -0 সঠিকভাবে আলাদা করে |
| Array-এ NaN খোঁজা | .includes() |
SameValueZero — NaN খুঁজে পায় |
| Object / Array-এর মান তুলনা | Custom deepEqual / structuredClone | === শুধু reference তুলনা করে |
| String তুলনা (বাংলা/locale) | .localeCompare() |
ভাষাভিত্তিক সঠিক তুলনা করে |
চার Equality পদ্ধতির সারসংক্ষেপ Summary
| পদ্ধতি | Type Coercion | NaN == NaN | +0 == -0 | ব্যবহার |
|---|---|---|---|---|
== |
✅ হ্যাঁ | false | true | শুধু == null |
=== |
❌ না | false | true | সাধারণ সব ক্ষেত্রে ✅ |
Object.is() |
❌ না | true ✅ | false ✅ | NaN ও ±0 সংক্রান্ত বিশেষ ক্ষেত্রে |
| SameValueZero | ❌ না | true ✅ | true | Map, Set, includes() — অভ্যন্তরীণ |
সাধারণ ভুল ও সমাধান Common Mistakes
| ভুল কোড | সমস্যা | সঠিক কোড |
|---|---|---|
if (x == true) |
Type Coercion, অপ্রত্যাশিত | if (x === true) বা if (x) |
if (val == undefined) |
null চেক হয় না (=== হলে) | if (val == null) উভয়ের জন্য |
if (isNaN(val)) |
String-এও true দেয় | if (Number.isNaN(val)) |
arr.indexOf(NaN) |
NaN খোঁজে পায় না (-1) | arr.includes(NaN) |
obj1 === obj2 |
Reference তুলনা, মান নয় | JSON.stringify(o1) === JSON.stringify(o2) বা deepEqual |
typeof null === "null" |
typeof null === "object" (bug!) | val === null |
🧠 নিজেকে যাচাই করো
1. === ও == পার্থক্য?
2. '5' == 5?
3. '5' === 5?
✏️ Task — এখন তুমি করো
console-এ test করো: '5'==5, '5'===5, null==undefined, null===undefined।
Portfolio login form বানাও — equality দিয়ে validate করো।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
🔁 JavaScript Loops and Iterations — সম্পূর্ণ নোট
এই সেকশনে JavaScript-এর সব ধরনের Loop — for, while,
do...while, for...in, for...of, এবং Iterators ও Generators —
বাংলায় উদাহরণসহ আলোচনা করা হয়েছে।
🔷 Loops কী ও কেন প্রয়োজন?
Loop হলো একটি কোড-ব্লক বারবার চালানোর পদ্ধতি। যখন একই কাজ নির্দিষ্ট সংখ্যকবার বা কোনো শর্ত পূরণ না হওয়া পর্যন্ত করতে হয় — তখন Loop ব্যবহার হয়।
সহজ উদাহরণ — একটি ক্লাসের ৪০ জন ছাত্রের রোল নম্বর প্রিন্ট করতে ৪০টি আলাদা লাইন না লিখে মাত্র একটি Loop দিয়েই কাজ হয়।
| Loop | কখন ব্যবহার করবে? | বিশেষত্ব | ES Version |
|---|---|---|---|
| for | কতবার চলবে আগে থেকে জানা থাকলে | Counter-controlled, সবচেয়ে বেশি ব্যবহৃত | ES1 |
| while | শর্ত পূরণ না হওয়া পর্যন্ত চলবে | Entry-controlled — আগে শর্ত চেক | ES1 |
| do...while | কমপক্ষে একবার চালাতেই হবে | Exit-controlled — পরে শর্ত চেক | ES1 |
| for...in | Object-এর Key-এ iterate করতে | Enumerable property iterate করে | ES1 |
| for...of | Iterable-এর Value-এ iterate করতে | Array, String, Map, Set সবকিছুতে | ES6 |
| for await...of | Async Iterable-এ iterate করতে | Promise, Stream, Async Generator | ES2018 |
🔷 for Loop — Counter-Controlled Loop
for Loop-এ তিনটি অংশ থাকে — initialization (শুরু), condition (শর্ত), এবং update (পরিবর্তন)। কতবার চলবে আগে থেকে জানা থাকলে এটাই সেরা পছন্দ।
for Loop-এর গঠন ও ব্যবহার Syntax
Nested for Loop — 2D Array ও Matrix Nested
for Loop-এর অংশ বাদ দেওয়া Flexible
arr.length
বারবার গণনা না করে একবার variable-এ রেখে দাও:
const len = arr.length; — তারপর i < len ব্যবহার করো।
বড় Array-এ পার্থক্য অনুভব করা যায়।
🔷 while Loop — Entry-Controlled Loop
while Loop-এ শুধু একটি শর্ত থাকে। শর্ত true থাকা পর্যন্ত
loop চলতে থাকে। এটি Entry-controlled — প্রতিবার body চালানোর আগে শর্ত চেক হয়।
while Loop-এর গঠন ও ব্যবহার Syntax
Infinite Loop ও নিরাপদ বের হওয়া সাবধান
🔷 do...while Loop — Exit-Controlled Loop
do...while Loop হলো Exit-controlled Loop।
শর্ত false হলেও body কমপক্ষে একবার চালু হবেই।
এটিই while-এর সাথে একমাত্র পার্থক্য।
while বনাম do...while পার্থক্য Comparison
| বিষয় | while | do...while |
|---|---|---|
| শর্ত চেক | Body-র আগে (Entry) | Body-র পরে (Exit) |
| শর্ত প্রথমেই false | একবারও চলে না | একবার চলে তারপর থামে |
| সর্বনিম্ন execution | ০ বার | ১ বার |
| সেরা ব্যবহার | কতবার চলবে অনিশ্চিত | কমপক্ষে একবার চালাতেই হবে |
🔷 for...in Loop — Object-এর Key iterate করা
for...in Loop Object-এর সব enumerable property-র Key-এ
iterate করে। Array-এও কাজ করে কিন্তু সেখানে for...of বা forEach
ব্যবহার করা ভালো।
for...in-এর গঠন ও ব্যবহার Syntax
Prototype Chain সমস্যা ও সমাধান সাবধান
→ Object-এর সব Key দেখতে বা সব property নিয়ে কাজ করতে।
→ Object-কে dynamically process করতে।
→ Array-এ কখনো ব্যবহার করো না — সেখানে
for...of বা
forEach ব্যবহার করো।
🔷 for...of Loop — Iterable-এর Value iterate করা
for...of Loop হলো ES6-এর সেরা সংযোজন। এটি যেকোনো Iterable-এর মান সরাসরি পায় — index বা key-এর ঝামেলা নেই। Array, String, Map, Set, NodeList — সবকিছুতে কাজ করে।
for...in বনাম for...of পার্থক্য Comparison
| বিষয় | for...in | for...of |
|---|---|---|
| কী দেয়? | Key (property name) | Value (মান) |
| Object-এ | ✅ কাজ করে | ❌ Plain Object-এ নয় |
| Array-এ | ⚠️ String index দেয় | ✅ মান সরাসরি |
| String-এ | ⚠️ index দেয় | ✅ character সরাসরি |
| Map / Set-এ | ❌ কাজ করে না | ✅ কাজ করে |
| Prototype chain | ⚠️ আসতে পারে | ✅ আসে না |
for...of-এর ব্যবহার Usage
for...of-এর বিশেষ সুবিধা Advanced
🔷 Loop Control — break, continue ও label
Loop চলাকালীন তার আচরণ নিয়ন্ত্রণ করতে তিনটি keyword আছে — break (সম্পূর্ণ বের হওয়া), continue (এড়িয়ে পরেরটায় যাওয়া), এবং label (nested loop-এ নির্দিষ্ট loop ধরা)।
break ও continue Control
| Keyword | কাজ | কোথায় ব্যবহার |
|---|---|---|
| break | Loop বা switch সম্পূর্ণ বন্ধ করে | for, while, do...while, switch |
| continue | বর্তমান iteration বাদ দিয়ে পরেরটায় যায় | for, while, do...while |
| label + break | Nested loop-এর নির্দিষ্ট loop বন্ধ করে | Nested loop |
| label + continue | Nested loop-এর নির্দিষ্ট loop-এর পরের iteration-এ যায় | Nested loop |
Label — Nested Loop Control Advanced
🔷 Iterators ও Iteration Protocol
Iteration Protocol হলো JavaScript-এর অভ্যন্তরীণ নিয়ম যা বলে কোনো Object iterate করা যাবে কিনা এবং কীভাবে। দুটো অংশ — Iterable Protocol এবং Iterator Protocol।
Iterable ও Iterator Protocol Protocol
| Protocol | প্রয়োজনীয় Method | Return করে | ব্যবহার |
|---|---|---|---|
| Iterable | [Symbol.iterator]() |
Iterator object | for...of, Spread, Destructuring |
| Iterator | next() |
{ value, done } |
একের পর এক মান দেওয়া |
Custom Iterator-এর Practical ব্যবহার Real-world
🔷 Generators — Lazy Iteration
Generator হলো বিশেষ ধরনের function যা মাঝপথে থামতে
(yield)
এবং আবার শুরু হতে (next()) পারে। এটি Iterator Protocol
স্বয়ংক্রিয়ভাবে
implement করে — তাই for...of দিয়ে সরাসরি iterate করা যায়।
Generator Function-এর গঠন Syntax
Generator-এর বিশেষ ক্ষমতা Features
Generator-এর Practical ব্যবহার Real-world
→ Infinite sequence তৈরিতে (ID, Fibonacci)।
→ বড় ডেটা Lazy-ভাবে process করতে (পুরো ডেটা মেমোরিতে না রেখে)।
→ Custom Iterable সহজে তৈরিতে।
→ Async flow control-এ (async/await-এর আগে Redux-Saga এটা ব্যবহার করত)।
🔷 দ্রুত রেফারেন্স — JavaScript Loops and Iterations
কোন Loop কখন ব্যবহার করবে? Decision Guide
| পরিস্থিতি | সেরা পছন্দ | কারণ |
|---|---|---|
| কতবার চলবে আগে থেকে জানা | for | Counter স্পষ্ট, initialization ও update এক জায়গায় |
| শর্ত পূরণ না হওয়া পর্যন্ত | while | কতবার চলবে অনিশ্চিত |
| কমপক্ষে একবার চালাতেই হবে | do...while | Exit-controlled, Menu ও Validation-এ উপকারী |
| Object-এর সব Key দরকার | for...in | Enumerable property iterate করে |
| Array, Map, Set-এর মান দরকার | for...of | যেকোনো Iterable-এ কাজ করে, পরিষ্কার syntax |
| Array-এ রূপান্তর বা ফিল্টার | map / filter / reduce | Functional style, নতুন Array ফেরত দেয় |
| Infinite বা Lazy sequence | Generator (function*) | প্রয়োজন মতো মান তৈরি করে |
| Async ডেটা একটির পর একটি | for await...of | Async Iterable ও Stream handle করে |
সব Loop-এর গঠন এক নজরে Syntax Summary
| Loop | গঠন | শর্ত চেক |
|---|---|---|
| for | for (init; cond; update) { } |
আগে (Entry) |
| while | while (cond) { } |
আগে (Entry) |
| do...while | do { } while (cond); |
পরে (Exit) |
| for...in | for (const key in obj) { } |
স্বয়ংক্রিয় |
| for...of | for (const val of iterable) { } |
স্বয়ংক্রিয় |
| for await...of | for await (const val of asyncIt) { } |
স্বয়ংক্রিয় |
সাধারণ ভুল ও সমাধান Common Mistakes
| ভুল | সমস্যা | সমাধান |
|---|---|---|
for (var i...) |
var Function-scoped — async-এ bug | let ব্যবহার করো |
for...in Array-এ |
String index, prototype property | for...of বা forEach |
| Loop-এ update ভুলে যাওয়া | Infinite Loop — ব্রাউজার হ্যাং | counter সঠিকভাবে update করো |
forEach-এ break |
forEach-এ break কাজ করে না | for...of ব্যবহার করো |
| Loop-এ Mutation | চলমান Array পরিবর্তন করলে skip হয় | copy-তে iterate করো [...arr] |
for...of Plain Object-এ |
Object iterable নয় — TypeError | Object.entries() দিয়ে wrap করো |
Array-এর Iteration Methods এক নজরে Array Methods
| Method | কাজ | Return | break সম্ভব? |
|---|---|---|---|
forEach() |
প্রতিটিতে কাজ করে | undefined | ❌ না |
map() |
প্রতিটি রূপান্তর করে | নতুন Array | ❌ না |
filter() |
শর্তপূরণকারী রাখে | নতুন Array | ❌ না |
reduce() |
একটি মানে সংকুচিত | যেকোনো মান | ❌ না |
find() |
প্রথম মিল খোঁজে | মান বা undefined | ✅ স্বয়ংক্রিয় |
some() |
একটি মিললেই true | boolean | ✅ স্বয়ংক্রিয় |
every() |
সব মিললে true | boolean | ✅ স্বয়ংক্রিয় |
for...of |
যেকোনো Iterable | — | ✅ break সম্ভব |
🧠 নিজেকে যাচাই করো
1. for...of কোথায় ব্যবহার করি?
2. forEach() ও map() পার্থক্য?
3. break statement কী করে?
✏️ Task — এখন তুমি করো
skills array-টা for, for...of, forEach, map — চারটা দিয়ে iterate করো।
Portfolio-এ skills ও projects loop দিয়ে render করো।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
🔀 JavaScript Control Flow — সম্পূর্ণ নোট
এই সেকশনে JavaScript-এর সব ধরনের Control Flow — Conditional Statements, Exception Handling, Throw Statement, Try/Catch/Finally, এবং Error Objects — বাংলায় উদাহরণসহ বিস্তারিত আলোচনা করা হয়েছে।
🔷 Control Flow কী ও কেন প্রয়োজন?
Control Flow হলো প্রোগ্রামের কোন অংশ কখন ও কীভাবে চলবে তা নির্ধারণ করার পদ্ধতি। সাধারণত কোড উপর থেকে নিচে ক্রমানুসারে চলে — Control Flow Structure এই ক্রম পরিবর্তন করে।
সহজ উদাহরণ — পরীক্ষায় ৩৩ বা তার বেশি পেলে "পাস", না হলে "ফেল" — এই সিদ্ধান্তটুকু নেওয়ার জন্যই Control Flow দরকার। আর কোনো Error হলে প্রোগ্রাম বন্ধ না হয়ে সামলে নেওয়ার জন্য দরকার Exception Handling।
| ধরন | Keyword / Operator | কাজ | ES Version |
|---|---|---|---|
| Conditional | if...else |
শর্ত অনুযায়ী ভিন্ন পথ নেওয়া | ES1 |
| Multi-branch | switch...case |
একটি মানের বিরুদ্ধে একাধিক case তুলনা | ES1 |
| Ternary | ? : |
এক লাইনে if...else | ES1 |
| Logical | && || ! |
Logical শর্ত জুড়ে দেওয়া ও Short-circuit | ES1 |
| Nullish Coalescing | ?? |
null/undefined হলে fallback মান | ES2020 |
| Optional Chaining | ?. |
null/undefined হলে Error না দিয়ে undefined | ES2020 |
| Exception Handling | try...catch...finally |
Error ধরে সামলানো, প্রোগ্রাম চালু রাখা | ES3 |
| Throw Statement | throw |
নিজে Error তৈরি করে ছোড়া | ES3 |
🔷 Conditional Statements — শর্তভিত্তিক সিদ্ধান্ত
Conditional Statement হলো শর্তের ফলাফলের উপর ভিত্তি করে ভিন্ন ভিন্ন কোড চালানোর পদ্ধতি। JavaScript-এ তিন ধরনের Conditional Statement আছে।
if...else — সবচেয়ে মৌলিক Conditional if...else
switch...case — একাধিক নির্দিষ্ট মান তুলনা switch
Ternary Operator (? :) — এক লাইনের সিদ্ধান্ত
Ternary
Logical Operators ও Short-circuit Logical
→ সাধারণ শর্ত →
if...else→ ৩+ নির্দিষ্ট মান →
switch বা Object Lookup→ এক লাইনে সহজ দুটো বিকল্প → Ternary
? :→ null/undefined fallback →
?? (0 বা "" valid হলে || নয়!)
🔷 Exception Handling — পরিচিতি ও ধারণা
Exception হলো প্রোগ্রাম চলাকালে ঘটা অপ্রত্যাশিত Error বা অস্বাভাবিক পরিস্থিতি। Exception Handling হলো এই Error-কে ধরে সামলানোর পদ্ধতি — যাতে পুরো প্রোগ্রাম crash না করে সঠিকভাবে কাজ চালিয়ে যেতে পারে।
Exception কেন হয়? — কারণসমূহ কারণ
| কারণের ধরন | উদাহরণ | কে দায়ী? |
|---|---|---|
| Programming Error | null.property, undefined() |
প্রোগ্রামার |
| User Input Error | Text field-এ সংখ্যার জায়গায় অক্ষর | ব্যবহারকারী |
| Network / API Error | Server বন্ধ, Timeout, 404 Not Found | পরিবেশ |
| Resource Error | File নেই, Database সংযোগ ব্যর্থ | পরিবেশ |
| Logic Error | শূন্য দিয়ে ভাগ, Stack Overflow | প্রোগ্রামার |
Error না ধরলে কী হয়? সমস্যা
Exception Handling-এর চারটি উপাদান উপাদান
| উপাদান | কাজ | বাধ্যতামূলক? |
|---|---|---|
| try | Error হতে পারে এমন কোড রাখা হয় | ✅ হ্যাঁ |
| catch | Error ধরে সামলানো হয় | finally থাকলে না-ও হতে পারে |
| finally | Error হোক বা না হোক সবসময় চলে | ❌ ঐচ্ছিক |
| throw | নিজে Error তৈরি করে ছোড়া | ❌ ঐচ্ছিক |
🔷 Throw Statement — নিজে Error তৈরি ও ছোড়া
throw statement দিয়ে নিজে Exception তৈরি করে ছোড়া যায়।
throw চালু হলে বর্তমান function সাথে সাথে বন্ধ হয় এবং
নিকটতম catch block-এ যায়।
throw-এর গঠন ও যা throw করা যায় Syntax
throw কীভাবে কাজ করে — Flow Flow
throw-এর Practical ব্যবহার Practical
সঠিক Error Type বেছে throw করা Error Types
| throw করো | কখন? | উদাহরণ |
|---|---|---|
new Error(msg) |
সাধারণ, অশ্রেণীবদ্ধ Error | Logic ব্যর্থ হলে |
new TypeError(msg) |
ভুল type পাঠানো হলে | String-এর জায়গায় Number এলে |
new RangeError(msg) |
মান গ্রহণযোগ্য সীমার বাইরে | বয়স ঋণাত্মক হলে |
new ReferenceError(msg) |
বিরল — সাধারণত JS নিজে throw করে | অঘোষিত variable |
new SyntaxError(msg) |
Input format ভুল হলে | ভুল JSON, ভুল Date format |
| Custom Error Class | Domain-specific Error | ValidationError, NetworkError |
🔷 try...catch — Error ধরা ও সামলানো
try...catch হলো Exception Handling-এর মূল কাঠামো।
try block-এ Error হলে বাকি কোড না চালিয়ে সরাসরি
catch block-এ চলে যায় এবং Error Object পাওয়া যায়।
try...catch-এর গঠন ও প্রবাহ Syntax
Optional Catch Binding — catch-এ parameter ছাড়া ES2019
Async/Await-এ try...catch Async
try...catch শুধু
Synchronous Error ধরে। Asynchronous callback-এর Error ধরতে পারে না।
Async Error-এর জন্য async/await + try...catch
অথবা .catch() ব্যবহার করো।
🔷 finally — সবসময় চলে
finally block সবসময় চলে — try block সফল হলেও,
catch block চললেও, এমনকি return করা হলেও।
Cleanup কাজ রাখার এটাই সঠিক জায়গা।
finally-এর গঠন ও ব্যবহার Syntax
finally-তে return — সাবধানতা সাবধান
try...finally — catch ছাড়া Pattern
🔷 Error Objects — বিস্তারিত ব্যবহার
Error Object হলো Error সম্পর্কিত সব তথ্য ধারণকারী বিশেষ Object।
catch block-এ যে parameter আসে সেটাই Error Object।
এর property ব্যবহার করে debugging ও user-friendly বার্তা দেওয়া যায়।
Error Object-এর সব Property Properties
| Property | ধরন | কী দেয়? | ES |
|---|---|---|---|
| name | String | Error-এর নাম: "TypeError", "RangeError" ইত্যাদি | ES1 |
| message | String | Error-এর মানুষপাঠ্য বর্ণনা | ES1 |
| stack | String | কোন file, কোন line-এ Error হয়েছে (Stack trace) | Non-standard কিন্তু সব Browser সাপোর্ট করে |
| cause | যেকোনো | Error-এর মূল কারণ (Error chaining-এ) | ES2022 |
Built-in Error Types — বিস্তারিত Types
| Error Type | কখন হয়? | উদাহরণ Code | সমাধান |
|---|---|---|---|
| Error | সাধারণ base Error | throw new Error("msg") |
নির্দিষ্ট subtype নির্বাচন করো |
| TypeError | ভুল type-এ operation | null.property, undefined() |
type চেক করো আগে |
| ReferenceError | অঘোষিত variable | console.log(notDeclared) |
variable ঘোষণা করো |
| SyntaxError | ভুল JavaScript syntax | JSON.parse("{bad}") |
input validate করো |
| RangeError | মান সীমার বাইরে | new Array(-1), (1.2).toFixed(200) |
bound চেক করো |
| URIError | URI function-এ ভুল | decodeURIComponent("%") |
encode করার আগে validate করো |
| EvalError | eval() সংক্রান্ত |
আধুনিক JS-এ বিরল | eval() ব্যবহার করো না |
🔷 Custom Error Class — নিজের Error তৈরি
Custom Error Class তৈরি করলে নিজের domain-specific Error-কে
আলাদাভাবে চেনা যায়, অতিরিক্ত তথ্য রাখা যায় এবং
catch block-এ ভিন্নভাবে সামলানো যায়।
Custom Error Class তৈরি Class
অতিরিক্ত Property সহ Custom Error Advanced
Error Hierarchy — শ্রেণীবিন্যাস Hierarchy
Error Type দিয়ে সিদ্ধান্ত নেওয়া Real-world
🔷 Error Handling-এর সেরা অভ্যাস
Error Handling-এর সম্পূর্ণ Pattern Pattern
করো ✅ ও করো না ❌ Best Practices
| করো না ❌ | করো ✅ | কারণ |
|---|---|---|
throw "Error text" |
throw new Error("text") |
Error Object-এ stack trace পাওয়া যায় |
catch (e) {} (চুপ থাকা) |
catch (e) { log(e); } |
Silent failure সবচেয়ে বিপজ্জনক |
| সব Error এক catch-এ | instanceof দিয়ে ভাগ করো |
নির্দিষ্ট Error-এ নির্দিষ্ট সামলানো |
finally-তে return |
finally-তে শুধু cleanup | return করলে Error নীরবে হারায় |
শুধু error.message দেখানো |
error.stack log করো |
Stack trace ছাড়া debugging কঠিন |
| Async callback-এ try...catch | async/await + try...catch | Callback-এর Error ধরা যায় না |
| User-কে stack trace দেখানো | User-বান্ধব বার্তা দেখাও | Security ও UX উভয় কারণে |
Error Logging — সঠিকভাবে রেকর্ড করা Logging
🔷 দ্রুত রেফারেন্স — JavaScript Control Flow
কোন Control Flow কখন ব্যবহার করবে? Decision Guide
| পরিস্থিতি | সেরা পছন্দ | কারণ |
|---|---|---|
| দুটো পথের মধ্যে সিদ্ধান্ত | if...else | স্পষ্ট, সব ধরনের শর্ত সামলায় |
| একটি মানের বিরুদ্ধে ৩+ নির্দিষ্ট case | switch / Object Lookup | পরিষ্কার syntax, Object Lookup আরও আধুনিক |
| এক লাইনে সহজ দুটো বিকল্প | Ternary (? :) |
Template Literal ও JSX-এ উপকারী |
| null বা undefined হলে fallback | ?? |
0, false, "" রক্ষা করে — || করে না |
| Nested property নিরাপদে access | ?. |
Error না দিয়ে undefined ফেরত দেয় |
| Error সামলানো | try...catch...finally | Error ধরে প্রোগ্রাম চালু রাখে |
| নিজে Error তৈরি | throw new Error() | Validation ও Business logic enforce করতে |
| Domain-specific Error | Custom Error Class | instanceof দিয়ে নির্দিষ্টভাবে চেনা যায় |
try...catch...finally এক নজরে Summary
| Block | কখন চলে? | Error হলে? | বাধ্যতামূলক? |
|---|---|---|---|
| try | সবসময় | Error-এ বন্ধ হয়ে catch-এ যায় | ✅ হ্যাঁ |
| catch | শুধু Error হলে | Error Object পাওয়া যায় | finally থাকলে না-ও হয় |
| finally | সবসময় — Error, return যাই হোক | Error হলেও চলে, তারপর Error যায় | ❌ ঐচ্ছিক |
সাধারণ ভুল ও সমাধান Common Mistakes
| ভুল কোড | সমস্যা | সঠিক কোড |
|---|---|---|
throw "Error" |
String-এ stack trace নেই | throw new Error("Error") |
catch (e) {} |
Error নীরবে হারায় — সবচেয়ে বিপজ্জনক | catch (e) { console.error(e); } |
finally-তে return |
try/catch-এর return ও Error override | finally-তে শুধু cleanup রাখো |
count || 10 (count=0) |
0 falsy — 10 পাবে অথচ 0 valid | count ?? 10 |
user.address.city |
address null হলে TypeError | user?.address?.city |
| switch-এ break বাদ | Fall-through — পরের case-ও চলে | প্রতিটি case-এ break দাও |
🧠 নিজেকে যাচাই করো
1. if-else if-else কখন?
2. switch vs if-else কোনটা better?
3. ternary operator কী?
✏️ Task — এখন তুমি করো
Grade calculator বানাও। Score দিলে A, B, C, D, F grade বলবে।
Portfolio-এ skill level checker বানাও।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
🧮 JavaScript Expressions and Operators — সম্পূর্ণ নোট
এই সেকশনে JavaScript-এর সব ধরনের Expressions ও Operators — Assignment, Arithmetic, Comparison, Logical, Bitwise, String, Ternary, typeof, instanceof, Spread, Comma এবং আরও অনেক কিছু — বাংলায় উদাহরণসহ বিস্তারিত আলোচনা করা হয়েছে।
🔷 Expression ও Operator কী?
Expression হলো JavaScript-এর যেকোনো বৈধ কোড যা একটি মান উৎপাদন করে। Operator হলো সেই চিহ্ন যা এক বা একাধিক মানের (Operand) উপর কাজ করে নতুন মান তৈরি করে।
সহজ উদাহরণ — 5 + 3-তে + হলো Operator, 5 ও
3 হলো Operand, এবং পুরো 5 + 3 হলো একটি Expression যার মান 8।
| Operator-এর ধরন | চিহ্ন / Keyword | কাজ | ES Version |
|---|---|---|---|
| Assignment | = += -= ইত্যাদি |
Variable-এ মান রাখা | ES1 |
| Arithmetic | + - * / % ** |
গণিতের হিসাব | ES1 / ES2016 |
| Comparison | == === != > < |
দুটো মান তুলনা করে Boolean দেয় | ES1 |
| Logical | && || ! ?? |
Logical শর্ত ও Short-circuit | ES1 / ES2020 |
| Bitwise | & | ^ ~ <<
>>
|
Bit-স্তরে binary অপারেশন | ES1 |
| String | + += Template Literal |
String জোড়া লাগানো | ES1 / ES6 |
| Unary | typeof void delete ! +
-
|
একটি operand-এ কাজ করে | ES1 |
| Relational | instanceof in |
Object-এর ধরন ও property চেক | ES1 |
| Ternary | ? : |
এক লাইনে if...else | ES1 |
| Spread / Rest | ... |
Iterable ছড়ানো বা গোছানো | ES6 |
| Comma | , |
একাধিক expression evaluate করে শেষেরটা ফেরত | ES1 |
Expression বনাম Statement পার্থক্য
Operator-এর Arity — কতটি Operand নেয়? Arity
| Arity | Operand সংখ্যা | উদাহরণ |
|---|---|---|
| Unary | ১টি | -x, !true, typeof x, x++ |
| Binary | ২টি | 5 + 3, x === y, a && b |
| Ternary | ৩টি | cond ? a : b |
🔷 Assignment Operators — মান রাখার Operator
Assignment Operator বাম দিকের variable-এ ডান দিকের মান রাখে।
মূল = ছাড়াও Compound Assignment Operator আছে যা
একসাথে calculation ও assignment করে।
Simple ও Compound Assignment Operators
| Operator | উদাহরণ | সমতুল্য | ফলাফল (x=10) |
|---|---|---|---|
= |
x = 5 |
— | x = 5 |
+= |
x += 3 |
x = x + 3 |
x = 13 |
-= |
x -= 3 |
x = x - 3 |
x = 7 |
*= |
x *= 3 |
x = x * 3 |
x = 30 |
/= |
x /= 2 |
x = x / 2 |
x = 5 |
%= |
x %= 3 |
x = x % 3 |
x = 1 |
**= |
x **= 2 |
x = x ** 2 |
x = 100 |
🔷 Arithmetic Operators — গণিতের Operator
Arithmetic Operators সংখ্যার উপর গণিতের হিসাব করে।
JavaScript-এ + operator বিশেষ — String থাকলে
সংযোজনের (concatenation) কাজ করে।
মূল Arithmetic Operators Operators
| Operator | নাম | উদাহরণ | ফলাফল |
|---|---|---|---|
+ |
যোগ / String Concat | 5 + 3 / "হ্যা" + "লো" |
8 / "হ্যালো" |
- |
বিয়োগ | 10 - 4 |
6 |
* |
গুণ | 4 * 5 |
20 |
/ |
ভাগ | 15 / 4 |
3.75 |
% |
ভাগশেষ (Modulo) | 10 % 3 |
1 |
** |
ঘাত (Exponentiation) | 2 ** 10 |
1024 |
+x |
Unary Plus (Number-এ convert) | +"42" |
42 |
-x |
Unary Minus (চিহ্ন বদলায়) | -5 |
-5 |
Increment ও Decrement Operators ++ / --
Operator Precedence — অগ্রাধিকার Precedence
🔷 Comparison Operators — তুলনার Operator
Comparison Operator দুটো মান তুলনা করে সবসময়
true অথবা false ফেরত দেয়।
| Operator | নাম | উদাহরণ | ফলাফল |
|---|---|---|---|
== |
Abstract Equality (Type Coercion) | "5" == 5 |
true ⚠️ |
=== |
Strict Equality (কোনো Coercion নেই) | "5" === 5 |
false ✅ |
!= |
Abstract Inequality | "5" != 5 |
false ⚠️ |
!== |
Strict Inequality | "5" !== 5 |
true ✅ |
> |
বড় | 10 > 5 |
true |
< |
ছোট | 3 < 7 |
true |
>= |
বড় বা সমান | 5 >= 5 |
true |
<= |
ছোট বা সমান | 4 <= 5 |
true |
🔷 Logical Operators — যুক্তির Operator
Logical Operators শুধু Boolean নয় — যেকোনো মানে কাজ করে এবং Short-circuit করে। অর্থাৎ ফলাফল নিশ্চিত হলে বাকি অংশ evaluate করে না।
Logical Operators বিস্তারিত Operators
| Operator | নাম | Short-circuit | ফেরত দেয় |
|---|---|---|---|
A && B |
AND | A falsy হলে A, B evaluate হয় না | প্রথম falsy, নইলে B |
A || B |
OR | A truthy হলে A, B evaluate হয় না | প্রথম truthy, নইলে B |
!A |
NOT | — | Boolean বিপরীত |
A ?? B |
Nullish Coalescing | A null/undefined হলে B | A (null/undefined নয়), নইলে B |
🔷 Bitwise Operators — Binary Bit-স্তরের Operator
Bitwise Operator সংখ্যাকে 32-bit binary-তে রূপান্তর করে প্রতিটি bit-এর উপর সরাসরি কাজ করে। সাধারণ web dev-এ কম লাগলেও Permission System, Color Processing, Performance Optimization-এ কাজে আসে।
Bitwise Operators Operators
| Operator | নাম | উদাহরণ | Binary ব্যাখ্যা | ফলাফল |
|---|---|---|---|---|
& |
AND | 5 & 3 |
0101 & 0011 = 0001 | 1 |
| |
OR | 5 | 3 |
0101 | 0011 = 0111 | 7 |
^ |
XOR | 5 ^ 3 |
0101 ^ 0011 = 0110 | 6 |
~ |
NOT (Bitwise) | ~5 |
~00000101 = 11111010 | -6 |
<< |
Left Shift | 5 << 1 |
0101 → 1010 | 10 |
>> |
Right Shift (Sign-preserving) | 20 >> 2 |
10100 → 00101 | 5 |
>>> |
Unsigned Right Shift | -1 >>> 0 |
সব bit shift | 4294967295 |
🔷 String Operators ও Template Literals
JavaScript-এ String-এর জন্য + ও += Operator আছে।
তবে ES6-এর Template Literal অনেক বেশি শক্তিশালী ও পড়তে সহজ।
String Concatenation ও Template Literal String
Tagged Template Literal — উন্নত ব্যবহার ES6
ব্যবহারকারী বলেছেন: ${userInput}
`; console.log(html); // →ব্যবহারকারী বলেছেন: <script>alert("XSS")</script>
// CSS-in-JS (styled-components style): function css(strings, ...values) { return strings.reduce((result, str, i) => result + str + (values[i] ?? ""), ""); } const color = "blue"; const style = css`color: ${color}; font-size: 16px;`; console.log(style); // → color: blue; font-size: 16px;🔷 Unary Operators — typeof, void, delete
Unary Operator একটিমাত্র Operand নিয়ে কাজ করে।
typeof, void, delete
হলো keyword-based Unary Operator।
typeof — type জানার Operator typeof
void — undefined ফেরত দেওয়া void
delete — Object Property মুছে ফেলা delete
🔷 Relational Operators — instanceof ও in
Relational Operator দুটো মানের মধ্যে বিশেষ সম্পর্ক পরীক্ষা করে।
instanceof Object-এর type চেক করে, আর in
Object-এর property চেক করে।
instanceof — Object-এর type চেক instanceof
in — Object-এ Property আছে কিনা in
🔷 Spread (...) ও Rest Operator
... (তিনটি dot) context অনুযায়ী দুটো ভিন্ন কাজ করে।
Spread হলো ছড়ানো — Iterable-কে আলাদা উপাদানে বিভক্ত করে।
Rest হলো গোছানো — একাধিক উপাদানকে একটি Array-এ রাখে।
Spread বনাম Rest পার্থক্য পার্থক্য
| বিষয় | Spread ... |
Rest ... |
|---|---|---|
| কাজ | ছড়িয়ে দেয় (expand) | গোছায় (collect) |
| কোথায়? | Expression-এ (call, literal) | Parameter ও Destructuring-এ |
| উদাহরণ | Math.max(...arr) |
function f(...args) |
🔷 অন্যান্য গুরুত্বপূর্ণ Operators
Ternary Operator (? :)
Ternary
Optional Chaining (?.) ও Nullish Coalescing (??)
ES2020
Comma Operator (,)
Comma
Operator Precedence সম্পূর্ণ তালিকা Precedence
| Precedence | Operator | Associativity |
|---|---|---|
| 19 (সর্বোচ্চ) | () Grouping |
— |
| 18 | . [] () ?. Member Access, Call
|
বাম → ডান |
| 17 | new (argument সহ) |
— |
| 15 | ! ~ +x -x typeof
void delete await
|
ডান → বাম |
| 14 | ** |
ডান → বাম |
| 13 | * / % |
বাম → ডান |
| 12 | + - |
বাম → ডান |
| 11 | << >> >>> |
বাম → ডান |
| 10 | < <= > >=
in instanceof
|
বাম → ডান |
| 9 | == != === !== |
বাম → ডান |
| 8-6 | & ^ | |
বাম → ডান |
| 5 | && |
বাম → ডান |
| 4 | || ?? |
বাম → ডান |
| 3 | ? : Ternary |
ডান → বাম |
| 2 | = += -= ইত্যাদি Assignment |
ডান → বাম |
| 1 (সর্বনিম্ন) | , Comma |
বাম → ডান |
🔷 BigInt Operators — অনেক বড় সংখ্যার Operator
BigInt হলো ES2020-এর নতুন numeric type যা
Number.MAX_SAFE_INTEGER (253-1)-এর চেয়ে বড় যেকোনো পূর্ণসংখ্যা
সঠিকভাবে রাখতে পারে। সংখ্যার শেষে n লিখলে BigInt হয়।
BigInt তৈরি ও মূল বৈশিষ্ট্য Basics
BigInt-এ Arithmetic Operators Arithmetic
| Operator | উদাহরণ | ফলাফল | বিশেষত্ব |
|---|---|---|---|
+ |
10n + 3n |
13n |
স্বাভাবিক |
- |
10n - 3n |
7n |
স্বাভাবিক |
* |
10n * 3n |
30n |
স্বাভাবিক |
/ |
10n / 3n |
3n |
⚠️ সবসময় পূর্ণসংখ্যা (দশমিক নেই) |
% |
10n % 3n |
1n |
স্বাভাবিক |
** |
2n ** 10n |
1024n |
স্বাভাবিক |
-x |
-42n |
-42n |
চিহ্ন বদলায় |
++ / -- |
let x = 1n; x++ |
2n |
স্বাভাবিক |
+x (Unary Plus) |
+42n |
TypeError ❌ | BigInt-এ Unary + কাজ করে না |
>>> |
1n >>> 0n |
TypeError ❌ | Unsigned Shift BigInt-এ নেই |
BigInt Comparison ও Mixed Operations Comparison
BigInt-এর সীমাবদ্ধতা সীমাবদ্ধতা
| সীমাবদ্ধতা | উদাহরণ | সমাধান |
|---|---|---|
| Number-এর সাথে Arithmetic নেই | 10n + 5 → TypeError |
10n + BigInt(5) |
| দশমিক নেই | 10n / 3n → 3n |
Float দরকার হলে Number ব্যবহার করো |
| Math Object-এ কাজ করে না | Math.sqrt(9n) → TypeError |
Number() দিয়ে convert করো |
Unary + নেই |
+42n → TypeError |
Number(42n) |
| JSON-এ serialize হয় না | JSON.stringify(42n) → TypeError |
String-এ convert করো |
>>> (Unsigned Shift) নেই |
1n >>> 0n → TypeError |
>> ব্যবহার করো |
🔷 Conditional Operators — শর্তভিত্তিক মান নির্বাচন
Conditional Operator হলো শর্তের ফলাফলের উপর ভিত্তি করে মান নির্বাচন করার Operator। JavaScript-এ একাধিক Conditional Operator আছে — প্রতিটির আলাদা উদ্দেশ্য ও ব্যবহার।
Conditional Operators-এর তুলনা Comparison
| Operator | নাম | B বেছে নেয় কখন? | ফাঁদ |
|---|---|---|---|
cond ? A : B |
Ternary | cond falsy হলে | জটিল হলে পড়া কঠিন |
A || B |
Logical OR | A falsy হলে (0, "", false, null, undefined, NaN) | 0 ও "" valid হলে সমস্যা |
A ?? B |
Nullish Coalescing | A শুধু null বা undefined হলে | 0, "" ও false রক্ষা করে ✅ |
A?.B |
Optional Chaining | A null/undefined হলে undefined | Error ছাড়াই short-circuit |
A && B |
Logical AND | A truthy হলে B, A falsy হলে A | Conditional execution-এ ব্যবহার |
Ternary Operator (? :) — বিস্তারিত
Ternary
Logical OR (||) — Default মানের Operator
|| Default
Nullish Coalescing (??) — নিরাপদ Conditional Operator
ES2020
Optional Chaining (?.) — Conditional Property Access
ES2020
Logical AND (&&) — Conditional Execution
Short-circuit
Conditional Operator বেছে নেওয়ার নিয়ম Decision Guide
| পরিস্থিতি | ব্যবহার করো | কারণ |
|---|---|---|
| দুটো মানের মধ্যে সিদ্ধান্ত | condition ? a : b |
স্পষ্ট দুটো বিকল্প, Template Literal-এও কাজ করে |
| null/undefined হলে fallback | val ?? default |
0, false, "" রক্ষা পায় |
| falsy হলে fallback (0 ও "" invalid) | val || default |
সব falsy মান বাদ দেয় |
| Nested property নিরাপদে পড়া | obj?.a?.b?.c |
TypeError ছাড়াই undefined পায় |
| শর্তসাপেক্ষে কাজ করানো | cond && action() |
if ছাড়া এক লাইনে |
| null/undefined + fallback একসাথে | obj?.prop ?? "ডিফল্ট" |
?. ও ?? মিলিয়ে সবচেয়ে নিরাপদ |
| জটিল শর্ত, ৩+ বিকল্প | if...else if |
Nested ternary পড়া কঠিন |
🔷 দ্রুত রেফারেন্স — Expressions and Operators সম্পূর্ণ
কোন Operator কখন ব্যবহার করবে? Decision Guide
| পরিস্থিতি | সেরা পছন্দ | কারণ |
|---|---|---|
| মান সমান কিনা তুলনা | === |
Type-safe — সবসময় এটাই ব্যবহার করো |
| Variable-এর type জানা | typeof |
String হিসেবে type দেয় |
| Object-এর class জানা | instanceof |
Prototype chain চেক করে |
| Array কিনা চেক | Array.isArray() |
typeof [] = "object", instanceof iframe-এ সমস্যা |
| Object-এ property আছে কিনা | in বা hasOwn |
in = prototype সহ, hasOwn = নিজের শুধু |
| null/undefined হলে fallback | ?? |
0, "" রক্ষা করে |
| Nested property নিরাপদে | ?. |
TypeError ছাড়াই undefined পায় |
| Array copy/merge | Spread ... |
সহজ, immutable pattern |
| String জোড়া লাগানো | Template Literal | + Concatenation-এর চেয়ে পরিষ্কার |
| Permission/Flag check | Bitwise & | |
দ্রুত, মেমোরি সাশ্রয়ী |
সাধারণ ভুল ও সমাধান Common Mistakes
| ভুল কোড | সমস্যা | সঠিক কোড |
|---|---|---|
x == y |
Type Coercion — অপ্রত্যাশিত ফলাফল | x === y |
1 + "2" |
→ "12" (String concat!) | 1 + Number("2") বা 1 + +"2" |
typeof null === "null" |
typeof null = "object" (bug!) | val === null |
typeof [] === "array" |
typeof [] = "object" | Array.isArray([]) |
delete arr[i] |
Hole তৈরি হয়, length অপরিবর্তিত | arr.splice(i, 1) |
count || default (count=0) |
0 falsy — default পাবে | count ?? default |
"10" > "9" |
→ false (String তুলনা!) | Number("10") > Number("9") |
(-2) ** 2 লিখতে ভুলে -2 ** 2 |
SyntaxError — unary minus-এ () লাগে | (-2) ** 2 বা Math.pow(-2, 2) |
সব Operators এক নজরে Quick Reference
| ধরন | Operators |
|---|---|
| Assignment | = += -= *= /=
%= **= &&= ||=
??=
|
| Arithmetic | + - * / %
** ++ --
|
| Comparison | == === != !== >
< >= <=
|
| Logical | && || ! ?? |
| Bitwise | & | ^ ~
<< >> >>>
|
| String | + += Template Literal `` |
| Unary | typeof void delete !
+x -x ++ --
|
| Relational | instanceof in |
| Ternary | ? : |
| Optional / Nullish | ?. ?? ??= |
| Spread / Rest | ... |
| Comma | , |
| BigInt | + - * / %
** ++ -- & |
^ ~ << >> (n suffix)
|
| Conditional | ? : || ?? ?.
&&
|
🧠 নিজেকে যাচাই করো
1. ** operator কী করে?
2. && operator কখন true?
3. ?? (nullish coalescing) কী?
✏️ Task — এখন তুমি করো
Calculator বানাও — +, -, *, /, % সব operator ব্যবহার করো।
Portfolio-এ BMI calculator বানাও — operators ব্যবহার করো।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
⚙️ JavaScript Functions — সম্পূর্ণ নোট
এই সেকশনে JavaScript-এর Functions-এর সব দিক — Function Declaration, Expression, Arrow Function, Parameters, Scope, Lexical Scoping, Function Stack, Closure, Higher-Order Functions, Recursion, Built-in Functions — বাংলায় উদাহরণসহ বিস্তারিত আলোচনা করা হয়েছে।
🔷 Function কী ও কেন প্রয়োজন?
Function হলো একটি নামযুক্ত পুনর্ব্যবহারযোগ্য কোড-ব্লক। একবার লিখে যতবার খুশি ডাকা যায়। Function ছাড়া বড় প্রোগ্রাম লেখা প্রায় অসম্ভব — কারণ একই কোড বারবার লিখতে হতো।
সহজ উদাহরণ — একটি ক্লাসের ৪০ জন ছাত্রের গ্রেড বের করতে
একটি getGrade() function একবার লিখলেই হয়,
৪০ বার আলাদা করে কোড লিখতে হয় না।
| Function-এর ধরন | Syntax | বিশেষত্ব | ES Version |
|---|---|---|---|
| Function Declaration | function name() {} |
Hoisted — ঘোষণার আগেই ডাকা যায় | ES1 |
| Function Expression | const f = function() {} |
Hoisted নয় — ঘোষণার পরে ডাকতে হবে | ES1 |
| Arrow Function | const f = () => {} |
নিজস্ব this নেই, সংক্ষিপ্ত |
ES6 |
| Named Function Expression | const f = function name() {} |
Recursion ও debugging-এ সুবিধা | ES1 |
| IIFE | (function() {})() |
তাৎক্ষণিক চালু, scope দূষণ নেই | ES1 |
| Generator Function | function* name() {} |
yield দিয়ে pause/resume করা যায় | ES6 |
| Async Function | async function name() {} |
await ব্যবহার করে async কাজ সহজ | ES2017 |
🔷 Function Declaration ও Function Expression
Function Declaration Declaration
Function Expression Expression
Declaration বনাম Expression — পার্থক্য Comparison
| বিষয় | Function Declaration | Function Expression |
|---|---|---|
| Hoisting | ✅ সম্পূর্ণ Hoisted | ❌ Hoisted নয় (TDZ) |
| ঘোষণার আগে call | ✅ সম্ভব | ❌ ReferenceError |
| নাম | অবশ্যই নাম দিতে হবে | নাম ঐচ্ছিক (anonymous হতে পারে) |
| Conditional-এ | ⚠️ Strict Mode-এ সীমাবদ্ধতা | ✅ if-এর ভেতরেও define করা যায় |
| ব্যবহার | Top-level utility functions | Callback, Higher-order, Conditional |
🔷 Arrow Functions — সংক্ষিপ্ত Function Syntax
Arrow Function হলো ES6-এর সংক্ষিপ্ত function syntax।
শুধু syntax-ই ছোট নয় — নিজস্ব this নেই,
বাইরের context-এর this ব্যবহার করে। এটিই
Regular Function-এর সাথে মূল পার্থক্য।
Arrow Function-এর বিভিন্ন রূপ Syntax
Arrow Function বনাম Regular Function — this-এর পার্থক্য
this Context
Arrow ও Regular Function — কখন কোনটা? Decision Guide
| পরিস্থিতি | ব্যবহার করো | কারণ |
|---|---|---|
| Callback (map, filter, forEach) | Arrow Function | সংক্ষিপ্ত, this সমস্যা নেই |
| Event Handler-এ this দরকার | Regular Function | Arrow-এ this = outer, element পাওয়া যাবে না |
| Object Method | Regular Function (shorthand) | this = object দরকার |
| Class Method (setTimeout সহ) | Arrow Function (class field) | this bind সমস্যা এড়ায় |
| Constructor Function | Regular Function বা Class | Arrow Function constructor হয় না |
| Top-level utility function | Function Declaration | Hoisting সুবিধা, পরিষ্কার |
🔷 Parameters ও Arguments — বিস্তারিত
Parameter হলো function definition-এর placeholder নাম। Argument হলো function call-এর সময় দেওয়া আসল মান। JavaScript-এ parameter-এর চেয়ে বেশি বা কম argument দেওয়া যায় — কোনো Error হয় না।
Default Parameters — ES6 Default
Rest Parameters (...args)
Rest
Destructuring Parameters — Object ও Array Destructuring
arguments Object — পুরানো পদ্ধতি Legacy
🔷 Scope, Function Stack ও Lexical Scoping
Scope নির্ধারণ করে কোন variable বা function কোথা থেকে access করা যাবে। Lexical Scoping মানে এই Scope কোড লেখার সময় নির্ধারিত হয় — চালানোর সময় নয়। আর Function Stack হলো JavaScript Engine কোন function কোন ক্রমে চালাচ্ছে তার memory-র স্তূপ।
Scope-এর ধরন — Global, Function, Block Scope
Lexical Scoping — কোড লেখার সময়েই Scope নির্ধারিত Lexical
Scope Chain — Variable খোঁজার ক্রম Scope Chain
Function Stack (Call Stack) — Function চালানোর স্তূপ Call Stack
Call Stack-এ Recursion-এর চিত্র Visualization
Hoisting — Declaration উপরে ওঠানো Hoisting
var-এর Function-scoped ও
Hoisting আচরণ অনেক বাগের কারণ। সবসময় let ও const ব্যবহার করো।
const সর্বোচ্চ প্রাধান্য দাও — পরিবর্তন দরকার হলে let।
🔷 Closure — Lexical Scoping-এর ফল
Closure হলো Lexical Scoping-এর প্রত্যক্ষ ফল। একটি inner function তার Lexical Environment সহ return হয় — অর্থাৎ বাইরের function-এর variable মনে রাখে, এমনকি outer function Call Stack থেকে চলে যাওয়ার পরেও।
Closure কীভাবে কাজ করে How it works
Closure দিয়ে Private State Private State
Closure-এর Practical ব্যবহার Practical
Closure-এর সাধারণ ভুল — Loop-এ সাবধান
🔷 Higher-Order Functions — Function যা Function নিয়ে কাজ করে
Higher-Order Function (HOF) হলো এমন function যা অন্য function-কে argument হিসেবে নেয় অথবা function ফেরত দেয়। JavaScript-এ function হলো "First-class citizen" — variable-এ রাখা, argument হিসেবে পাঠানো, ফেরত দেওয়া সব সম্ভব।
HOF-এর মূল উদাহরণ Examples
নিজের HOF তৈরি Custom HOF
🔷 Recursion — Function যে নিজেকে ডাকে
Recursion হলো function-এর নিজেকে নিজে call করার পদ্ধতি। দুটো অংশ অবশ্যই থাকতে হবে — Base Case (থামার শর্ত) এবং Recursive Case (নিজেকে ডাকার শর্ত)।
Recursion-এর মূল উদাহরণ Examples
Recursion-এর Practical ব্যবহার — Tree Traversal Tree
Recursion বনাম Iteration এবং Tail Call Optimization
🔷 IIFE ও Special Function Patterns
IIFE — Immediately Invoked Function Expression IIFE
Pure Functions — পার্শ্বপ্রতিক্রিয়াহীন Function Pure
Currying — Multi-argument থেকে Single-argument chain Currying
🔷 Async Functions — Asynchronous Programming
Async Function হলো Asynchronous কোড লেখার সবচেয়ে
পরিষ্কার পদ্ধতি। async keyword দিয়ে তৈরি এই function
সবসময় Promise ফেরত দেয় এবং ভেতরে await
ব্যবহার করা যায়।
async/await-এর গঠন ও ব্যবহার Syntax
Sequential বনাম Parallel Execution Performance
🔷 Built-in Functions — JavaScript-এর নিজস্ব Functions
Built-in Functions হলো JavaScript Engine-এ আগে থেকেই তৈরি করা function — আলাদাভাবে define করতে হয় না, সরাসরি ব্যবহার করা যায়। এগুলো Global Functions, এবং বিভিন্ন Object-এর Methods হিসেবে পাওয়া যায়।
Global Built-in Functions Global
| Function | কাজ | উদাহরণ | ফলাফল |
|---|---|---|---|
parseInt(str, radix) |
String → পূর্ণসংখ্যা | parseInt("42px", 10) |
42 |
parseFloat(str) |
String → দশমিক সংখ্যা | parseFloat("3.14abc") |
3.14 |
isNaN(val) |
NaN কিনা (coercion সহ) | isNaN("abc") |
true ⚠️ |
Number.isNaN(val) |
NaN কিনা (coercion ছাড়া) | Number.isNaN("abc") |
false ✅ |
isFinite(val) |
Finite সংখ্যা কিনা | isFinite(Infinity) |
false |
encodeURIComponent(str) |
URL-এ নিরাপদে encode | encodeURIComponent("a b") |
"a%20b" |
decodeURIComponent(str) |
Encoded URL decode | decodeURIComponent("a%20b") |
"a b" |
String(val) |
যেকোনো মান → String | String(42) |
"42" |
Number(val) |
যেকোনো মান → Number | Number("42") |
42 |
Boolean(val) |
যেকোনো মান → Boolean | Boolean(0) |
false |
Math Object-এর Built-in Functions Math
String-এর গুরুত্বপূর্ণ Built-in Methods String
Array-এর গুরুত্বপূর্ণ Built-in Methods Array
Number ও Object-এর Built-in Methods Number / Object
Date ও JSON Built-in Functions Date / JSON
→
isNaN()-এর বদলে Number.isNaN() ব্যবহার করো — type coercion
নেই।→
parseInt()-এ সবসময় radix (10) দাও — না দিলে octal parsing হতে পারে।→ Array sort-এ
sort((a,b) => a-b) দাও — নইলে String sort হয়।→
Math.random() Cryptographically secure নয় — password-এ ব্যবহার করো না।
🔷 দ্রুত রেফারেন্স — JavaScript Functions সম্পূর্ণ
কোন ধরনের Function কখন ব্যবহার করবে? Decision Guide
| পরিস্থিতি | সেরা পছন্দ | কারণ |
|---|---|---|
| Top-level utility function | Function Declaration | Hoisting সুবিধা, পরিষ্কার |
| Callback (map, filter, event) | Arrow Function | সংক্ষিপ্ত, this সমস্যা নেই |
| Object Method | Method Shorthand | this = object, পরিষ্কার syntax |
| Constructor / Class | class keyword | পরিষ্কার OOP, Arrow constructor নেই |
| Private state রাখা | Closure | বাইরে access নেই, encapsulation |
| Infinite/Lazy sequence | Generator Function | yield দিয়ে pause/resume |
| API/Network/Async কাজ | Async Function | await, Promise সহজে সামলানো |
| একবারই চালু, scope দূষণ নেই | IIFE | initialization, module pattern |
| Nested/Tree data process | Recursion | স্বাভাবিক সমাধান |
| Function pipeline তৈরি | HOF + Currying | Reusable, composable |
Function Syntax এক নজরে Syntax Summary
| ধরন | Syntax | this | Hoisted |
|---|---|---|---|
| Declaration | function f(x) { return x; } |
Dynamic | ✅ হ্যাঁ |
| Expression | const f = function(x) { return x; } |
Dynamic | ❌ না |
| Arrow | const f = x => x * 2 |
Lexical | ❌ না |
| Method | const obj = { f(x) { return x; } } |
Dynamic | ❌ না |
| IIFE | (function() { ... })() |
Dynamic | — (তাৎক্ষণিক) |
| Generator | function* f() { yield 1; } |
Dynamic | ✅ হ্যাঁ |
| Async | async function f() { await ...; } |
Dynamic | ✅ হ্যাঁ |
| Async Arrow | const f = async () => { await ...; } |
Lexical | ❌ না |
সাধারণ ভুল ও সমাধান Common Mistakes
| ভুল | সমস্যা | সমাধান |
|---|---|---|
Arrow Function-এ Object return: x => {a: 1} |
{} body হিসেবে নেয়, Object নয় | x => ({a: 1}) |
| Event Handler-এ Arrow Function ও this | this = outer (element নয়) | Regular Function ব্যবহার করো |
| Recursion-এ Base Case ভুলে যাওয়া | Stack Overflow | Base Case অবশ্যই দাও |
| var দিয়ে Loop-এ Closure | সব closure একই i share করে | let ব্যবহার করো |
| await ছাড়া async function call | Promise Object পাবে, মান নয় | await দাও বা .then() ব্যবহার করো |
| Async-এ try...catch না দেওয়া | Unhandled Promise rejection | try...catch বা .catch() অবশ্যই |
| Sequential await (দরকার নেই) | অপ্রয়োজনীয় ধীর | Promise.all() দিয়ে Parallel করো |
🧠 নিজেকে যাচাই করো
1. Arrow function-এর বিশেষত্ব?
2. Default parameter কী?
3. Higher-order function কী?
✏️ Task — এখন তুমি করো
portfolio card render করার function বানাও। Arrow function ব্যবহার করো।
Portfolio-এ reusable functions দিয়ে card render করো।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
🌐 JavaScript DOM APIs — সম্পূর্ণ নোট
এই সেকশনে JavaScript-এর DOM (Document Object Model) — Element নির্বাচন, তৈরি, পরিবর্তন, Event Handling, DOM Traversal, এবং আধুনিক DOM APIs — বাংলায় উদাহরণসহ বিস্তারিত আলোচনা করা হয়েছে।
🔷 DOM কী ও কীভাবে কাজ করে?
DOM (Document Object Model) হলো Browser-এর HTML Document-কে JavaScript-এ ব্যবহারযোগ্য Object Tree হিসেবে উপস্থাপন। Browser HTML parse করে এই Tree তৈরি করে — JavaScript এটি পড়তে, পরিবর্তন করতে এবং নতুন উপাদান যোগ করতে পারে।
সহজ উদাহরণ — একটি Button-এ Click করলে Text পরিবর্তন হয়, নতুন List Item যোগ হয়, অথবা একটি Modal খোলে — এসবই DOM API-র মাধ্যমে সম্ভব।
| DOM-এর বিভাগ | কাজ | মূল Method/Property |
|---|---|---|
| Element Selection | HTML Element খুঁজে বের করা | querySelector, getElementById |
| Element Creation | নতুন Element তৈরি ও যোগ করা | createElement, append |
| Content Manipulation | Text ও HTML পরিবর্তন | textContent, innerHTML |
| Attribute Manipulation | Attribute পড়া ও পরিবর্তন | setAttribute, dataset |
| Style Manipulation | CSS পরিবর্তন | style, classList |
| Event Handling | User interaction সামলানো | addEventListener |
| DOM Traversal | Parent, Child, Sibling navigate | parentElement, children |
| DOM Manipulation | Element সরানো, কপি, স্থানান্তর | remove, cloneNode |
DOM Tree-এর গঠন Structure
🔷 Element Selection — Element খুঁজে বের করা
DOM-এ কাজ করতে প্রথমে Element খুঁজে বের করতে হয়।
querySelector ও querySelectorAll
CSS Selector ব্যবহার করে — এগুলোই সবচেয়ে শক্তিশালী ও আধুনিক পদ্ধতি।
Selection Methods — তুলনা Methods
| Method | কী ফেরত দেয়? | Live? | ব্যবহার |
|---|---|---|---|
querySelector(css) |
প্রথম মিলটি (Element বা null) | ❌ | ✅ সবচেয়ে বেশি ব্যবহৃত |
querySelectorAll(css) |
সব মিল (NodeList) | ❌ | ✅ একাধিক element দরকার হলে |
getElementById(id) |
একটি Element বা null | ❌ | ID দিয়ে খুঁজলে |
getElementsByClassName(cls) |
HTMLCollection (Live) | ✅ Live | ⚠️ পুরানো পদ্ধতি |
getElementsByTagName(tag) |
HTMLCollection (Live) | ✅ Live | ⚠️ পুরানো পদ্ধতি |
Live Collection বনাম Static NodeList সাবধান
🔷 Content ও Attribute Manipulation
textContent, innerHTML ও innerText Content
| Property | কী করে? | HTML Parse? | XSS ঝুঁকি? |
|---|---|---|---|
textContent |
Text পড়া ও লেখা (HTML tag বাদ) | ❌ Plain text | ✅ নিরাপদ |
innerHTML |
HTML সহ পড়া ও লেখা | ✅ HTML parse করে | ⚠️ User input-এ বিপদ |
innerText |
Rendered text (CSS-সচেতন) | ❌ Plain text | ✅ নিরাপদ |
outerHTML |
Element নিজেসহ HTML | ✅ HTML parse করে | ⚠️ সাবধান |
Attribute Manipulation Attributes
🔷 Style ও Class Manipulation
classList — Class পরিচালনা classList
Inline Style — element.style style
🔷 Element তৈরি ও DOM Manipulation
Element তৈরি ও যোগ করা Create
Element সরানো, প্রতিস্থাপন ও কপি Remove / Clone
DocumentFragment — Performance-এর জন্য Performance
🔷 DOM Traversal — Tree Navigate করা
DOM Traversal হলো একটি Element থেকে তার Parent, Child, বা Sibling Element-এ navigate করা।
Traversal Properties Properties
| Property | কী দেয়? | Text Node? |
|---|---|---|
parentElement |
সরাসরি parent Element | ❌ Element only |
children |
সব direct child Elements (HTMLCollection) | ❌ Element only |
firstElementChild |
প্রথম child Element | ❌ Element only |
lastElementChild |
শেষ child Element | ❌ Element only |
nextElementSibling |
পরের sibling Element | ❌ Element only |
previousElementSibling |
আগের sibling Element | ❌ Element only |
childNodes |
সব child Node (Text সহ) | ✅ Text Node সহ |
closest(selector) |
নিজে বা উপরে প্রথম মিলিত ancestor | ❌ Element only |
🔷 Event Handling — User Interaction সামলানো
addEventListener — Event যোগ করা addEventListener
গুরুত্বপূর্ণ Event Types Event Types
| বিভাগ | Events | বিশেষ Properties |
|---|---|---|
| Mouse | click dblclick mouseenter mouseleave
mousemove contextmenu
|
clientX/Y, button |
| Keyboard | keydown keyup keypress |
key, code, ctrlKey, shiftKey |
| Form | submit change input focus blur
reset
|
target.value |
| Window | load DOMContentLoaded resize scroll
beforeunload
|
scrollY, innerWidth |
| Drag | dragstart dragover drop dragend |
dataTransfer |
| Touch | touchstart touchmove touchend |
touches, changedTouches |
Event Object — বিস্তারিত Event Object
🔷 Event Bubbling, Capturing ও Event Delegation
Event Bubbling ও Capturing Propagation
Event Delegation — Dynamic Elements-এ সেরা পদ্ধতি Delegation
addEventListener Options — once, passive, capture Options
🔷 আধুনিক DOM APIs
Intersection Observer — Lazy Load ও Scroll Animation Intersection
MutationObserver — DOM পরিবর্তন ট্র্যাক করা Mutation
ResizeObserver ও Web Animations API Resize / Animate
🔷 দ্রুত রেফারেন্স — DOM APIs
কোন API কখন ব্যবহার করবে? Decision Guide
| পরিস্থিতি | সেরা পছন্দ | কারণ |
|---|---|---|
| একটি Element খোঁজা | querySelector(css) |
যেকোনো CSS Selector, সবচেয়ে নমনীয় |
| একাধিক Element খোঁজা | querySelectorAll(css) |
Static NodeList, forEach কাজ করে |
| User input দেখানো | textContent |
XSS নেই, HTML escape হয় |
| HTML insert করা | insertAdjacentHTML |
innerHTML-এর চেয়ে নিরাপদ position control |
| Class যোগ/সরানো | classList.toggle/add/remove |
পরিষ্কার, CSS-এ design রাখে |
| Event সামলানো | addEventListener |
Multiple listener, remove করা যায় |
| Dynamic elements-এ event | Event Delegation (parent-এ) | Memory কম, নতুন element-এও কাজ করে |
| অনেক element যোগ করা | DocumentFragment |
একবারেই DOM update — reflow কম |
| Scroll-এ animation | IntersectionObserver |
scroll event-এর চেয়ে দক্ষ |
| Element size পরিবর্তন | ResizeObserver |
resize event-এর চেয়ে সঠিক |
সাধারণ ভুল ও সমাধান Common Mistakes
| ভুল | সমস্যা | সমাধান |
|---|---|---|
innerHTML = userInput |
XSS Attack সম্ভব | textContent = userInput |
| querySelector-এ null check নেই | TypeError: Cannot read properties of null | el?.classList.add(...) বা if চেক |
| Anonymous Arrow-এ removeEventListener | Remove করা যায় না | Named function ব্যবহার করো |
| প্রতিটি dynamic element-এ listener | Memory leak, নতুন element-এ কাজ করে না | Event Delegation ব্যবহার করো |
| Loop-এ DOM insert (একটি একটি করে) | প্রতিটিতে reflow — ধীর | DocumentFragment বা innerHTML একবারে |
element.style.color CSS file-এর value পড়া |
Inline style নেই হলে "" পাবে | getComputedStyle(el).color |
DOM API এক নজরে Quick Reference
| বিভাগ | Methods / Properties |
|---|---|
| Selection | querySelector querySelectorAll getElementById
closest matches
|
| Content | textContent innerHTML innerText outerHTML
|
| Attribute | getAttribute setAttribute removeAttribute
hasAttribute dataset
|
| Class/Style | classList.add/remove/toggle/contains style
getComputedStyle
|
| Create/Insert | createElement append prepend before
after insertAdjacentHTML
|
| Remove/Clone | remove replaceWith cloneNode
createDocumentFragment
|
| Traversal | parentElement children firstElementChild
lastElementChild nextElementSibling
previousElementSibling
|
| Events | addEventListener removeEventListener dispatchEvent |
| Observers | IntersectionObserver MutationObserver ResizeObserver
|
🧠 নিজেকে যাচাই করো
1. getElementById() কী return করে?
2. innerHTML vs textContent?
3. addEventListener কী করে?
✏️ Task — এখন তুমি করো
button click করলে portfolio-এর section toggle হবে — DOM manipulation দিয়ে।
DOM manipulation দিয়ে dynamic Portfolio বানাও।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
🔒 JavaScript Strict Mode — সম্পূর্ণ নোট
এই সেকশনে JavaScript-এর Strict Mode — কী, কেন, কীভাবে চালু করতে হয়, কী কী বিধিনিষেধ আসে এবং Strict Mode-এ কোড কীভাবে নিরাপদ ও ভালো হয় — বাংলায় উদাহরণসহ বিস্তারিত আলোচনা করা হয়েছে।
🔷 Strict Mode কী ও কেন প্রয়োজন?
Strict Mode হলো JavaScript-এর একটি opt-in মোড যা কোডকে আরও কঠোর নিয়মে চালায়। এটি চালু থাকলে JavaScript Engine আরও বেশি Error ধরে, নিরাপদ নয় এমন কাজ করতে দেয় না এবং ভবিষ্যতের JavaScript-এর জন্য কিছু নাম reserve রাখে।
সহজ কথায় — Normal Mode-এ JavaScript অনেক ভুল চুপ করে এড়িয়ে যায়। Strict Mode-এ সেই ভুলগুলো সরাসরি Error throw করে।
| বিষয় | Normal Mode | Strict Mode |
|---|---|---|
| অঘোষিত variable ব্যবহার | Global variable তৈরি হয় ⚠️ | ReferenceError ✅ |
| Read-only property-তে লেখা | চুপচাপ ব্যর্থ ⚠️ | TypeError ✅ |
with statement |
কাজ করে ⚠️ | SyntaxError ✅ |
| Duplicate parameter নাম | কাজ করে ⚠️ | SyntaxError ✅ |
Function-এ this (global) |
window/global object ⚠️ | undefined ✅ |
Octal literal (0123) |
কাজ করে ⚠️ | SyntaxError ✅ |
delete variable-এ |
চুপচাপ ব্যর্থ ⚠️ | SyntaxError ✅ |
| eval/arguments-এ নতুন binding | কাজ করে ⚠️ | SyntaxError ✅ |
🔷 Strict Mode চালু করার পদ্ধতি
"use strict" হলো একটি Directive —
দেখতে String-এর মতো কিন্তু এটি JavaScript Engine-কে নির্দেশ দেয়।
তিনটি স্তরে চালু করা যায়।
Global Strict Mode — পুরো File-এ Global
Function-স্তরে Strict Mode Function
ES Module — স্বয়ংক্রিয় Strict Mode ES Module
type="module")
বা class ব্যবহার করো — এগুলো automatically Strict Mode-এ চলে।
Traditional script-এ সবসময় ফাইলের শুরুতে "use strict"; লেখো।
🔷 অঘোষিত Variable ও Global Pollution রোধ
Strict Mode-এর সবচেয়ে গুরুত্বপূর্ণ সুবিধা হলো অঘোষিত Variable ব্যবহার করতে দেয় না। Normal Mode-এ এটি চুপচাপ Global Variable তৈরি করে যা অনেক কঠিন Bug-এর কারণ।
অঘোষিত Variable — Normal vs Strict Variables
Global Pollution-এর বাস্তব উদাহরণ বিপদ
🔷 this-এর আচরণ Strict Mode-এ
Strict Mode-এ this-এর আচরণ বদলে যায়।
Normal Mode-এ standalone function call-এ this = window (browser) বা
this = global (Node.js)।
Strict Mode-এ এটি undefined হয় — অনেক accidental global access রোধ করে।
this — Normal বনাম Strict Mode this
call, apply, bind-এ Strict Mode call/apply/bind
🔷 Read-only ও Non-configurable Property-তে লেখার নিয়ম
Normal Mode-এ Read-only Property-তে লিখলে JavaScript
চুপচাপ ব্যর্থ হয় — কোনো Error নেই, মানও বদলায় না।
এই Silent Failure-ই সবচেয়ে বিপজ্জনক bug তৈরি করে।
Strict Mode-এ সঙ্গে সঙ্গে TypeError throw হয়।
Read-only Property ও Object.freeze() Read-only
Non-configurable Property delete করা delete
🔷 Duplicate Parameters ও অন্যান্য Strict Mode বিধিনিষেধ
Duplicate Parameter নাম Parameters
with Statement — সম্পূর্ণ নিষিদ্ধ with — নিষিদ্ধ
Octal Literal, eval ও Reserved Words অন্যান্য
🔷 Strict Mode ও Classes, Modules
Class — স্বয়ংক্রিয় Strict Mode Class
ES Module — স্বয়ংক্রিয় Strict Mode Module
🔷 Strict Mode কেন সবসময় ব্যবহার করবে?
Strict Mode-এর সুবিধা ও সীমাবদ্ধতা সুবিধা
| সুবিধা | ব্যাখ্যা |
|---|---|
| Bug আগে ধরা পড়ে | Silent Failure-এর বদলে সাথে সাথে Error — debugging সহজ |
| Global Pollution বন্ধ | Accidental global variable তৈরি করা যায় না |
| নিরাপদ this | Standalone function-এ this = undefined — accidental global access নেই |
| Performance উন্নত | Engine আরও ভালো optimize করতে পারে (with, eval-বিহীন) |
| Secure কোড | with statement ও eval-এর বিপজ্জনক feature বন্ধ |
| Future-proof | ভবিষ্যতের keyword protect থাকে |
| সীমাবদ্ধতা | ব্যাখ্যা |
|---|---|
| পুরানো কোডে সমস্যা | পুরানো Non-strict কোডে হঠাৎ চালু করলে Error হতে পারে |
| Third-party Library | পুরানো library Strict Mode-এ কাজ না-ও করতে পারে |
| with ব্যবহার নেই | কেউ with-এর উপর নির্ভরশীল হলে সমস্যা (তবে with ব্যবহারই ভুল) |
Strict Mode বনাম Non-strict — বাস্তব তুলনা Comparison
সঠিকভাবে Strict Mode ব্যবহার Best Practice
"use strict"; লেখো — অথবা type="module"
ব্যবহার করো। Strict Mode-এ Error হওয়া মানে বাগ সঠিক সময়ে ধরা পড়েছে।
ESLint-এ "strict": "error" rule চালু রাখো।
🔷 দ্রুত রেফারেন্স — JavaScript Strict Mode
Strict Mode-এর সব নিয়ম এক নজরে Rules
| নিয়ম | Normal Mode | Strict Mode |
|---|---|---|
| অঘোষিত variable | Global variable তৈরি ⚠️ | ReferenceError ✅ |
| Read-only property লেখা | Silent failure ⚠️ | TypeError ✅ |
| Non-configurable delete | Silent failure (false) ⚠️ | TypeError ✅ |
| Duplicate parameter | কাজ করে ⚠️ | SyntaxError ✅ |
| Octal literal (0123) | 83 ⚠️ | SyntaxError ✅ |
with statement |
কাজ করে ⚠️ | SyntaxError ✅ |
Standalone function this |
window/global ⚠️ | undefined ✅ |
call(null)-এ this |
window/global ⚠️ | null ✅ |
| eval-এ নতুন variable | বাইরে দৃশ্যমান ⚠️ | eval-এর ভেতরে সীমাবদ্ধ ✅ |
| Variable delete | Silent failure ⚠️ | SyntaxError ✅ |
| Reserved words (let, yield ইত্যাদি) | variable নামে ব্যবহার করা যায় ⚠️ | SyntaxError ✅ |
| arguments ও parameter linking | arguments[0] বদলালে parameter বদলায় ⚠️ | Linked নয় ✅ |
কোথায় Strict Mode স্বয়ংক্রিয়? Auto Strict
| Context | Strict Mode? | "use strict" লাগবে? |
|---|---|---|
type="module" script |
✅ সবসময় | ❌ লাগবে না |
class body |
✅ সবসময় | ❌ লাগবে না |
ES Module (import/export) |
✅ সবসময় | ❌ লাগবে না |
Traditional <script> tag |
❌ Default Non-strict | ✅ লিখতে হবে |
Node.js CommonJS (.js) |
❌ Default Non-strict | ✅ লিখতে হবে |
Node.js ESM (.mjs) |
✅ সবসময় | ❌ লাগবে না |
সাধারণ ভুল ও সমাধান Common Mistakes
| ভুল | সমস্যা | সমাধান |
|---|---|---|
| File-এর মাঝে "use strict" | কাজ করে না — String Expression হিসেবে নেয় | একদম প্রথম লাইনে দাও |
| Strict ও Non-strict file concatenate | Strict file-এর directive হারিয়ে যেতে পারে | সব file-এ "use strict" দাও বা ES Module ব্যবহার করো |
| Strict Mode-এ this ব্যবহার ভুল | Standalone function-এ this = undefined → TypeError | Arrow Function বা bind() ব্যবহার করো |
| Octal escape (\123) | String-এ Octal escape Strict-এ নিষিদ্ধ | \u0053 (Unicode) বা \x53 (Hex) ব্যবহার করো |
🧠 নিজেকে যাচাই করো
1. 'use strict' কী করে?
2. Strict mode-এ undeclared variable?
3. Strict mode কোথায় লেখে?
✏️ Task — এখন তুমি করো
'use strict' যোগ করো। undeclared variable use করে error দেখো।
Strict mode ব্যবহার করে safe JavaScript লেখো।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
🎯 JavaScript — Using (this) Keyword সম্পূর্ণ নোট
এই সেকশনে JavaScript-এর this keyword-এর সব দিক — In a Method, In a Function,
Using it Alone, In Event Handlers, In Arrow Functions, Function Borrowing, এবং Explicit Binding
(call/apply/bind) — বাংলায় উদাহরণসহ বিস্তারিত আলোচনা করা হয়েছে।
🔷 this কী ও কেন বিভ্রান্তিকর?
this হলো JavaScript-এর একটি বিশেষ keyword যা
বর্তমান Execution Context-কে নির্দেশ করে।
অন্য অনেক ভাষায় this সবসময় নির্দিষ্ট — কিন্তু JavaScript-এ
this-এর মান নির্ধারিত হয় function কীভাবে call করা হয়েছে
তার উপর, define করার সময় নয়।
একমাত্র ব্যতিক্রম — Arrow Function।
Arrow Function-এ this define করার সময়ের context মনে রাখে (Lexical)।
| Context | this-এর মান |
Strict Mode-এ? | উদাহরণ |
|---|---|---|---|
| Global Scope | window (browser) / global (Node.js) |
একই | Script-এর উপরে |
| Regular Function (standalone) | window / global |
undefined |
fn() |
| Method Call | যে Object-এ method আছে | একই | obj.method() |
| Arrow Function | Lexical — বাইরের context | একই | () => {} |
Constructor (new) |
নতুন তৈরি Object | একই | new Fn() |
call() / apply() |
প্রথম argument-এ দেওয়া Object | একই | fn.call(obj) |
bind() |
Permanently bind করা Object | একই | fn.bind(obj) |
| Event Handler | Event-এর target element | একই | el.addEventListener |
| Class Method | Class-এর Instance | সবসময় Strict | class Foo {} |
this নির্ধারণের সহজ নিয়ম নিয়ম
🔷 this — In a Function ও Using it Alone
Using it Alone — Global Scope-এ this Using it Alone
In a Function — Regular Function-এ this In a Function
🔷 this — In a Method
Method Call-এ this হলো যে Object-এর মাধ্যমে
method call করা হয়েছে। এটি JavaScript-এ this-এর সবচেয়ে
স্বাভাবিক ব্যবহার।
this In a Method — মূল ব্যবহার In a Method
Method Detachment — this হারানো বিপদ
🔷 this — In Arrow Functions
Arrow Function-এ নিজস্ব this নেই।
এটি define করার সময়ের বাইরের scope-এর this ব্যবহার করে।
call(), apply(), বা bind() দিয়েও
Arrow Function-এর this বদলানো যায় না।
this In Arrow Functions — Lexical this In Arrow Functions
Lexical this-এর Practical ব্যবহার Practical
Arrow বনাম Regular — কখন কোনটা? Decision Guide
| পরিস্থিতি | ব্যবহার করো | কারণ |
|---|---|---|
| Object Literal Method | Regular Function | this = object দরকার |
| Callback (map, filter, forEach) | Arrow Function | Outer this ব্যবহার করা দরকার |
| setTimeout / setInterval Callback | Arrow Function | Outer this maintain করতে |
| Event Handler (this = element দরকার) | Regular Function | Arrow-এ this = element নয়, outer |
| Class Method | Regular Method (shorthand) | this = instance দরকার |
| Class Method যা Callback হবে | Arrow Class Field | bind করতে হবে না |
| Constructor | Regular Function বা Class | Arrow Constructor নেই |
🔷 Function Borrowing — অন্য Object-এর Method ধার নেওয়া
Function Borrowing হলো একটি Object-এর method অন্য Object
ব্যবহার করার কৌশল। call() বা apply() দিয়ে
this পরিবর্তন করে যেকোনো Object-এ যেকোনো function চালানো যায়।
এতে একই method বারবার লিখতে হয় না।
Function Borrowing-এর মূল ধারণা Concept
Built-in Method Borrowing — Array ও Object থেকে Built-in Borrow
Practical Function Borrowing Practical
→ Array method-গুলো Array-like object (arguments, NodeList)-এ ব্যবহার করতে।
→ একই utility function অনেক object-এ share করতে (Inheritance ছাড়া)।
→
Object.prototype.toString.call() দিয়ে exact type চেক করতে।→ ES6-এর পরে অনেক ক্ষেত্রে Spread (
[...args]) বা
Array.from() দিয়ে সহজ করা যায়।
🔷 Explicit Binding — call, apply, bind
Explicit Binding দিয়ে নিজে বলে দেওয়া যায় কোন Object-কে
this হিসেবে ব্যবহার করতে হবে।
তিনটি পদ্ধতি: call(), apply(), bind()।
call, apply ও bind — তুলনা Comparison
| Method | Call হয় কখন? | Arguments | ফেরত দেয় |
|---|---|---|---|
| call() | তাৎক্ষণিক | আলাদা আলাদা: call(obj, a, b) |
Function-এর return মান |
| apply() | তাৎক্ষণিক | Array-এ: apply(obj, [a, b]) |
Function-এর return মান |
| bind() | পরে (নতুন function) | আলাদা আলাদা: bind(obj, a) |
Bound function (নতুন) |
call() — তাৎক্ষণিক call, this নির্দিষ্ট করে call
apply() — Array argument দিয়ে call apply
bind() — Permanently this বাঁধা নতুন Function bind
🔷 Constructor ও Class-এ this
Constructor Function-এ this Constructor
Class-এ this — Instance, Method ও Arrow Field Class
🔷 this — In Event Handlers
Event Handler-এ this-এর আচরণ function-এর ধরনের উপর নির্ভর করে।
Regular Function-এ this = element, Arrow Function-এ this = outer context।
this In Event Handlers — Regular vs Arrow In Event Handlers
Event Delegation-এ this ও event.target Delegation
🔷 this-এর Common Pitfalls ও সমাধান
সব Common Pitfalls ও সমাধান Pitfalls
🔷 দ্রুত রেফারেন্স — Using (this) Keyword
this-এর মান — সব Context-এ Quick Reference
| Call Pattern | this (Non-strict) | this (Strict) | উদাহরণ |
|---|---|---|---|
| Global scope | window |
window |
Script-এর উপরে |
| Standalone function call | window |
undefined |
fn() |
| Method call | Calling object | Calling object | obj.fn() |
| new call | নতুন instance | নতুন instance | new Fn() |
call(obj) |
obj |
obj |
fn.call(obj) |
apply(obj) |
obj |
obj |
fn.apply(obj, []) |
bind(obj)() |
obj |
obj |
fn.bind(obj)() |
| Arrow function | Lexical (outer) | Lexical (outer) | () => {} |
| Regular event handler | event.currentTarget | event.currentTarget | el.addEventListener("click", fn) |
| Arrow event handler | Outer context | Outer context | el.addEventListener("click", () => {}) |
| Class method | Instance | Instance (Auto Strict) | class Foo { method() {} } |
সাধারণ ভুল ও সমাধান Common Mistakes
| ভুল | সমস্যা | সমাধান |
|---|---|---|
const fn = obj.method; fn(); |
this হারায় — window বা undefined | obj.method.bind(obj) বা Arrow wrapper |
| forEach-এ Regular Function | Callback-এ this = window | Arrow Function ব্যবহার করো |
| setTimeout-এ Regular Function | this = window | Arrow বা bind(this) |
| Object Literal-এ Arrow Method | this = window (outer) | Regular Method (shorthand) |
| Class Method-কে Callback হিসেবে | this = undefined (Strict) | Constructor-এ bind বা Arrow Field |
| Arrow-এ call/bind দিয়ে this বদলানো | কাজ করে না — Lexical this fixed | Regular Function ব্যবহার করো |
| Nested Function-এ this | Inner function-এ this = window | Arrow বা const self = this |
| Array-like object-এ Array method সরাসরি | forEach/map নেই — TypeError | Array.prototype.forEach.call(obj) — Function Borrowing |
Roadmap.sh-এর সব Topic এক নজরে Topics Summary
| Topic | this-এর মান | সেকশন |
|---|---|---|
| Using it Alone | window (Non-strict) / window (Strict) |
অংশ ২ |
| In a Function | window (Non-strict) / undefined (Strict) |
অংশ ২ |
| In a Method | Calling Object | অংশ ৩ |
| In Arrow Functions | Lexical — বাইরের this | অংশ ৪ |
| Function Borrowing | call/apply দিয়ে নির্দিষ্ট Object | অংশ ৫ |
| Explicit Binding — call | প্রথম argument-এর Object | অংশ ৬ |
| Explicit Binding — apply | প্রথম argument-এর Object | অংশ ৬ |
| Explicit Binding — bind | Permanently bound Object | অংশ ৬ |
| In Event Handlers (Regular) | event.currentTarget (Element) | অংশ ৮ |
| In Event Handlers (Arrow) | Outer Context (Element নয়) | অংশ ৮ |
call, apply, bind — এক নজরে Explicit Binding
| পদ্ধতি | Syntax | তাৎক্ষণিক? | কখন ব্যবহার |
|---|---|---|---|
| call() | fn.call(obj, a, b) |
✅ হ্যাঁ | এক্ষুনি call, argument কম হলে |
| apply() | fn.apply(obj, [a, b]) |
✅ হ্যাঁ | এক্ষুনি call, argument Array-এ আছে |
| bind() | const f = fn.bind(obj) |
❌ পরে call | Event Handler, Callback, Partial Application |
🧠 নিজেকে যাচাই করো
1. this কী?
2. Arrow function-এ this?
3. Method-এ this কী?
✏️ Task — এখন তুমি করো
portfolio object বানাও যেখানে this দিয়ে নিজের property access করে।
this keyword দিয়ে Portfolio object বানাও।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
⏳ Asynchronous JavaScript — সম্পূর্ণ নোট
এই সেকশনে JavaScript-এর Asynchronous Programming-এর সব দিক — Event Loop, setTimeout, setInterval, Callbacks, Callback Hell, Promises, এবং async/await — বাংলায় উদাহরণসহ বিস্তারিত আলোচনা করা হয়েছে।
🔷 Synchronous vs Asynchronous — মূল ধারণা
JavaScript Single-threaded — একসাথে মাত্র একটি কাজ করতে পারে। কিন্তু Asynchronous programming-এর মাধ্যমে দীর্ঘ কাজ (Network request, Timer, File read) background-এ পাঠিয়ে দিয়ে বাকি কোড চালিয়ে যাওয়া যায়।
| বিষয় | Synchronous | Asynchronous |
|---|---|---|
| Execution | একটার পর একটা, ক্রমানুসারে | শুরু করে, শেষের অপেক্ষা না করে পরেরটায় যায় |
| Blocking | ✅ Blocking — আগেরটা শেষ না হলে পরেরটা আটকে থাকে | ❌ Non-blocking — পরেরটা চলতে থাকে |
| উদাহরণ | Math calculation, Array loop | fetch(), setTimeout(), File read |
| UI-তে প্রভাব | ⚠️ Long task হলে UI freeze হয় | ✅ UI responsive থাকে |
🔷 Event Loop — JavaScript-এর হৃদয়
Event Loop হলো JavaScript-এর Asynchronous programming-এর মূল প্রক্রিয়া। এটি Call Stack, Web APIs, এবং Task Queues-কে সমন্বয় করে।
Event Loop-এর উপাদান Components
| উপাদান | কাজ | উদাহরণ |
|---|---|---|
| Call Stack | চলমান function-গুলো LIFO stack-এ রাখে | সব synchronous code |
| Web APIs | Browser/Node background-এ async কাজ করে | setTimeout, fetch, addEventListener |
| Microtask Queue | Promise callback, queueMicrotask — সর্বোচ্চ priority | .then(), .catch(), await |
| Callback Queue (Macro) | Timer callback, Event callback — কম priority | setTimeout, setInterval, DOM events |
| Event Loop | Call Stack খালি হলে Queue থেকে callback নেয় | Microtask আগে, তারপর Macro |
Event Loop কীভাবে কাজ করে How it works
Microtask vs Macrotask — Priority Priority
setTimeout(fn, 0) মানে "এখনই নয়, পরের Macrotask চক্রে"।
🔷 setTimeout ও setInterval
setTimeout — দেরিতে একবার চালানো setTimeout
setInterval — বারবার চালানো setInterval
setTimeout বনাম setInterval — কখন কোনটা? Comparison
| বিষয় | setTimeout | setInterval |
|---|---|---|
| চলে কতবার? | একবার | বারবার |
| Timing | নির্দিষ্ট delay পরে | প্রতিটি interval পরে |
| Overlap ঝুঁকি | ❌ নেই (Nested হলে) | ⚠️ আছে (callback দেরি হলে) |
| বন্ধ করা | clearTimeout(id) |
clearInterval(id) |
| সেরা ব্যবহার | একবার delayed action, Nested polling | Simple repeating task (Clock) |
🔷 Callbacks — Async-এর প্রথম সমাধান
Callback হলো এমন একটি function যা অন্য function-এ argument হিসেবে পাঠানো হয় এবং পরে call করা হয়। Async programming-এর প্রথম সমাধান ছিল Callback।
Callback-এর মূল ধারণা Concept
Error-first Callback Pattern — Node.js Style Error-first
🔷 Callback Hell — Pyramid of Doom
Callback Hell (বা "Pyramid of Doom") হলো যখন একাধিক async কাজ ক্রমানুসারে করতে হয় — প্রতিটি callback-এর ভেতরে আরেকটি callback, এভাবে নেস্টেড হতে থাকে এবং কোড পিরামিডের মতো দেখায়।
Callback Hell-এর উদাহরণ সমস্যা
Callback Hell-এর আংশিক সমাধান — Named Functions সমাধান
🔷 Promises — Callback Hell-এর সমাধান
Promise হলো async কাজের ভবিষ্যৎ ফলাফলের প্রতিশ্রুতি।
তিনটি অবস্থায় থাকে — pending (অপেক্ষায়),
fulfilled (সফল), rejected (ব্যর্থ)।
Promise তৈরি ও ব্যবহার Create & Use
Promise-এর Static Methods Static Methods
Promise Chaining-এর সঠিক উপায় Chaining
🔷 async/await — Async কোডের সবচেয়ে পরিষ্কার রূপ
async/await হলো Promise-এর উপর তৈরি syntactic sugar যা Async code-কে Synchronous-এর মতো দেখায় — পড়তে সহজ, লিখতে সহজ।
async/await-এর গঠন ও মূল ব্যবহার Syntax
Sequential vs Parallel — Await-এর পার্থক্য Performance
Top-level await ও আধুনিক Pattern Modern
async/await বনাম Promise — কখন কোনটা? Comparison
| বিষয় | Promise Chain | async/await |
|---|---|---|
| পড়তে সহজ? | একাধিক .then()-এ কঠিন | ✅ Synchronous-এর মতো |
| Error Handling | .catch() |
try/catch — পরিচিত |
| Debugging | Stack trace কঠিন | ✅ সহজ, line number সঠিক |
| Parallel | Promise.all() ✅ |
await Promise.all() ✅ |
| কোথায় ব্যবহার | Simple chain, Utility function | Complex async flow, তুলনামূলক ভালো |
🔷 দ্রুত রেফারেন্স — Asynchronous JavaScript
কোন Async পদ্ধতি কখন ব্যবহার করবে? Decision Guide
| পরিস্থিতি | সেরা পছন্দ | কারণ |
|---|---|---|
| নির্দিষ্ট সময় পরে একবার | setTimeout | Delayed single execution |
| বারবার নির্দিষ্ট সময়ে | setInterval / Nested setTimeout | Repeating tasks |
| Browser Event (click, scroll) | Callback (addEventListener) | DOM Events সবসময় Callback |
| একটি Async কাজ | async/await | পরিষ্কার, try/catch সহজ |
| একাধিক Async কাজ — সব দরকার | Promise.all() | সব সফল হলেই এগোবে, parallel |
| একাধিক — কিছু fail হলেও চলবে | Promise.allSettled() | সব result পাওয়া যায় |
| প্রথম সফলটা দরকার | Promise.any() | Fallback server ইত্যাদিতে |
| Timeout with fetch | Promise.race() | প্রথম যে resolve করবে |
| Async data stream | for await...of | Async Iterable iterate করতে |
Async Programming-এর বিবর্তন Evolution
| পদ্ধতি | ES Version | সুবিধা | সমস্যা |
|---|---|---|---|
| Callback | ES1 | সহজ, DOM Events-এ দরকার | Callback Hell, Error handling কঠিন |
| Promise | ES6 | Chain করা যায়, .catch() সহজ | verbose, Nested হলে পড়া কঠিন |
| async/await | ES2017 | পরিষ্কার, try/catch, debug সহজ | Sequential await হলে ধীর |
সাধারণ ভুল ও সমাধান Common Mistakes
| ভুল | সমস্যা | সমাধান |
|---|---|---|
| await ছাড়া async function call | Promise object পাবে, মান নয় | const data = await myFn() |
| Sequential await (দরকার নেই) | অপ্রয়োজনীয় ধীর | await Promise.all([...]) |
| async-এ try/catch নেই | Unhandled Promise rejection | try/catch বা .catch() অবশ্যই |
| forEach-এ await | forEach async-aware নয় | for...of loop বা Promise.all |
| Promise-এ return ভুলে যাওয়া | Chain ভেঙে যায় | .then()-এ সবসময় return করো |
| setInterval-এ async callback | Overlap হতে পারে | Nested setTimeout ব্যবহার করো |
🧠 নিজেকে যাচাই করো
1. async/await কী?
2. await কোথায় ব্যবহার করা যায়?
3. Promise.all() কী করে?
✏️ Task — এখন তুমি করো
fetch() দিয়ে https://jsonplaceholder.typicode.com/users থেকে data আনো।
Portfolio-এ async/await দিয়ে data fetch করো।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
🌍 Working with APIs — সম্পূর্ণ নোট
এই সেকশনে JavaScript-এ API-র সাথে কাজ করার সব পদ্ধতি — XMLHttpRequest, Fetch API, Headers, Request/Response, Error Handling, এবং Real-world Patterns — বাংলায় উদাহরণসহ বিস্তারিত আলোচনা করা হয়েছে।
🔷 API কী ও HTTP-এর মূল ধারণা
API (Application Programming Interface) হলো দুটো সফটওয়্যার যোগাযোগ করার নিয়মকানুন। Web-এ HTTP API দিয়ে Browser বা App Server-এর কাছ থেকে ডেটা নেয় বা পাঠায়।
HTTP Methods ও Status Codes HTTP
| Method | কাজ | Body আছে? | উদাহরণ |
|---|---|---|---|
| GET | ডেটা আনা | ❌ না | ব্যবহারকারীর তালিকা দেখা |
| POST | নতুন ডেটা তৈরি | ✅ হ্যাঁ | নতুন ব্যবহারকারী তৈরি |
| PUT | পুরো রিসোর্স আপডেট | ✅ হ্যাঁ | পুরো profile বদলানো |
| PATCH | আংশিক আপডেট | ✅ হ্যাঁ | শুধু নাম বদলানো |
| DELETE | ডেটা মুছে ফেলা | ❌ সাধারণত না | ব্যবহারকারী মুছে ফেলা |
| Status Code | অর্থ | কখন আসে? |
|---|---|---|
| 200 OK | সফল | GET, PUT, PATCH সফল হলে |
| 201 Created | তৈরি সফল | POST সফল হলে |
| 204 No Content | সফল, কিন্তু body নেই | DELETE সফল হলে |
| 400 Bad Request | ভুল request | Invalid data পাঠালে |
| 401 Unauthorized | লগইন দরকার | Token নেই বা expired |
| 403 Forbidden | অনুমতি নেই | লগইন আছে কিন্তু permission নেই |
| 404 Not Found | পাওয়া যায়নি | Resource নেই |
| 500 Internal Server Error | Server-এ সমস্যা | Server crash বা bug |
🔷 XMLHttpRequest — পুরানো পদ্ধতি
XMLHttpRequest (XHR) হলো Browser-এ HTTP request করার
আদি পদ্ধতি। AJAX-এর মূল ভিত্তি। আধুনিক কোডে fetch()
ব্যবহার করা উচিত, কিন্তু পুরানো codebase বোঝার জন্য XHR জানা দরকার।
XMLHttpRequest-এর মূল ব্যবহার Basic Usage
XHR দিয়ে POST Request POST
XHR readyState ও Events readyState
| readyState | Constant | অর্থ |
|---|---|---|
| 0 | UNSENT |
open() call হয়নি |
| 1 | OPENED |
open() call হয়েছে |
| 2 | HEADERS_RECEIVED |
Response header এসেছে |
| 3 | LOADING |
Response body আসছে |
| 4 | DONE |
সম্পন্ন |
upload.onprogress), পুরানো Browser সাপোর্ট, পুরানো codebase।
অন্য সব ক্ষেত্রে fetch() ব্যবহার করো।
🔷 Fetch API — আধুনিক HTTP Request
Fetch API হলো Browser-এ HTTP request করার আধুনিক ও
সহজ পদ্ধতি। Promise-based হওয়ায় async/await দিয়ে
পরিষ্কারভাবে লেখা যায়।
Fetch-এর মূল ব্যবহার — GET GET
Fetch দিয়ে POST, PUT, PATCH, DELETE POST/PUT/DELETE
Response Object — বিস্তারিত Response
🔷 Headers ও Request Object
Headers Object — তৈরি ও ব্যবহার Headers
Request Object — Reusable Request Request
🔷 Error Handling ও Edge Cases
fetch()-এর সবচেয়ে বিভ্রান্তিকর দিক হলো —
HTTP 4xx বা 5xx error আসলেও Promise reject হয় না।
শুধু Network failure-এ reject হয়। তাই response.ok
চেক করা অবশ্যই দরকার।
Fetch-এ সঠিক Error Handling Error Handling
Timeout ও AbortController — Request বাতিল করা Abort
🔷 Reusable API Client — বাস্তব প্রজেক্ট Pattern
বাস্তব প্রজেক্টে প্রতিটি component-এ আলাদাভাবে fetch()
না লিখে একটি Reusable API Client তৈরি করা ভালো অভ্যাস।
API Client Class API Client
URLSearchParams — Query String তৈরি URLSearchParams
🔷 CORS, Authentication ও Best Practices
CORS — Cross-Origin Resource Sharing CORS
Authentication Patterns — JWT ও API Key Auth
API-র Best Practices Best Practices
🔷 দ্রুত রেফারেন্স — Working with APIs
XMLHttpRequest বনাম Fetch API XHR vs Fetch
| বিষয় | XMLHttpRequest | Fetch API |
|---|---|---|
| API ধরন | Event-based, Callback | Promise-based ✅ |
| Syntax | verbose, জটিল | পরিষ্কার ✅ |
| async/await | ❌ সরাসরি নেই | ✅ পুরোপুরি |
| Progress Tracking | ✅ upload.onprogress | ⚠️ Streams API দরকার |
| Request Abort | ✅ xhr.abort() | ✅ AbortController |
| Browser Support | সব browser | Modern browser ✅ |
| কখন ব্যবহার করবে | File upload progress, পুরানো codebase | সব ক্ষেত্রে ✅ |
সাধারণ ভুল ও সমাধান Common Mistakes
| ভুল | সমস্যা | সমাধান |
|---|---|---|
fetch(url)-এ response.ok চেক নেই |
404/500-এও সফল মনে হয় | if (!response.ok) throw new Error(...) |
| Body দুবার পড়া | TypeError: body used already | response.clone() ব্যবহার করো |
| POST-এ Content-Type নেই | Server JSON parse করতে পারে না | headers: {"Content-Type": "application/json"} |
| FormData-এ Content-Type দেওয়া | Boundary missing — server parse করতে পারে না | FormData-এ Content-Type দেবে না — browser নিজে দেবে |
| Timeout implement নেই | Request অনন্তকাল ঝুলতে পারে | AbortController + setTimeout |
| Token localStorage-এ (XSS ঝুঁকি) | Script injection করলে token চুরি | HttpOnly Cookie ব্যবহার করো |
Production-ready Fetch চেকলিস্ট Checklist
| চেকলিস্ট | কেন দরকার? |
|---|---|
✅ response.ok চেক করা |
HTTP 4xx/5xx সামলাতে |
| ✅ try/catch দিয়ে Network error সামলানো | Offline বা DNS failure |
| ✅ AbortController দিয়ে Timeout | Slow network-এ infinite wait এড়াতে |
| ✅ Loading state দেখানো | User experience উন্নত করতে |
| ✅ Error message user-কে দেখানো | Silent failure এড়াতে |
| ✅ Sensitive data log না করা | Security |
| ✅ API URL environment variable-এ | Dev/Prod পরিবর্তন সহজ |
🧠 নিজেকে যাচাই করো
1. fetch() কী return করে?
2. response.json() কী করে?
3. HTTP status 404 মানে?
✏️ Task — এখন তুমি করো
GitHub API থেকে user info আনো: https://api.github.com/users/octocat
Portfolio-এ Weather API দিয়ে আবহাওয়া দেখাও।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
🏛️ JavaScript Classes — সম্পূর্ণ নোট
এই সেকশনে JavaScript-এর Classes-এর সব দিক — Class Declaration, Constructor, Methods, Inheritance, Static, Private Fields, Getter/Setter, এবং Mixins — বাংলায় উদাহরণসহ বিস্তারিত আলোচনা করা হয়েছে।
🔷 Class কী ও Prototype-এর সম্পর্ক
JavaScript-এ Class হলো ES6-এর Syntactic Sugar —
আসলে ভেতরে Prototype-ভিত্তিক Inheritance-ই কাজ করছে।
typeof MyClass === "function" — Class আসলে একটি বিশেষ function।
| বিষয় | Constructor Function (পুরানো) | Class (আধুনিক) |
|---|---|---|
| Syntax | verbose, ছড়ানো | ✅ পরিষ্কার, এক জায়গায় |
| Hoisting | ✅ Hoisted | ❌ TDZ-এ (আগে ব্যবহার নয়) |
| Strict Mode | Manual | ✅ স্বয়ংক্রিয় |
| Inheritance | জটিল prototype chain | ✅ extends সহজ |
| Private Field | Convention (#_) বা Closure | ✅ Native #field |
🔷 Class Declaration ও Constructor
Class Declaration ও Class Expression Declaration
🔷 Methods, Getter ও Setter
Instance Methods ও Method Chaining Methods
Getter ও Setter get / set
Static Methods ও Static Properties static
🔷 Private Fields ও Methods — #
🔷 Inheritance — extends ও super
extends ও super-এর মূল ব্যবহার extends / super
Multi-level Inheritance ও Method Override Multi-level
Abstract Class Pattern ও Mixin Abstract / Mixin
🔷 দ্রুত রেফারেন্স — Classes
Class Syntax এক নজরে Syntax
| Feature | Syntax | কাজ |
|---|---|---|
| Class Declaration | class Foo {} |
Class তৈরি |
| Constructor | constructor(args) {} |
Instance তৈরির সময় চলে |
| Instance Method | methodName() {} |
সব instance-এ পাওয়া যায় |
| Static Method | static methodName() {} |
Class-এ সরাসরি, instance-এ নয় |
| Getter | get propName() {} |
Property-র মতো পড়া |
| Setter | set propName(val) {} |
Property-র মতো লেখা (validation) |
| Private Field | #fieldName |
Class-এর বাইরে access নেই |
| Private Method | #methodName() {} |
Class-এর বাইরে call নেই |
| Inheritance | class B extends A {} |
A-র সব feature নেওয়া |
| Super Constructor | super(args) |
Parent constructor call |
| Super Method | super.method() |
Parent-এর method call |
| Abstract Check | if (new.target === Base) |
Direct instantiate রোধ |
সাধারণ ভুল ও সমাধান Common Mistakes
| ভুল | সমস্যা | সমাধান |
|---|---|---|
| extends-এ super() না দেওয়া | ReferenceError: Must call super before this | constructor-এর প্রথম লাইনে super() দাও |
| class-এর আগে ব্যবহার | ReferenceError (TDZ) | class declaration-এর পরে ব্যবহার করো |
| Method-এ Arrow Function — this | Arrow Class Field হিসেবে না দিলে this হারাতে পারে | Callback-এ bind() বা Arrow Class Field |
| #field ঘোষণা না করে ব্যবহার | SyntaxError | class body-তে আগে declare করো |
🧠 নিজেকে যাচাই করো
1. constructor() কী করে?
2. extends কী করে?
3. super() কী করে?
✏️ Task — এখন তুমি করো
Project class বানাও। Portfolio class বানাও যেটা Project-এর array রাখে।
Class দিয়ে Portfolio management system বানাও।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
🔄 Iterators and Generators — সম্পূর্ণ নোট
এই সেকশনে JavaScript-এর Iterators ও Generators — Iteration Protocol, Custom Iterator, Generator Function, yield, Generator-এর ব্যবহারিক প্রয়োগ — বাংলায় উদাহরণসহ বিস্তারিত আলোচনা করা হয়েছে।
🔷 Iteration Protocol — Iterable ও Iterator
Iteration Protocol হলো JavaScript-এর নিয়মকানুন যা
নির্ধারণ করে কোন Object-কে for...of, Spread (...),
Destructuring দিয়ে iterate করা যাবে।
| Protocol | প্রয়োজনীয় | ফেরত দেয় | কোথায় ব্যবহার হয় |
|---|---|---|---|
| Iterable | [Symbol.iterator]() method |
Iterator object | for...of, Spread, Destructuring |
| Iterator | next() method |
{ value, done } |
একের পর এক মান দেওয়া |
| Async Iterable | [Symbol.asyncIterator]() |
Promise<{value, done}> | for await...of |
🔷 Custom Iterator তৈরি
নিজের Iterable Object Custom Iterable
Iterator-এ নিজে Iterator হওয়া — Self-referential Self-referential
🔷 Generators — function* ও yield
Generator Function (function*) হলো এমন function
যা মাঝপথে থামতে (yield) এবং আবার শুরু হতে (next()) পারে।
এটি স্বয়ংক্রিয়ভাবে Iterator Protocol implement করে।
Generator Function-এর মূল ধারণা Basics
yield* — অন্য Generator-কে Delegate করা yield*
next()-এ মান পাঠানো — দুমুখী যোগাযোগ Two-way
🔷 Generator-এর Practical ব্যবহার
Infinite Sequence ও Lazy Evaluation Infinite / Lazy
Async Generator — for await...of Async Generator
Iterator Helpers — ES2025 ES2025
🔷 দ্রুত রেফারেন্স — Iterators and Generators
Iterator vs Generator তুলনা Comparison
| বিষয় | Custom Iterator | Generator |
|---|---|---|
| Boilerplate | বেশি — next(), return ম্যানুয়াল | ✅ কম — yield করলেই হয় |
| State Management | নিজে সামলাতে হয় | ✅ স্বয়ংক্রিয় (pause/resume) |
| Infinite Sequence | সম্ভব | ✅ সহজ |
| Two-way Communication | ❌ | ✅ next(value) |
| Error Handling | জটিল | ✅ throw() |
| Async Support | Manual | ✅ async function* |
কখন কী ব্যবহার করবে Decision Guide
| পরিস্থিতি | ব্যবহার করো |
|---|---|
| Custom data structure iterate করতে | Custom Iterable ([Symbol.iterator]) |
| Infinite sequence (ID, Fibonacci) | Generator (function*) |
| Lazy data processing pipeline | Generator chain (map, filter, take) |
| Async stream / API pagination | Async Generator (async function*) |
| Nested array flatten | Recursive Generator + yield* |
| Simple Array loop | for...of বা forEach (Generator দরকার নেই) |
🧠 নিজেকে যাচাই করো
1. Generator function কীভাবে define করে?
2. yield কী করে?
3. next() method কী return করে?
✏️ Task — এখন তুমি করো
Generator function বানাও যেটা fibonacci sequence generate করে।
Iterator দিয়ে portfolio skills traverse করো।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
📦 Modules in JavaScript — সম্পূর্ণ নোট
এই সেকশনে JavaScript-এর Module System — CommonJS (require/module.exports), ES Modules (import/export), Dynamic Import, এবং Module-এর best practices — বাংলায় উদাহরণসহ বিস্তারিত আলোচনা করা হয়েছে।
🔷 Module কী ও কেন দরকার?
Module হলো JavaScript কোড ভাগ করার পদ্ধতি। প্রতিটি Module file নিজের scope-এ চলে — global scope দূষণ ছাড়াই code reuse ও maintainability নিশ্চিত করে।
| বিষয় | CommonJS | ES Module (ESM) |
|---|---|---|
| Syntax | require() / module.exports |
import / export |
| Loading | Synchronous — runtime-এ | Asynchronous — parse-time-এ (static) |
| Environment | Node.js (.js) | Browser + Node.js (.mjs বা type:"module") |
| Strict Mode | Manual | ✅ স্বয়ংক্রিয় |
| Tree Shaking | ❌ কঠিন | ✅ Static analysis সম্ভব |
| Dynamic Import | runtime require() | import() function |
🔷 CommonJS — Node.js-এর Module System
module.exports ও require() CommonJS
require()-এর বৈশিষ্ট্য Features
🔷 ES Modules (ESM) — আধুনিক Module System
Named Export ও Import Named
Default Export ও Import Default
Re-export ও Module Aggregation Re-export
🔷 Dynamic Import — import()
Dynamic Import (import()) হলো runtime-এ
module load করার পদ্ধতি। Promise ফেরত দেয় — await দিয়ে ব্যবহার করা যায়।
Code Splitting ও Lazy Loading-এর মূল হাতিয়ার।
🔷 দ্রুত রেফারেন্স — Modules
Export ও Import Syntax এক নজরে Syntax
| কাজ | CommonJS | ES Module |
|---|---|---|
| Named export | exports.fn = fn |
export function fn() {} |
| Default export | module.exports = fn |
export default fn |
| Named import | const {fn} = require("...") |
import { fn } from "..." |
| Default import | const fn = require("...") |
import fn from "..." |
| All import | const m = require("...") |
import * as m from "..." |
| Dynamic import | const m = require(variable) |
const m = await import(variable) |
| Re-export | require + exports | export { fn } from "..." |
সাধারণ ভুল ও সমাধান Common Mistakes
| ভুল | সমস্যা | সমাধান |
|---|---|---|
| ESM-এ .js extension বাদ | Browser-এ import fail | import "./math.js" — extension দাও |
exports = {...} |
Reference হারায়, কাজ করে না | module.exports = {...} |
| CommonJS-এ top-level await | SyntaxError | ESM (.mjs) বা async IIFE ব্যবহার করো |
| Circular Dependency | Partial/undefined export পাওয়া | Dependency graph পরিষ্কার রাখো |
| Browser-এ type="module" নেই | import/export SyntaxError | <script type="module"> দাও |
🧠 নিজেকে যাচাই করো
1. export কী করে?
2. import কী করে?
3. default export কতটা থাকতে পারে?
✏️ Task — এখন তুমি করো
portfolio.js ফাইলে data রাখো ও export করো। index.js-এ import করো।
Module pattern দিয়ে Portfolio code organize করো।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
🧠 Memory Management — সম্পূর্ণ নোট
এই সেকশনে JavaScript-এর Memory Management — Memory Lifecycle, Garbage Collection অ্যালগরিদম, Memory Leak-এর কারণ ও প্রতিকার — বাংলায় উদাহরণসহ বিস্তারিত আলোচনা করা হয়েছে।
🔷 Memory Lifecycle — মেমোরির জীবনচক্র
JavaScript-এ Memory তিনটি ধাপে কাজ করে — Allocate (মেমোরি নেওয়া), Use (ব্যবহার করা), এবং Release (মুক্ত করা)। JavaScript Engine স্বয়ংক্রিয়ভাবে মেমোরি manage করে — Garbage Collector-এর মাধ্যমে।
| ধাপ | কখন হয়? | উদাহরণ |
|---|---|---|
| ১. Allocation | Variable declare, Object/Array/Function তৈরি | const x = 42, new Array(1000) |
| ২. Use | Variable পড়া ও লেখা | x + 1, arr.push() |
| ৩. Release | Garbage Collector — reference শূন্য হলে | Scope শেষ, = null |
Stack ও Heap — দুই ধরনের মেমোরি Stack / Heap
🔷 Garbage Collection — স্বয়ংক্রিয় মেমোরি মুক্তি
Garbage Collector (GC) হলো JavaScript Engine-এর অংশ যা
স্বয়ংক্রিয়ভাবে অব্যবহৃত Object-এর মেমোরি মুক্ত করে।
প্রোগ্রামারকে নিজে free() call করতে হয় না।
Reference Counting — পুরানো অ্যালগরিদম Reference Counting
Mark-and-Sweep — আধুনিক অ্যালগরিদম Mark-and-Sweep
WeakRef ও FinalizationRegistry — ES2021 ES2021
🔷 Memory Leak — কারণ ও সমাধান
Memory Leak হলো এমন মেমোরি যা আর ব্যবহার হচ্ছে না, কিন্তু Reference-এর কারণে GC collect করতে পারছে না। ধীরে ধীরে Memory বাড়তে থাকে — App ধীর বা Crash করে।
Leak ১ — Accidental Global Variable Global Variable
Leak ২ — Event Listener Remove না করা Event Listener
Leak ৩ — Closure-এ অপ্রয়োজনীয় Reference Closure
Leak ৪ — Timer ও Cache-এ Reference Timer / Cache
🔷 দ্রুত রেফারেন্স — Memory Management
Memory Leak-এর কারণ ও সমাধান এক নজরে Summary
| কারণ | উদাহরণ | সমাধান |
|---|---|---|
| Accidental Global | data = [] (var ছাড়া) |
Strict Mode, let/const সবসময় |
| Event Listener না সরানো | removeEventListener কখনো call হয় না | Named function, once:true, AbortController |
| Closure-এ বড় object | Closure unnecessary reference ধরছে | শুধু দরকারী অংশ extract করো |
| setInterval বন্ধ না করা | clearInterval কখনো call হয় না | Cleanup function-এ clearInterval |
| Unbounded Cache | Map/Object-এ entry কখনো সরে না | LRU Cache, WeakMap, TTL সেট করো |
| DOM Reference — সরানো Element | Detached DOM tree memory-তে থাকে | Variable null করো, WeakRef ব্যবহার করো |
মেমোরি দক্ষ কোড লেখার নিয়ম Best Practices
| নিয়ম | কারণ |
|---|---|
সবসময় let/const ব্যবহার করো |
Accidental Global এড়ানো |
| Event Listener সবসময় cleanup করো | Detached element-এর Listener থেকে যায় |
বড় object আর দরকার না হলে = null |
Reference কেটে GC-কে সাহায্য করো |
| Cache-এ সীমা রাখো (LRU বা TTL) | Unbounded growth এড়ানো |
| Object key-এর Cache-এ WeakMap ব্যবহার করো | Key GC হলে Value-ও মুক্ত |
| Generator দিয়ে Lazy data processing | পুরো data মেমোরিতে না রেখে একটু একটু |
| Chrome DevTools-এ মেমোরি profile করো | Leak সনাক্ত করতে |
🧠 নিজেকে যাচাই করো
1. Garbage collection কী?
2. Memory leak কী?
3. WeakRef কেন?
✏️ Task — এখন তুমি করো
DevTools-এর Memory tab-এ portfolio-এর heap snapshot দেখো।
Memory management বুঝে efficient Portfolio বানাও।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
🛠️ Using Browser DevTools — সম্পূর্ণ নোট
এই সেকশনে Chrome DevTools-এর সব গুরুত্বপূর্ণ দিক — Debugging Issues, Debugging Memory Leaks, এবং Debugging Performance — বাংলায় উদাহরণসহ বিস্তারিত আলোচনা করা হয়েছে।
🔷 Browser DevTools পরিচিতি
Browser DevTools হলো Browser-এর built-in development tool যা JavaScript debug করা, Performance analyze করা এবং Memory Leak খোঁজার জন্য ব্যবহার করা হয়। Chrome DevTools সবচেয়ে শক্তিশালী ও প্রচলিত।
| Panel | কাজ | Shortcut |
|---|---|---|
| Elements | DOM ও CSS inspect ও edit | Ctrl+Shift+C |
| Console | Log দেখা, JavaScript execute | Ctrl+Shift+J |
| Sources | JavaScript debug, Breakpoint | Ctrl+Shift+I → Sources |
| Network | HTTP request, response, timing | Ctrl+Shift+I → Network |
| Performance | Rendering, scripting, paint — FPS | Ctrl+Shift+I → Performance |
| Memory | Heap snapshot, Memory Leak | Ctrl+Shift+I → Memory |
| Application | localStorage, Cookie, Cache | Ctrl+Shift+I → Application |
| Lighthouse | Performance, SEO, Accessibility audit | Ctrl+Shift+I → Lighthouse |
🔷 Debugging Issues — Console ও Sources Panel
Console-এর সব Method Console
Sources Panel — Breakpoint ও Debugger Breakpoints
Network Panel — API Debug করা Network
🔷 Debugging Memory Leaks — Memory Panel
Heap Snapshot — Memory Leak খোঁজা Heap Snapshot
Allocation Timeline — Real-time Memory Timeline
🔷 Debugging Performance — Performance Panel
Performance Panel — Recording ও Analysis Performance
Rendering Performance — Layout Thrashing রোধ Rendering
Performance API — Code-এ Timing মাপা Performance API
🔷 দ্রুত রেফারেন্স — Browser DevTools
Debugging Workflow Workflow
| সমস্যা | Panel | পদ্ধতি |
|---|---|---|
| JavaScript Error | Console | Error message পড়ো, Stack trace অনুসরণ করো |
| Logic Bug | Sources | Breakpoint, Step through, Watch variable |
| API সমস্যা | Network | Request/Response headers, Status code, Body দেখো |
| Memory Leak | Memory | Heap Snapshot নাও, Compare করো, Detached DOM খোঁজো |
| Page ধীর | Performance | Record করো, Long Task খোঁজো, Flame Chart দেখো |
| Layout Jank | Performance + Rendering | FPS meter, Layout Shift, Paint Flashing |
| localStorage/Cookie | Application | Storage দেখো, edit করো, clear করো |
দরকারী Keyboard Shortcuts Shortcuts
| Shortcut | কাজ |
|---|---|
F12 বা Ctrl+Shift+I |
DevTools খোলা/বন্ধ |
Ctrl+Shift+J |
Console খোলা |
Ctrl+Shift+C |
Element Inspector |
Ctrl+P (Sources-এ) |
File খোঁজা |
Ctrl+G (Sources-এ) |
Line number-এ যাও |
F8 |
Resume (Breakpoint থেকে) |
F10 |
Step over |
F11 |
Step into |
Shift+F11 |
Step out |
Ctrl+L |
Console clear |
Esc |
Console drawer toggle |
🧠 নিজেকে যাচাই করো
1. Console tab কী কাজে?
2. Network tab কী দেখায়?
3. Breakpoint কী?
✏️ Task — এখন তুমি করো
DevTools-এ portfolio-এর CSS live edit করো। Network-এ request দেখো।
DevTools দিয়ে Portfolio debug করতে শেখো।
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!
📖 JavaScript Quick Reference — সম্পূর্ণ JS রেফারেন্স
JavaScript-এর সব গুরুত্বপূর্ণ Concept, Method, ব্যবহার এবং সংক্ষিপ্ত উদাহরণ — এক জায়গায়।
🔷 Data Types ও Variable — ডেটা টাইপ ও ভেরিয়েবল
| Keyword / Type | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
var |
Function-scoped variable (পুরনো) | Hoisting সহ — এড়িয়ে চলা ভালো | var name = "Farid"; |
let |
Block-scoped পরিবর্তনযোগ্য variable | Loop counter, reassignable value | let count = 0; |
const |
Block-scoped পরিবর্তনঅযোগ্য binding | Object, Array, fixed value-এ | const PI = 3.14159; |
Number |
সংখ্যা টাইপ — integer ও float | গণনা, মূল্য, পরিমাপ | let price = 99.5; |
String |
লেখার ডেটা টাইপ | নাম, বার্তা, URL | let msg = "হ্যালো!"; |
Boolean |
সত্য বা মিথ্যা মান | Condition, Flag, Toggle | let isActive = true; |
null |
ইচ্ছাকৃতভাবে কোনো মান নেই | খালি / অনুপস্থিত মান বোঝাতে | let data = null; |
undefined |
মান দেওয়া হয়নি | Uninitialized variable | let x; // undefined |
Symbol |
অনন্য ও অপরিবর্তনীয় Primitive | Object key, Unique identifier | const id = Symbol("id"); |
BigInt |
অনেক বড় Integer — n দিয়ে শেষ | Number এর সীমার বাইরে বড় সংখ্যা | const big = 9007199254740993n; |
Object |
Key-value pair-এর সংগ্রহ | ডেটা মডেল, Configuration | let user = { name: "Farid" }; |
Array |
তালিকা আকারের ডেটা | List, Collection, Queue | let nums = [1, 2, 3]; |
typeof |
Variable-এর টাইপ জানার Operator | Type Checking | typeof "hello" // "string" |
instanceof |
নির্দিষ্ট Class-এর instance কিনা | Type guard, Class check | [] instanceof Array // true |
| Template Literal | Backtick-এ string interpolation | Dynamic string তৈরি | `হ্যালো, ${name}!` |
Number() |
মান কে Number-এ রূপান্তর | String → Number | Number("3.14") // 3.14 |
String() |
মান কে String-এ রূপান্তর | Number → String | String(100) // "100" |
Boolean() |
মান কে Boolean-এ রূপান্তর | Falsy / Truthy check | Boolean(0) // false |
parseInt() |
String থেকে Integer বের করা | Form input, URL param | parseInt("42px") // 42 |
parseFloat() |
String থেকে Float বের করা | Price, Measurement | parseFloat("3.14kg") // 3.14 |
🔷 Operators — অপারেটর
| Operator | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
+ - * / % |
গাণিতিক অপারেটর | যোগ, বিয়োগ, গুণ, ভাগ, ভাগশেষ | 10 % 3 // 1 |
** |
Exponentiation — ঘাত | শক্তির হিসাব | 2 ** 10 // 1024 |
++ -- |
Increment / Decrement | Loop counter বাড়ানো / কমানো | let i = 0; i++; // 1 |
= += -= *= /= |
Assignment ও Compound Assignment | মান সংরক্ষণ ও আপডেট | x += 5; |
== != |
Loose Equality — টাইপ নির্বিশেষে | এড়িয়ে চলা ভালো — === ব্যবহার করুন | "5" == 5 // true |
=== !== |
Strict Equality — মান ও টাইপ উভয় | সব Comparison-এ এটি ব্যবহার করুন | "5" === 5 // false |
< > <= >= |
তুলনামূলক অপারেটর | Sorting, Condition | age >= 18 |
&& |
Logical AND — উভয় সত্য হলে | Multiple condition | isLoggedIn && isAdmin |
|| |
Logical OR — যেকোনো একটি সত্য হলে | Default value, Fallback | name || "Anonymous" |
! |
Logical NOT — উল্টো Boolean | Boolean flip | !isActive |
?? |
Nullish Coalescing — null / undefined হলে | || এর নিরাপদ বিকল্প | user.name ?? "Guest" |
?. |
Optional Chaining — নিরাপদ property access | Nested object-এ error এড়ানো | user?.address?.city |
? : |
Ternary Operator — এক লাইনে if-else | Short conditional expression | age >= 18 ? "Adult" : "Minor" |
??= ||= &&= |
Logical Assignment Operators | Conditional assignment shorthand | a ??= "default"; |
in |
Object-এ property আছে কিনা | Property existence check | "name" in user // true |
delete |
Object-এর property মুছে ফেলা | Dynamic property removal | delete user.age; |
spread ... |
Array / Object ছড়িয়ে দেওয়া | Clone, Merge, Pass args | [...arr1, ...arr2] |
typeof |
টাইপ জানার Operator | Runtime type check | typeof null // "object" |
void |
Expression evaluate করে undefined ফেরায় | Anchor href-এ JS call | void 0 // undefined |
🔷 Control Flow — নিয়ন্ত্রণ প্রবাহ
| Statement | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
if / else if / else |
শর্তভিত্তিক কোড চালানো | সবচেয়ে সাধারণ Branching | if (x > 0) { } else { } |
switch / case / default |
একাধিক নির্দিষ্ট মানে Branching | Menu, State Machine | switch(color) { case "red": break; } |
for |
নির্দিষ্ট সংখ্যকবার Loop | Index-ভিত্তিক Iteration | for (let i = 0; i < 5; i++) { } |
while |
শর্ত সত্য থাকলে Loop | অজানা সংখ্যক Iteration | while (queue.length > 0) { } |
do...while |
একবার চালিয়ে তারপর শর্ত চেক | অন্তত একবার চালানো দরকার | do { attempt(); } while (!done); |
for...of |
Iterable-এর প্রতিটি মান | Array, String, Set-এ Loop | for (const item of items) { } |
for...in |
Object-এর প্রতিটি key | Object Property-তে Loop | for (const key in obj) { } |
break |
Loop বা Switch থেকে বের হওয়া | Early exit | if (found) break; |
continue |
বর্তমান Iteration বাদ দিয়ে পরেরটিতে | Skip করা | if (x % 2 === 0) continue; |
return |
Function থেকে মান ফেরানো ও থামানো | সব ধরনের Function | return result; |
throw |
ইচ্ছাকৃতভাবে Error ছুঁড়ে দেওয়া | Validation, Custom Error | throw new Error("Invalid input"); |
try / catch / finally |
Error ধরা ও সামলানো | API call, JSON parse | try { } catch(e) { } finally { } |
| Labeled Statement | Named Loop — break/continue করতে | Nested Loop থেকে বের হওয়া | outer: for(...) { break outer; } |
🔷 Function — ফাংশন
| Concept | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
| Function Declaration | নামসহ Function সংজ্ঞায়ন — hoisted | Utility, reusable function | function greet(name) { return `হ্যালো ${name}`; } |
| Function Expression | Variable-এ Function সংরক্ষণ | Callback, Conditional define | const add = function(a, b) { return a + b; }; |
| Arrow Function | সংক্ষিপ্ত Function syntax — নিজস্ব this নেই |
Callback, Array method | const double = x => x * 2; |
| Default Parameter | Argument না দিলে ডিফল্ট মান | Optional argument | function greet(name = "বন্ধু") { } |
| Rest Parameter | বাকি সব Argument Array হিসেবে | Variable arguments | function sum(...nums) { return nums.reduce((a,b) => a+b, 0); } |
| IIFE | তাৎক্ষণিক Function কল | Scope isolate, Module pattern | (function() { })(); |
| Closure | Function তার outer scope মনে রাখে | Private state, Factory function | function counter() { let n=0; return ()=>++n; } |
| Higher-Order Function | Function নেয় বা ফেরায় এমন Function | map, filter, reduce, compose | const apply = (fn, x) => fn(x); |
| Callback | অন্য Function-কে argument হিসেবে দেওয়া | Event handler, Async | arr.forEach(item => console.log(item)); |
| Recursion | Function নিজেকে নিজে ডাকে | Tree traversal, Factorial | function fact(n) { return n <= 1 ? 1 : n * fact(n-1); } |
call() |
নির্দিষ্ট this দিয়ে Function call |
this binding override | greet.call(obj, "Farid"); |
apply() |
Array argument দিয়ে Function call | Math.max-এ Array pass | Math.max.apply(null, nums); |
bind() |
নির্দিষ্ট this বাঁধা নতুন Function |
Event listener-এ this ঠিক রাখা | const bound = greet.bind(obj); |
| Currying | Multi-arg function-কে একের পর এক call | Partial application, Composition | const add = a => b => a + b; |
| Generator Function | function* — pause ও resume করা যায় |
Lazy evaluation, Iterator | function* gen() { yield 1; yield 2; } |
🔷 Array Methods — অ্যারে পদ্ধতি
| Method | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
.push() |
শেষে element যোগ করা | Stack, Queue তৈরিতে | arr.push(4); |
.pop() |
শেষ element বের করা | Stack থেকে বের করা | arr.pop(); |
.shift() |
প্রথম element বের করা | Queue থেকে বের করা | arr.shift(); |
.unshift() |
শুরুতে element যোগ করা | Priority insert | arr.unshift(0); |
.splice() |
নির্দিষ্ট index-এ যোগ / বাদ দেওয়া | List থেকে item মুছতে বা ঢোকাতে | arr.splice(1, 1, "x"); |
.slice() |
Array-র অংশ নেওয়া — মূল পরিবর্তন হয় না | Pagination, Subarray | arr.slice(1, 3); |
.concat() |
দুটি Array জুড়ে নতুন Array | Array merge | arr1.concat(arr2); |
.indexOf() |
প্রথম মিলের index বের করা | Element খোঁজা | arr.indexOf("a"); // 0 |
.includes() |
মান আছে কিনা — Boolean | Membership check | arr.includes(3); // true |
.find() |
শর্ত মেটা প্রথম element | Object Array-তে search | arr.find(x => x.id === 5); |
.findIndex() |
শর্ত মেটা প্রথম element-এর index | Position জানতে | arr.findIndex(x => x > 10); |
.filter() |
শর্ত মেটা সব element নিয়ে নতুন Array | Search, Category filter | arr.filter(x => x > 0); |
.map() |
প্রতিটি element রূপান্তর করে নতুন Array | Data transform, Render list | arr.map(x => x * 2); |
.reduce() |
সব element দিয়ে একটি মান বের করা | Sum, Group, Flatten | arr.reduce((acc, x) => acc + x, 0); |
.forEach() |
প্রতিটি element-এ Function চালানো | Side effect — DOM update | arr.forEach(item => console.log(item)); |
.some() |
যেকোনো একটি element শর্ত মেটায় কিনা | hasAdult, hasError | arr.some(x => x < 0); |
.every() |
সব element শর্ত মেটায় কিনা | Validation, allValid | arr.every(x => x > 0); |
.flat() |
Nested Array সমতল করা | 2D → 1D array | [[1,2],[3]].flat(); // [1,2,3] |
.flatMap() |
map + flat একসাথে | Transform ও flatten | arr.flatMap(x => [x, x*2]); |
.sort() |
Array সাজানো — মূল Array পরিবর্তন হয় | Alphabetical, Numeric sort | arr.sort((a,b) => a - b); |
.reverse() |
Array উল্টানো | Descending order | arr.reverse(); |
.join() |
Array → String রূপান্তর | CSV, Path তৈরি | arr.join(", "); |
.fill() |
নির্দিষ্ট মান দিয়ে পূরণ করা | Array initialize | new Array(5).fill(0); |
.at() |
index দিয়ে element নেওয়া — negative সমর্থিত | শেষ element: arr.at(-1) | arr.at(-1); |
Array.from() |
Iterable বা Array-like → Array | NodeList, Set → Array | Array.from("abc"); // ["a","b","c"] |
Array.isArray() |
Array কিনা চেক | Type guard | Array.isArray([]); // true |
.toSorted() |
নতুন Sorted Array — মূল অপরিবর্তিত | Immutable sort | arr.toSorted((a,b) => a-b); |
.toReversed() |
নতুন Reversed Array — মূল অপরিবর্তিত | Immutable reverse | arr.toReversed(); |
.with() |
নির্দিষ্ট index-এ মান বদলে নতুন Array | Immutable update | arr.with(2, 99); |
🔷 Object Methods — অবজেক্ট পদ্ধতি
| Method / Concept | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
Object.keys() |
Object-এর সব key-এর Array | Property list করা | Object.keys(user); // ["name","age"] |
Object.values() |
Object-এর সব value-এর Array | Value-এ iterate করা | Object.values(user); |
Object.entries() |
[key, value] pair-এর Array | Map করা, transform করা | Object.entries(user); |
Object.assign() |
Object merge বা clone করা | Shallow copy, Config merge | Object.assign({}, defaults, opts); |
Object.freeze() |
Object পরিবর্তন রোধ করা | Immutable config, Constant | Object.freeze(config); |
Object.seal() |
নতুন property যোগ রোধ — মান পরিবর্তন সম্ভব | Shape নির্দিষ্ট রাখা | Object.seal(user); |
Object.create() |
নির্দিষ্ট Prototype থেকে Object তৈরি | Prototype chain তৈরি | Object.create(proto); |
Object.fromEntries() |
[key, value] Array → Object | Map → Object, entries reverse | Object.fromEntries([["a",1]]); |
Object.hasOwn() |
নিজস্ব property আছে কিনা | hasOwnProperty-র আধুনিক বিকল্প | Object.hasOwn(obj, "name"); |
Object.defineProperty() |
Property-র Descriptor সহ সংজ্ঞায়ন | Getter / Setter, Non-enumerable | Object.defineProperty(obj, "x", { get() { } }); |
| Getter / Setter | Property-র মতো কাজ করে Function | Computed property, Validation | get fullName() { return `${this.first} ${this.last}`; } |
| Shorthand Property | Variable নাম = Key হলে সংক্ষিপ্ত | Object literal | const obj = { name, age }; |
| Computed Property | Dynamic key দিয়ে Object তৈরি | Dynamic key name | const obj = { [key]: "মান" }; |
| Spread in Object | Object ছড়িয়ে merge বা clone | Immutable update pattern | const updated = { ...user, age: 25 }; |
structuredClone() |
Deep clone করা — built-in | Nested object copy | const clone = structuredClone(original); |
🔷 String Methods — স্ট্রিং পদ্ধতি
| Method | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
.length |
String-এর দৈর্ঘ্য | Validation, Counter | "hello".length; // 5 |
.toUpperCase() |
সব বড় হাতে রূপান্তর | Header, Label | "hello".toUpperCase(); // "HELLO" |
.toLowerCase() |
সব ছোট হাতে রূপান্তর | Case-insensitive compare | "HELLO".toLowerCase(); |
.trim() |
উভয় পাশের whitespace সরানো | Form input clean করা | " hi ".trim(); // "hi" |
.trimStart() / .trimEnd() |
শুরু বা শেষের whitespace সরানো | One-sided trim | " hi".trimStart(); |
.includes() |
Substring আছে কিনা | Search check | "hello world".includes("world"); |
.startsWith() |
নির্দিষ্ট string দিয়ে শুরু কিনা | Protocol check, Prefix | "https://".startsWith("https"); |
.endsWith() |
নির্দিষ্ট string দিয়ে শেষ কিনা | Extension check | "file.js".endsWith(".js"); |
.indexOf() |
Substring-এর প্রথম index | Position খোঁজা | "hello".indexOf("l"); // 2 |
.slice() |
নির্দিষ্ট অংশ বের করা | Substring, Truncate | "hello".slice(1, 3); // "el" |
.at() |
index দিয়ে character — negative সমর্থিত | শেষ character: str.at(-1) | "hello".at(-1); // "o" |
.replace() |
প্রথম মিল পরিবর্তন করা | Text substitution | "hi hi".replace("hi","হ্যালো"); |
.replaceAll() |
সব মিল পরিবর্তন করা | Global replacement | "a a a".replaceAll("a","b"); |
.split() |
String → Array ভাগ করা | CSV parse, Word split | "a,b,c".split(","); // ["a","b","c"] |
.repeat() |
String নির্দিষ্টবার পুনরাবৃত্তি | Separator, Pattern | "ha".repeat(3); // "hahaha" |
.padStart() |
শুরুতে character যোগ করে দৈর্ঘ্য পূরণ | Number formatting: "007" | "5".padStart(3, "0"); // "005" |
.padEnd() |
শেষে character যোগ করে দৈর্ঘ্য পূরণ | Table column align | "hi".padEnd(5, "."); |
.match() |
RegExp match বের করা | Pattern search | "abc123".match(/\d+/); // ["123"] |
.search() |
RegExp-এর প্রথম match-এর index | Pattern position খোঁজা | "hello123".search(/\d/); |
String.fromCharCode() |
Unicode code থেকে Character তৈরি | Encoding, ASCII char | String.fromCharCode(65); // "A" |
🔷 Number ও Math — সংখ্যা ও গণিত
| Method / Property | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
Number.isInteger() |
Integer কিনা চেক | Validation | Number.isInteger(4.0); // true |
Number.isFinite() |
Finite সংখ্যা কিনা | Infinity রোধ করতে | Number.isFinite(Infinity); // false |
Number.isNaN() |
NaN কিনা — strict check | NaN check | Number.isNaN(NaN); // true |
.toFixed() |
দশমিক স্থান নির্দিষ্ট করে String | Price format | (3.14159).toFixed(2); // "3.14" |
.toString(radix) |
নির্দিষ্ট base-এ String | Binary, Hex convert | (255).toString(16); // "ff" |
Number.MAX_SAFE_INTEGER |
নিরাপদ সর্বোচ্চ Integer | Large number check | Number.MAX_SAFE_INTEGER; // 2^53-1 |
Math.round() |
নিকটতম Integer-এ গোলাকার | Rating, Score round | Math.round(4.5); // 5 |
Math.floor() |
নিচে গোলাকার | Index, Page number | Math.floor(4.9); // 4 |
Math.ceil() |
উপরে গোলাকার | Pagination, Minimum charge | Math.ceil(4.1); // 5 |
Math.abs() |
পরম মান — ধনাত্মক | Distance, Difference | Math.abs(-5); // 5 |
Math.max() / Math.min() |
সর্বোচ্চ / সর্বনিম্ন মান | Highest score, Lowest price | Math.max(1, 5, 3); // 5 |
Math.pow() |
ঘাত গণনা | Area, Physics | Math.pow(2, 10); // 1024 |
Math.sqrt() |
বর্গমূল | Geometry, Distance | Math.sqrt(16); // 4 |
Math.random() |
0–1 এর মধ্যে random সংখ্যা | Random item, OTP, ID | Math.floor(Math.random() * 10); |
Math.trunc() |
দশমিক অংশ বাদ দেওয়া | Integer part only | Math.trunc(-4.9); // -4 |
Math.sign() |
ধনাত্মক (1), শূন্য (0), ঋণাত্মক (-1) | Direction check | Math.sign(-5); // -1 |
Math.hypot() |
Hypotenuse — বর্গমূলের যোগফল | 2D Distance calculation | Math.hypot(3, 4); // 5 |
Math.PI |
π = 3.14159... | Circle calculation | Math.PI * r * r |
Math.sin() / .cos() / .tan() |
Trigonometric functions | Animation, Canvas, SVG | Math.sin(Math.PI / 2); // 1 |
Math.log2() / Math.log10() |
Logarithm | Algorithm, Scale | Math.log2(8); // 3 |
🔷 Date ও Time — তারিখ ও সময়
| Method | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
new Date() |
বর্তমান তারিখ ও সময় | Timestamp তৈরি | const now = new Date(); |
new Date(string) |
String থেকে Date | Input parse | new Date("2024-01-15"); |
Date.now() |
Unix Timestamp milliseconds | Performance measure, ID | Date.now(); // 1700000000000 |
.getFullYear() |
বছর বের করা | Year display | now.getFullYear(); // 2024 |
.getMonth() |
মাস বের করা — 0-indexed | Month display (+1 করুন) | now.getMonth(); // 0 = January |
.getDate() |
দিন বের করা (1–31) | Day display | now.getDate(); |
.getDay() |
সপ্তাহের দিন — 0 = Sunday | Weekday display | now.getDay(); // 0 = রোববার |
.getHours() / .getMinutes() / .getSeconds() |
ঘণ্টা, মিনিট, সেকেন্ড | Clock, Timer | now.getHours(); |
.getTime() |
Timestamp milliseconds | Duration calculation | now.getTime(); |
.toISOString() |
ISO 8601 format String | API, Database | now.toISOString(); |
.toLocaleDateString() |
Locale অনুযায়ী তারিখ String | UI Display | now.toLocaleDateString("bn-BD"); |
.toLocaleTimeString() |
Locale অনুযায়ী সময় String | Clock Display | now.toLocaleTimeString("bn-BD"); |
Intl.DateTimeFormat |
আধুনিক Date Formatting | Localized, Custom format | new Intl.DateTimeFormat("bn", { dateStyle:"long" }).format(now); |
Intl.RelativeTimeFormat |
Relative time — "৩ দিন আগে" | Social media timestamp | new Intl.RelativeTimeFormat("bn").format(-3, "day"); |
🔷 Destructuring ও Spread — আধুনিক Syntax
| Concept | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
| Array Destructuring | Array থেকে Variable-এ মান নেওয়া | useState, Coordinate | const [x, y] = [10, 20]; |
| Object Destructuring | Object থেকে Property বের করা | Props, API response | const { name, age } = user; |
| Default in Destructuring | মান না থাকলে ডিফল্ট | Optional property | const { name = "Guest" } = user; |
| Rename in Destructuring | ভিন্ন নামে Variable | Name conflict এড়ানো | const { name: userName } = user; |
| Nested Destructuring | ভেতরের Object / Array বের করা | Nested API response | const { address: { city } } = user; |
| Rest in Destructuring | বাকি সব একটি Variable-এ | Exclude property, Clone | const { id, ...rest } = user; |
| Spread in Array | Array উপাদান ছড়িয়ে দেওয়া | Clone, Merge, Pass args | [...arr1, ...arr2] |
| Spread in Object | Object property ছড়িয়ে দেওয়া | Shallow clone, Merge | { ...obj1, ...obj2 } |
| Variable Swap | Destructuring দিয়ে swap | Temp variable ছাড়া swap | [a, b] = [b, a]; |
| Parameter Destructuring | Function argument হিসেবে destructure | Named parameter pattern | function show({ name, age }) { } |
🔷 Class ও OOP — অবজেক্ট-ভিত্তিক প্রোগ্রামিং
| Concept | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
class |
Blueprint থেকে Object তৈরির ছাঁচ | Data model, Component | class User { constructor(name) { this.name = name; } } |
constructor() |
Object তৈরির সময় চালানো Method | Initial property সেট | constructor(name) { this.name = name; } |
new |
Class থেকে Object (instance) তৈরি | Object instantiation | const user = new User("Farid"); |
this |
বর্তমান Object-এর reference | Property ও Method access | this.name = name; |
static |
Class-এর নিজস্ব Method / Property | Utility, Factory method | static create(name) { return new User(name); } |
extends |
Parent Class থেকে inherit করা | Subclass, Specialization | class Admin extends User { } |
super() |
Parent Constructor ডাকা | extends ব্যবহারে অবশ্যই | super(name); |
super.method() |
Parent-এর Method ডাকা | Method override-এ Parent call | super.greet(); |
Private Field # |
Class-এর বাইরে access করা যায় না | Encapsulation | #password = "secret"; |
| Getter / Setter | Property-র মতো Function | Computed value, Validation | get fullName() { return `${this.first} ${this.last}`; } |
| Prototype | Object-এর shared Method store | Memory efficient method sharing | User.prototype.greet = function() { }; |
instanceof |
Instance check করা | Type guard | user instanceof User; // true |
🔷 Error Handling — ত্রুটি সামলানো
| Concept / Type | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
try...catch |
Error ধরা ও সামলানো | API call, JSON.parse | try { JSON.parse(x); } catch(e) { console.error(e); } |
finally |
Error হোক বা না হোক চলবে | Cleanup, Loading state off | finally { setLoading(false); } |
throw |
ইচ্ছাকৃত Error ছোঁড়া | Custom validation error | throw new Error("মান সঠিক নয়"); |
Error |
সাধারণ Error object | Generic error | new Error("কিছু ভুল হয়েছে"); |
TypeError |
ভুল টাইপে operation | null-এ method call | null.toString() // TypeError |
RangeError |
মান বৈধ সীমার বাইরে | Array(-1) ইত্যাদি | new Array(-1) // RangeError |
ReferenceError |
অঘোষিত Variable ব্যবহার | Typo, Scope issue | console.log(undeclaredVar) |
SyntaxError |
ভুল JavaScript Syntax | Parse time error | JSON.parse("{bad}") // SyntaxError |
error.message |
Error-এর বার্তা | User-facing error message | e.message; |
error.stack |
Error-এর Call Stack | Debugging | e.stack; |
| Custom Error Class | নিজস্ব Error type তৈরি | Domain-specific error | class ValidationError extends Error { } |
🔷 Promise ও Async/Await — অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং
| Concept / Method | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
new Promise() |
ভবিষ্যতের মান — pending / fulfilled / rejected | Async operation wrap | new Promise((resolve, reject) => { }); |
resolve() |
Promise সফল করা | Success result পাঠানো | resolve(data); |
reject() |
Promise ব্যর্থ করা | Error পাঠানো | reject(new Error("Failed")); |
.then() |
Promise সফল হলে চালানো | Chaining, Data transform | fetch(url).then(res => res.json()); |
.catch() |
Promise ব্যর্থ হলে চালানো | Error handling | .catch(err => console.error(err)); |
.finally() |
যেকোনো ক্ষেত্রে চালানো | Cleanup, Loading off | .finally(() => setLoading(false)); |
Promise.all() |
সব Promise শেষ হলে result | Parallel API calls | await Promise.all([p1, p2, p3]); |
Promise.allSettled() |
সব Promise-এর result — সফল বা ব্যর্থ | Partial success চাইলে | await Promise.allSettled([p1, p2]); |
Promise.race() |
প্রথম শেষ হওয়া Promise-এর result | Timeout, Fastest response | await Promise.race([fetchData(), timeout]); |
Promise.any() |
প্রথম সফল Promise-এর result | Multiple fallback source | await Promise.any([p1, p2]); |
async function |
সবসময় Promise ফেরানো Function | Async logic সহজে লেখা | async function getData() { } |
await |
Promise শেষ হওয়া পর্যন্ত অপেক্ষা | Sequential async operation | const data = await fetch(url); |
setTimeout() |
নির্দিষ্ট সময় পরে চালানো | Delay, Debounce | setTimeout(() => { }, 1000); |
setInterval() |
নির্দিষ্ট বিরতিতে বারবার চালানো | Clock, Polling | const id = setInterval(() => { }, 1000); |
clearTimeout() / clearInterval() |
Timer বন্ধ করা | Cleanup on unmount | clearInterval(id); |
🔷 DOM Manipulation — ডকুমেন্ট নিয়ন্ত্রণ
| Method / Property | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
document.querySelector() |
CSS Selector দিয়ে প্রথম element | Element নির্বাচন | document.querySelector(".btn"); |
document.querySelectorAll() |
CSS Selector দিয়ে সব element — NodeList | Multiple element | document.querySelectorAll("li"); |
document.getElementById() |
ID দিয়ে element খোঁজা | Specific element | document.getElementById("header"); |
document.createElement() |
নতুন HTML element তৈরি | Dynamic element add | document.createElement("div"); |
.appendChild() |
Child element শেষে যোগ করা | DOM-এ element যোগ | parent.appendChild(child); |
.append() |
String বা Node শেষে যোগ | Multiple node / text একসাথে | el.append("text", node); |
.prepend() |
শুরুতে Node যোগ | First child insert | el.prepend(newNode); |
.remove() |
Element নিজেকে সরানো | Self-remove | el.remove(); |
.cloneNode() |
Element কপি করা | Template duplicate | el.cloneNode(true); |
.innerHTML |
Element-এর HTML content | Dynamic HTML — XSS সতর্কতা | el.innerHTML = "<b>Bold</b>"; |
.textContent |
Element-এর text content — নিরাপদ | Text update — XSS নেই | el.textContent = "হ্যালো"; |
.setAttribute() |
Attribute সেট করা | href, src, data-* সেট | el.setAttribute("href", "/about"); |
.getAttribute() |
Attribute-এর মান পড়া | data-* পড়া | el.getAttribute("data-id"); |
.removeAttribute() |
Attribute সরানো | disabled, hidden সরানো | el.removeAttribute("disabled"); |
.classList.add() |
CSS class যোগ | State পরিবর্তন | el.classList.add("active"); |
.classList.remove() |
CSS class সরানো | State সরানো | el.classList.remove("hidden"); |
.classList.toggle() |
CSS class যোগ বা সরানো | Toggle menu, Dark mode | el.classList.toggle("open"); |
.classList.contains() |
Class আছে কিনা | State check | el.classList.contains("active"); |
.style |
Inline CSS সেট করা | Dynamic style | el.style.color = "blue"; |
getComputedStyle() |
প্রযোজ্য সব CSS পড়া | Computed value জানতে | getComputedStyle(el).fontSize; |
.getBoundingClientRect() |
Element-এর position ও আকার | Drag, Tooltip position | el.getBoundingClientRect(); |
.scrollIntoView() |
Element দৃশ্যমান করা | Smooth scroll to section | el.scrollIntoView({ behavior: "smooth" }); |
.dataset |
data-* attribute সহজে read / write | data-id, data-type | el.dataset.userId; |
.insertAdjacentHTML() |
নির্দিষ্ট অবস্থানে HTML insert | Before / after element | el.insertAdjacentHTML("afterend", "<p>...</p>"); |
🔷 Events — ইভেন্ট
| Method / Event | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
addEventListener() |
Event Listener যোগ করা | Click, Input, Scroll | btn.addEventListener("click", handler); |
removeEventListener() |
Event Listener সরানো | Cleanup, One-time event | btn.removeEventListener("click", handler); |
event.preventDefault() |
Default Browser action রোধ | Form submit, Link navigate | e.preventDefault(); |
event.stopPropagation() |
Event bubble রোধ | Parent-এ event না যেতে | e.stopPropagation(); |
event.target |
Event ঘটানো element | Event delegation | e.target.classList.add("clicked"); |
event.key |
Keyboard key-এর মান | KeyDown, Hotkey | if (e.key === "Enter") { } |
dispatchEvent() |
Custom Event ছোঁড়া | Component communication | el.dispatchEvent(new CustomEvent("done")); |
| Event Delegation | Parent-এ Listener রেখে Child handle | Dynamic list item | ul.addEventListener("click", e => { if(e.target.matches("li")) { } }); |
click / dblclick |
Mouse click event | Button, Card | btn.addEventListener("click", fn); |
mouseover / mouseout |
Mouse প্রবেশ ও বের হওয়া | Hover effect JS-এ | el.addEventListener("mouseover", fn); |
keydown / keyup |
Keyboard event | Shortcut, Form validation | document.addEventListener("keydown", fn); |
input / change |
Input মান পরিবর্তন | Live search, Form state | input.addEventListener("input", fn); |
submit |
Form submit event | Form handling | form.addEventListener("submit", fn); |
focus / blur |
Input Focus পাওয়া ও হারানো | Validation feedback | input.addEventListener("blur", fn); |
scroll |
Scroll করা | Sticky header, Infinite scroll | window.addEventListener("scroll", fn); |
resize |
Window আকার পরিবর্তন | Responsive logic | window.addEventListener("resize", fn); |
DOMContentLoaded |
DOM লোড সম্পন্ন | Init code চালানো | document.addEventListener("DOMContentLoaded", fn); |
IntersectionObserver |
Element Viewport-এ এলে callback | Lazy load, Scroll animation | new IntersectionObserver(cb).observe(el); |
MutationObserver |
DOM পরিবর্তন পর্যবেক্ষণ | Dynamic content watch | new MutationObserver(cb).observe(el, { childList: true }); |
ResizeObserver |
Element আকার পরিবর্তন পর্যবেক্ষণ | Container query JS-এ | new ResizeObserver(cb).observe(el); |
🔷 Fetch ও API — নেটওয়ার্ক অনুরোধ
| Method / Property | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
fetch(url) |
HTTP Request পাঠানো — Promise ফেরায় | GET request | fetch("https://api.example.com/data"); |
fetch(url, options) |
Method, Header, Body সহ Request | POST, PUT, DELETE | fetch(url, { method: "POST", body: JSON.stringify(data) }); |
response.ok |
Status 200–299 কিনা | Success check | if (!res.ok) throw new Error(); |
response.status |
HTTP Status Code | 404, 500 চেক | res.status; // 200 |
response.json() |
Response → JSON parse করা | REST API data পড়া | const data = await res.json(); |
response.text() |
Response → String | HTML, Plain text | const html = await res.text(); |
response.blob() |
Response → Binary data | File, Image download | const blob = await res.blob(); |
AbortController |
Fetch request বাতিল করা | Timeout, Component unmount | const ctrl = new AbortController(); fetch(url, { signal: ctrl.signal }); |
ctrl.abort() |
Request বন্ধ করা | Cancel on unmount | ctrl.abort(); |
URL |
URL parse ও তৈরি | Query param handle | new URL("https://example.com?q=hello"); |
URLSearchParams |
Query String build / parse | Search param | new URLSearchParams({ q: "js" }).toString(); |
FormData |
Form data multipart তৈরি | File upload | const fd = new FormData(); fd.append("file", file); |
🔷 localStorage ও Storage — ডেটা সংরক্ষণ
| Method / API | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
localStorage.setItem() |
Key-value সংরক্ষণ — String | User preference, Theme | localStorage.setItem("theme", "dark"); |
localStorage.getItem() |
Key দিয়ে মান পড়া | Stored value retrieve | localStorage.getItem("theme"); |
localStorage.removeItem() |
নির্দিষ্ট key মুছে ফেলা | Logout, Clear preference | localStorage.removeItem("token"); |
localStorage.clear() |
সব localStorage মুছে ফেলা | Full reset | localStorage.clear(); |
sessionStorage |
Session শেষে মুছে যায় | Tab-specific temp data | sessionStorage.setItem("step", "2"); |
JSON.stringify() |
Object → JSON String | Object storage-এ save করতে | localStorage.setItem("user", JSON.stringify(user)); |
JSON.parse() |
JSON String → Object | Storage থেকে Object পড়তে | JSON.parse(localStorage.getItem("user")); |
Cookie |
Browser-এ ছোট ডেটা — Server-ও পড়তে পারে | Auth token, Session | document.cookie = "name=Farid; path=/"; |
IndexedDB |
Browser-এ বড় Structured data store | Offline app, Large dataset | indexedDB.open("myDB", 1); |
navigator.clipboard |
Clipboard read / write | Copy to clipboard | navigator.clipboard.writeText("Copied!"); |
🔷 Regular Expression — রেগুলার এক্সপ্রেশন
| Pattern / Method | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
/pattern/flags |
Regex Literal তৈরি | Pattern matching | /hello/i.test("Hello"); // true |
new RegExp() |
Dynamic Regex তৈরি | Variable দিয়ে pattern | new RegExp(word, "gi"); |
g flag |
Global — সব match | replaceAll, matchAll | /cat/g |
i flag |
Case-insensitive | Search ignore case | /hello/i |
m flag |
Multiline — ^ ও $ প্রতি লাইনে | Multiline text | /^start/m |
. |
যেকোনো character — newline ছাড়া | Wildcard | /h.llo/ |
^ $ |
String-এর শুরু ও শেষ | Start / End validation | /^https/ /\.js$/ |
* + ? |
0+, 1+, 0 বা 1 — repetition | Optional, Required, One repetition | /\d+/ /colou?r/ |
{n} {n,m} |
নির্দিষ্ট সংখ্যক repetition | Phone, OTP validation | /\d{4,6}/ |
[abc] [^abc] |
Character Class ও নেগেশন | Vowel, Exclude characters | /[aeiou]/ /[^0-9]/ |
\d \w \s |
Digit, Word char, Whitespace | Number, Username, Space validation | /^\d+$/ /^\w+$/ |
(group) |
Capture Group | Extract match part | /(\d{4})-(\d{2})/ |
(?<name>) |
Named Capture Group | Named extraction | /(?<year>\d{4})/ |
regex.test() |
Pattern match আছে কিনা | Validation | /^\d+$/.test("123"); // true |
regex.exec() |
Match বের করা বিস্তারিত | Capture group extract | /(\d+)/.exec("abc123"); |
Lookahead (?=) |
পরে নির্দিষ্ট pattern থাকলে | Password validation | /\d(?=[a-z])/ |
🔷 Map, Set, WeakMap — বিশেষ Collection
| Method / Property | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
new Map() |
Key-value store — যেকোনো Key টাইপ | Object-এর শক্তিশালী বিকল্প | const map = new Map(); |
map.set(key, val) |
Key-value যোগ করা | Data store | map.set("name", "Farid"); |
map.get(key) |
Key দিয়ে মান পড়া | Lookup | map.get("name"); // "Farid" |
map.has(key) |
Key আছে কিনা | Existence check | map.has("age"); // false |
map.delete(key) |
Key-value মুছে ফেলা | Remove entry | map.delete("name"); |
map.size |
Map-এর entry সংখ্যা | Count entries | map.size; |
for...of map |
Map Iterate করা | Loop through Map | for (const [k,v] of map) { } |
new Set() |
অনন্য মানের Collection | Duplicate সরানো | const set = new Set([1,2,2,3]); |
set.add(val) |
মান যোগ করা — duplicate এড়ায় | Unique list তৈরি | set.add(4); |
set.has(val) |
মান আছে কিনা | O(1) lookup | set.has(2); // true |
set.delete(val) |
মান মুছে ফেলা | Remove element | set.delete(1); |
| Array থেকে Unique | Set দিয়ে Duplicate সরানো | Deduplicate | [...new Set(arr)]; |
new WeakMap() |
Object Key-only Map — GC-friendly | Private data, Cache | const wm = new WeakMap(); |
new WeakSet() |
Object-only Set — GC-friendly | Visited object track | const ws = new WeakSet(); |
🔷 Modules (ES6) — মডিউল সিস্টেম
| Syntax | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
export |
Module থেকে export করা | Function, Class, Variable share | export function greet() { } |
export default |
Default export — একটি মাত্র | Main export, Component | export default class App { } |
export { a, b } |
Named export একসাথে | Multiple export | export { add, subtract }; |
import { a } from "..." |
Named import | নির্দিষ্ট export নেওয়া | import { useState } from "react"; |
import App from "..." |
Default import | Default export নেওয়া | import App from "./App.js"; |
import * as ns from "..." |
সব export এক namespace-এ | Utility module | import * as math from "./math.js"; |
import { a as b } |
Alias দিয়ে import | Name conflict এড়ানো | import { resolve as pathResolve } from "path"; |
Dynamic import() |
Runtime-এ Module লোড — Promise | Code splitting, Lazy load | const mod = await import("./heavy.js"); |
export * from "..." |
Re-export করা | Barrel file / index.js | export * from "./utils.js"; |
🔷 JSON — ডেটা ফরম্যাট
| Method | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
JSON.stringify() |
Object → JSON String | API request body, Storage | JSON.stringify({ name: "Farid" }); |
JSON.stringify(val, null, 2) |
Formatted JSON — indented | Pretty print, Debug | JSON.stringify(obj, null, 2); |
JSON.parse() |
JSON String → Object | API response parse | JSON.parse('{"name":"Farid"}'); |
JSON.parse(str, reviver) |
Parse করার সময় transform | Date string → Date object | JSON.parse(str, (k,v) => k==="date" ? new Date(v) : v); |
toJSON() |
Stringify-এ custom output | Date, BigInt serialize | toJSON() { return this.id; } |
| JSON valid types | String, Number, Boolean, null, Array, Object | undefined, Function, Symbol → বাদ যায় | { "key": null } ✅ |
| Deep Clone with JSON | JSON দিয়ে Deep clone — সীমিত | Simple object copy | JSON.parse(JSON.stringify(obj)); |
🔷 Iterator ও Generator — পুনরাবৃত্তি প্রোটোকল
| Concept | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
| Iterable Protocol | Symbol.iterator method আছে এমন Object |
for...of-এ ব্যবহার করা যায় | obj[Symbol.iterator] = function*() { yield 1; } |
| Iterator Protocol | next() method আছে যা {value, done} দেয় |
Manual iteration | const iter = arr[Symbol.iterator](); iter.next(); |
function* |
Generator Function — pause করা যায় | Lazy sequence, Async control | function* count() { yield 1; yield 2; } |
yield |
Generator pause করে মান দেওয়া | Lazy value generation | yield nextValue; |
yield* |
অন্য Iterable-এ delegate | Generator compose | yield* otherGenerator(); |
generator.next() |
পরবর্তী yield পর্যন্ত চালানো | Step-by-step execution | gen.next(); // {value: 1, done: false} |
| Infinite Generator | শেষ না হওয়া Generator | ID generator, Fibonacci | function* ids() { let i=0; while(true) yield i++; } |
async function* |
Async Generator | Async stream, Paginated API | async function* pages() { yield await fetchPage(1); } |
for await...of |
Async Iterable-এ loop | Stream, Async generator | for await (const page of pages()) { } |
🔷 Symbol — অনন্য Primitive
| Concept | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
Symbol() |
অনন্য primitive মান তৈরি | Object-এ collision-proof key | const id = Symbol("id"); |
Symbol.for() |
Global registry-তে Symbol | Cross-module shared Symbol | Symbol.for("app.id"); |
Symbol.keyFor() |
Global Symbol-এর key বের করা | Symbol lookup | Symbol.keyFor(s); |
Symbol.iterator |
Custom iteration define | Iterable object তৈরি | obj[Symbol.iterator] = function*() { }; |
Symbol.toPrimitive |
Type coercion customize | Custom + বা comparison | obj[Symbol.toPrimitive] = (hint) => { }; |
Symbol.toStringTag |
toString customize |
Custom type tag | get [Symbol.toStringTag]() { return "MyClass"; } |
🔷 Proxy ও Reflect — মেটাপ্রোগ্রামিং
| Concept / Method | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
new Proxy(target, handler) |
Object operation intercept করা | Validation, Logging, Reactive | new Proxy(obj, { get(t,k) { return t[k]; } }); |
get trap |
Property read intercept | Default value, Logging | get(target, key) { return key in target ? target[key] : 0; } |
set trap |
Property write intercept | Validation, Reactive update | set(target, key, val) { target[key] = val; return true; } |
has trap |
in operator intercept |
Custom membership | has(target, key) { return key in target; } |
apply trap |
Function call intercept | Function logging, Memoize | apply(target, thisArg, args) { return target(...args); } |
Reflect.get() |
Property পড়া — safe | Proxy-এর ভেতরে সঠিক this | Reflect.get(target, key, receiver); |
Reflect.set() |
Property সেট করা — safe | Proxy handler-এ | Reflect.set(target, key, value); |
Reflect.ownKeys() |
সব key — Symbol সহ | Complete property list | Reflect.ownKeys(obj); |
🔷 Built-in Global Objects ও Browser API — বৈশ্বিক Object
| Object / Method | সংজ্ঞা | ব্যবহার | সংক্ষিপ্ত উদাহরণ |
|---|---|---|---|
console.log / warn / error / table |
Console-এ output | Debugging | console.table(users); |
console.time() / timeEnd() |
Code execution সময় মাপা | Performance profiling | console.time("x"); ... console.timeEnd("x"); |
window |
Browser Global Object | Global scope, Browser API | window.innerWidth; |
globalThis |
Platform-নির্বিশেষে Global Object | Browser + Node.js উভয়ে | globalThis.fetch; |
navigator |
Browser ও Device তথ্য | Online status, User agent | navigator.onLine; |
navigator.geolocation |
Device-এর অবস্থান | Map, Delivery app | navigator.geolocation.getCurrentPosition(cb); |
location |
বর্তমান URL তথ্য ও navigate | Redirect, URL parse | location.href = "/dashboard"; |
history |
Browser History navigate | SPA routing | history.pushState({}, "", "/about"); |
Intl.NumberFormat |
Locale অনুযায়ী Number format | Currency, Percentage | new Intl.NumberFormat("bn-BD", { style:"currency", currency:"BDT" }).format(1000);
|
Intl.Collator |
Locale-aware String sort | Bengali / multilingual sort | new Intl.Collator("bn").compare("আ","ক"); |
crypto.randomUUID() |
UUID তৈরি করা | Unique ID generation | crypto.randomUUID(); |
performance.now() |
High-resolution timestamp | Precise time measurement | const t = performance.now(); |
requestAnimationFrame() |
পরবর্তী repaint-এ callback | Smooth animation | requestAnimationFrame(draw); |
Blob |
Binary Large Object তৈরি | File download, File API | new Blob([data], { type: "text/plain" }); |
FileReader |
File পড়া ও process করা | File upload preview | new FileReader().readAsDataURL(file); |
Worker |
Background Thread-এ কোড চালানো | CPU-heavy task UI block ছাড়া | new Worker("worker.js"); |
structuredClone() |
Deep clone — built-in | Object deep copy | structuredClone(complexObj); |
encodeURIComponent() |
URL-safe encoding | Query param encode | encodeURIComponent("হ্যালো"); |
decodeURIComponent() |
URL encoding decode | URL param decode | decodeURIComponent("%E0%A6%B9"); |
btoa() / atob() |
Base64 encode / decode | Image data, Token | btoa("hello"); // "aGVsbG8=" |
queueMicrotask() |
Microtask queue-এ task যোগ | After current task, before next macrotask | queueMicrotask(() => update()); |
🧠 নিজেকে যাচাই করো
1. Array destructuring?
2. Spread operator কী করে?
3. Optional chaining (?.) কী?
✏️ Task — এখন তুমি করো
Destructuring, spread, optional chaining — তিনটা ব্যবহার করো portfolio code-এ।
🎉 JavaScript শেখা সম্পূর্ণ! Interactive Portfolio সম্পূর্ণ হলো!
📋 Assignment
মাশাআল্লাহ! 🎉 এই section শেষ করেছেন — অসাধারণ! প্রজেক্টের কোডগুলো দেখে দেখে VS Code-এ নিজে টাইপ করুন — copy-paste করবেন না। কারণ হাতে টাইপ করলেই স্মৃতিতে গেঁথে যায়, মাথায় থাকে, বাস্তব অভিজ্ঞতা হয়, সাহস বাড়ে। শুধু পড়ে বা দেখে কেউ কখনো developer হয়নি। চলুন পড়ি! হাতে কলমে শিখি!