<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shajibul Alam Shihab</title>
    <description>The latest articles on DEV Community by Shajibul Alam Shihab (@shajibul_alam_shihab).</description>
    <link>https://dev.to/shajibul_alam_shihab</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2544613%2Fc8c0777d-ee3e-4b22-adcf-5625ae6fcbce.jpeg</url>
      <title>DEV Community: Shajibul Alam Shihab</title>
      <link>https://dev.to/shajibul_alam_shihab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shajibul_alam_shihab"/>
    <language>en</language>
    <item>
      <title>Understanding Stack vs Heap Memory (The Way Every Beginner Wishes It Was Explained)</title>
      <dc:creator>Shajibul Alam Shihab</dc:creator>
      <pubDate>Sun, 26 Jul 2026 09:05:32 +0000</pubDate>
      <link>https://dev.to/shajibul_alam_shihab/understanding-stack-vs-heap-memory-the-way-every-beginner-wishes-it-was-explained-1oec</link>
      <guid>https://dev.to/shajibul_alam_shihab/understanding-stack-vs-heap-memory-the-way-every-beginner-wishes-it-was-explained-1oec</guid>
      <description>&lt;p&gt;If you've been learning programming for a while, you've probably heard terms like &lt;strong&gt;Stack Memory&lt;/strong&gt;, &lt;strong&gt;Heap Memory&lt;/strong&gt;, &lt;strong&gt;Call Stack&lt;/strong&gt;, or maybe even &lt;strong&gt;Stack Overflow&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At first, these terms sound scary.&lt;/p&gt;

&lt;p&gt;When I was learning programming, I remember thinking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Why do I even need to know this? Can't I just write code?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer is... &lt;strong&gt;you absolutely can&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In fact, many developers write code for months even years without fully understanding how memory works behind the scenes.&lt;/p&gt;

&lt;p&gt;But sooner or later, you'll run into questions like these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why do local variables disappear after a function finishes?&lt;/li&gt;
&lt;li&gt;Why do objects still exist even after the function that created them has returned?&lt;/li&gt;
&lt;li&gt;Why does infinite recursion crash the program?&lt;/li&gt;
&lt;li&gt;What exactly is a memory leak?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Interestingly, all of these questions are connected. And the answer starts with understanding how your program uses memory. Don't worry we're not going to dive straight into complicated computer science terms. Instead, we'll build the idea step by step.&lt;/p&gt;

&lt;p&gt;By the end of this article, you'll understand:&lt;/p&gt;

&lt;p&gt;✅ What the Stack is&lt;br&gt;
 ✅ What the Heap is&lt;br&gt;
 ✅ Why programming languages use both&lt;br&gt;
 ✅ How functions use memory&lt;br&gt;
 ✅ Why stack overflows happen&lt;br&gt;
 ✅ Why memory leaks happen&lt;br&gt;
 ✅ And how all of these concepts connect together&lt;/p&gt;

&lt;p&gt;Our goal isn't just to memorize definitions. It's to build a mental picture of what's happening every time your code runs.&lt;/p&gt;

&lt;p&gt;So let's start with a simple question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When you call a function, where does the computer actually keep everything that function needs?&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Before We Talk About the Stack...
&lt;/h1&gt;

&lt;p&gt;Let's look at a simple function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`Hello, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alex&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This looks like a very small piece of code. But when you run it, the computer has to keep track of several things.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It needs to remember that &lt;code&gt;name&lt;/code&gt; is &lt;code&gt;"Alex"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It needs somewhere to store the &lt;code&gt;message&lt;/code&gt; variable.&lt;/li&gt;
&lt;li&gt;It needs to know which line of code it should execute next after the function finishes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this information has to live somewhere while the function is running.&lt;/p&gt;

&lt;p&gt;Now imagine your program calling hundreds of functions every second.&lt;/p&gt;

&lt;p&gt;The computer needs a system that can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;quickly create memory for a new function,&lt;/li&gt;
&lt;li&gt;keep each function's data separate,&lt;/li&gt;
&lt;li&gt;and remove that memory as soon as the function is done.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this process were slow, every program you wrote would become slower too. So instead of placing function data randomly in memory, computers use a very organized system. That system is called the &lt;strong&gt;Call Stack&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Before we understand the Call Stack, though, we first need to understand one simple idea.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What exactly is a stack?&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What Is a Stack?
&lt;/h1&gt;

&lt;p&gt;Before we talk about the &lt;strong&gt;Call Stack&lt;/strong&gt;, let's first understand what a &lt;strong&gt;stack&lt;/strong&gt; actually is.&lt;/p&gt;

&lt;p&gt;Imagine you have a stack of plates in your kitchen.&lt;/p&gt;

&lt;p&gt;When you add a new plate, you place it &lt;strong&gt;on top&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When you need a plate, you also take it &lt;strong&gt;from the top&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You never remove the plate from the middle because that would make the whole stack unstable.&lt;/p&gt;

&lt;p&gt;It looks something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbia98jyhcy3emtai2ryg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbia98jyhcy3emtai2ryg.png" alt=" " width="537" height="527"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is exactly how a &lt;strong&gt;stack&lt;/strong&gt; works.&lt;/p&gt;

&lt;p&gt;You always add new items to the top.&lt;/p&gt;

&lt;p&gt;You always remove items from the top.&lt;/p&gt;

&lt;p&gt;Because the &lt;strong&gt;last item added&lt;/strong&gt; is also the &lt;strong&gt;first item removed&lt;/strong&gt;, a stack follows a rule called &lt;strong&gt;Last In, First Out (LIFO).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't worry too much about remembering the name.&lt;/p&gt;

&lt;p&gt;Just remember the idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The most recently added item is always the first one to leave.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's all a stack is.&lt;/p&gt;

&lt;p&gt;Now let's see how this idea is used when a program runs.&lt;/p&gt;




&lt;h1&gt;
  
  
  Introducing the Call Stack
&lt;/h1&gt;

&lt;p&gt;Every time your program calls a function, the computer places that function &lt;strong&gt;on top of the Call Stack&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let's look at a simple example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Hello, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alex&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When &lt;code&gt;greet("Alex")&lt;/code&gt; is called, the computer creates a small workspace for that function. This workspace contains everything the function needs while it's running.&lt;/p&gt;

&lt;p&gt;Instead of putting that workspace somewhere random in memory, the computer pushes it onto the &lt;strong&gt;top of the Call Stack&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can imagine it like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq2czz4u0mfmze9esq9kr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq2czz4u0mfmze9esq9kr.png" alt=" " width="572" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this moment, &lt;code&gt;greet()&lt;/code&gt; is the only function that's running, so it's the only frame on the stack.&lt;/p&gt;

&lt;p&gt;Once the function finishes, the computer removes it from the top.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq097rt97i8kmubeh8bmp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq097rt97i8kmubeh8bmp.png" alt=" " width="432" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The memory used by that function is immediately available to be reused for the next function call. This happens automatically. You don't have to clean anything up yourself.&lt;/p&gt;

&lt;p&gt;Every function call follows this same pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The function is called.&lt;/li&gt;
&lt;li&gt;A new frame is pushed onto the Call Stack.&lt;/li&gt;
&lt;li&gt;The function runs.&lt;/li&gt;
&lt;li&gt;The frame is popped from the Call Stack when the function finishes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This happens so quickly that we never notice it, but it's happening every time a function is called.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Is a Stack Frame?
&lt;/h1&gt;

&lt;p&gt;Earlier, I mentioned that the computer creates a &lt;strong&gt;workspace&lt;/strong&gt; for every function.&lt;/p&gt;

&lt;p&gt;That workspace has a proper name: &lt;strong&gt;A stack frame.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A stack frame is simply the memory that belongs to &lt;strong&gt;one specific function call&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When &lt;code&gt;add(5, 10)&lt;/code&gt; runs, the computer creates a stack frame that stores things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the value of &lt;code&gt;a&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;the value of &lt;code&gt;b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;the local variable &lt;code&gt;sum&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;information about where the program should continue after the function returns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can picture it like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdabv1adl091qquzkbfah.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdabv1adl091qquzkbfah.png" alt=" " width="488" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Think of a stack frame as a temporary workspace. It exists only while the function is running. As soon as the function returns, the entire frame is removed from the stack. That also means the local variable &lt;code&gt;sum&lt;/code&gt; disappears because the workspace that owned it no longer exists.&lt;/p&gt;

&lt;p&gt;This is why we say that &lt;strong&gt;stack memory is temporary&lt;/strong&gt;. It's created when a function starts, and it's automatically cleaned up when the function finishes. And because every function gets its own stack frame, different function calls never accidentally overwrite each other's local variables.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why Is the Stack So Fast?
&lt;/h1&gt;

&lt;p&gt;By now, you know that every function call gets its own stack frame.&lt;/p&gt;

&lt;p&gt;When the function starts, a new frame is added to the top of the Call Stack.&lt;/p&gt;

&lt;p&gt;When the function finishes, that frame is removed.&lt;/p&gt;

&lt;p&gt;But here's something interesting:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This process is incredibly fast.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In fact, allocating memory on the stack is one of the fastest memory operations a program can perform.&lt;/p&gt;

&lt;p&gt;So... what makes it so fast?&lt;/p&gt;

&lt;p&gt;The answer lies in how the stack is organized.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack Is Highly Organized
&lt;/h2&gt;

&lt;p&gt;Think about a stack of books.&lt;/p&gt;

&lt;p&gt;When you want to add a new book, where do you put it?&lt;/p&gt;

&lt;p&gt;On the top.&lt;/p&gt;

&lt;p&gt;When you want to remove one, which book do you take?&lt;/p&gt;

&lt;p&gt;Again, the one on the top.&lt;/p&gt;

&lt;p&gt;You never search through the stack looking for an empty spot. You never rearrange the books. You always work with the top.&lt;/p&gt;

&lt;p&gt;The Call Stack follows the exact same idea.&lt;/p&gt;

&lt;p&gt;When a function is called, its stack frame is simply placed on top of the previous one. When the function returns, that top frame is removed.&lt;/p&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;The computer always knows exactly where the next stack frame should go and exactly which frame should be removed. It never has to search for free memory. It never has to reorganize anything. Everything happens in a predictable order.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Simple Way to Think About It
&lt;/h2&gt;

&lt;p&gt;Imagine you have a notebook.&lt;/p&gt;

&lt;p&gt;Every time a function is called, you write its information on the next empty page.&lt;/p&gt;

&lt;p&gt;When that function finishes, you simply tear out the last page.&lt;/p&gt;

&lt;p&gt;Then the next function can use that page again.&lt;/p&gt;

&lt;p&gt;You don't have to flip through the notebook looking for empty pages.&lt;/p&gt;

&lt;p&gt;You don't have to erase individual lines.&lt;/p&gt;

&lt;p&gt;You just move forward when a function starts and move backward when it ends.&lt;/p&gt;

&lt;p&gt;This is very similar to how stack memory works.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stack Allocation Is Just Moving a Pointer
&lt;/h2&gt;

&lt;p&gt;Here's a fun fact that surprises many beginners.&lt;/p&gt;

&lt;p&gt;When people hear "allocate memory," they often imagine the computer doing a lot of work.&lt;/p&gt;

&lt;p&gt;But for stack memory, that's usually not the case.&lt;/p&gt;

&lt;p&gt;Internally, the program keeps track of the top of the stack using something called the &lt;strong&gt;stack pointer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You don't need to know all the low-level details, but here's the basic idea.&lt;/p&gt;

&lt;p&gt;Imagine the stack currently looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fndldt4ykad7cwk67makf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fndldt4ykad7cwk67makf.png" alt=" " width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now suppose another function is called.&lt;/p&gt;

&lt;p&gt;The computer doesn't search for a place to store it.&lt;/p&gt;

&lt;p&gt;It simply moves the stack pointer and places the new frame on top.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6tr0xdc9coewclk0f9m1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6tr0xdc9coewclk0f9m1.png" alt=" " width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When &lt;code&gt;Function C&lt;/code&gt; finishes, the stack pointer moves back.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F31anek0uz1fy82uevgdb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F31anek0uz1fy82uevgdb.png" alt=" " width="799" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice something important.&lt;/p&gt;

&lt;p&gt;The computer didn't need to clean every variable one by one. It didn't need to erase memory. It simply moved the pointer back.&lt;/p&gt;

&lt;p&gt;From the program's point of view, that memory is now free to be reused. That's why stack allocation is so fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  Automatic Cleanup
&lt;/h2&gt;

&lt;p&gt;Another big advantage of the stack is that it cleans itself up automatically.&lt;/p&gt;

&lt;p&gt;Let's look at this example again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While the function is running, the stack frame contains something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;add()

a = 5
b = 10
sum = 15
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As soon as the function returns, the entire frame disappears.&lt;/p&gt;

&lt;p&gt;You don't have to write code to remove &lt;code&gt;a&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You don't have to delete &lt;code&gt;b&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You don't have to free &lt;code&gt;sum&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Everything inside that stack frame is removed together because it all belongs to the same function call.&lt;/p&gt;

&lt;p&gt;This is one of the reasons why local variables are so convenient to use.&lt;/p&gt;

&lt;p&gt;Their lifetime is automatically managed by the Call Stack.&lt;/p&gt;




&lt;h2&gt;
  
  
  But There's One Limitation...
&lt;/h2&gt;

&lt;p&gt;At this point, the stack sounds almost perfect.&lt;/p&gt;

&lt;p&gt;It's fast.&lt;/p&gt;

&lt;p&gt;It's simple.&lt;/p&gt;

&lt;p&gt;It cleans itself up automatically.&lt;/p&gt;

&lt;p&gt;So why doesn't the computer store &lt;strong&gt;everything&lt;/strong&gt; on the stack?&lt;/p&gt;

&lt;p&gt;The answer is that the stack has one important limitation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Everything on the stack must have a short and predictable lifetime.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think about a function that creates a user object and returns it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ada&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function finishes almost immediately.&lt;/p&gt;

&lt;p&gt;If the object lived entirely on the stack, it would disappear the moment the function returned.&lt;/p&gt;

&lt;p&gt;But that would make the returned object useless because the caller still wants to use it.&lt;/p&gt;

&lt;p&gt;So where should that object live instead?&lt;/p&gt;

&lt;p&gt;This question leads us to the second major area of memory:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Heap.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  The Problem the Stack Can't Solve
&lt;/h1&gt;

&lt;p&gt;So far, the Stack sounds almost perfect. It's incredibly fast. It automatically cleans up memory. And every function gets its own temporary workspace.&lt;/p&gt;

&lt;p&gt;At this point, you might be wondering:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"If the Stack works so well, why do we even need the Heap?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's a great question.&lt;/p&gt;

&lt;p&gt;The answer is simple.&lt;/p&gt;

&lt;p&gt;The Stack is designed for &lt;strong&gt;temporary data&lt;/strong&gt;. Sometimes, that's exactly what we want.&lt;/p&gt;

&lt;p&gt;But sometimes...&lt;/p&gt;

&lt;p&gt;We need data to live much longer than the function that created it.&lt;/p&gt;

&lt;p&gt;Let's see what that means.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Simple Example
&lt;/h2&gt;

&lt;p&gt;Imagine we have a function that creates a user.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ada&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you first look at this code, it seems completely normal.&lt;/p&gt;

&lt;p&gt;The function creates an object.&lt;/p&gt;

&lt;p&gt;The object is returned.&lt;/p&gt;

&lt;p&gt;Then we use it outside the function.&lt;/p&gt;

&lt;p&gt;Nothing surprising here.&lt;/p&gt;

&lt;p&gt;But let's stop and think about what's actually happening.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Happens When the Function Returns?
&lt;/h2&gt;

&lt;p&gt;Earlier, we learned that when a function finishes, its &lt;strong&gt;stack frame is removed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That means every local variable inside that function disappears.&lt;/p&gt;

&lt;p&gt;In this example, that includes the local variable &lt;code&gt;user&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So after &lt;code&gt;createUser()&lt;/code&gt; returns, the stack frame is gone.&lt;/p&gt;

&lt;p&gt;Before returning:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjha5vahkmkfrwbtyw6gm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjha5vahkmkfrwbtyw6gm.png" alt=" " width="462" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After returning:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fobuti1tv5avsvbccdqfi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fobuti1tv5avsvbccdqfi.png" alt=" " width="382" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So here's the question.&lt;/p&gt;

&lt;p&gt;If the stack frame has disappeared...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is this still working?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where is the object?&lt;/p&gt;

&lt;p&gt;If everything inside the function disappeared, shouldn't the object disappear too?&lt;/p&gt;

&lt;p&gt;The answer is &lt;strong&gt;no&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And this is exactly why the Heap exists.&lt;/p&gt;




&lt;h1&gt;
  
  
  Meet the Heap
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;Heap&lt;/strong&gt; is another area of memory that is designed for data that needs to live &lt;strong&gt;longer than a single function call&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Unlike the Stack, the Heap is &lt;strong&gt;not automatically cleaned up when a function returns&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead, data stored in the Heap stays alive for as long as your program still needs it.&lt;/p&gt;

&lt;p&gt;In JavaScript, things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;objects&lt;/li&gt;
&lt;li&gt;arrays&lt;/li&gt;
&lt;li&gt;functions&lt;/li&gt;
&lt;li&gt;maps&lt;/li&gt;
&lt;li&gt;sets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;are all stored in the Heap.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because their lifetime is often unpredictable.&lt;/p&gt;

&lt;p&gt;Sometimes an object lives for just a few milliseconds.&lt;/p&gt;

&lt;p&gt;Sometimes it stays alive for the entire lifetime of your application.&lt;/p&gt;

&lt;p&gt;The computer doesn't know that in advance.&lt;/p&gt;

&lt;p&gt;So it stores these values in a place where they can stay alive for as long as necessary.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stack Doesn't Store the Entire Object
&lt;/h2&gt;

&lt;p&gt;Here's a detail that surprises many beginners.&lt;/p&gt;

&lt;p&gt;When you write this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ada&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most people imagine that the variable &lt;code&gt;user&lt;/code&gt; contains the entire object.&lt;/p&gt;

&lt;p&gt;But that's not quite what happens.&lt;/p&gt;

&lt;p&gt;Instead, the object itself is stored in the Heap.&lt;/p&gt;

&lt;p&gt;The variable &lt;code&gt;user&lt;/code&gt; simply stores a &lt;strong&gt;reference&lt;/strong&gt; to that object.&lt;/p&gt;

&lt;p&gt;You can imagine it like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F73wl61hi5e4p13f5qpeq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F73wl61hi5e4p13f5qpeq.png" alt=" " width="557" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Think of a reference like a home address.&lt;/p&gt;

&lt;p&gt;Imagine your friend lives at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;25 Maple Street
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you write that address on a piece of paper, the paper isn't the house.&lt;/p&gt;

&lt;p&gt;It simply tells you where the house is.&lt;/p&gt;

&lt;p&gt;A reference works in a similar way.&lt;/p&gt;

&lt;p&gt;The variable doesn't contain the entire object.&lt;/p&gt;

&lt;p&gt;It simply knows where the object is stored.&lt;/p&gt;




&lt;h2&gt;
  
  
  Now Everything Makes Sense
&lt;/h2&gt;

&lt;p&gt;Let's go back to our example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ada&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While &lt;code&gt;createUser()&lt;/code&gt; is running, the stack might look something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhrgqgts2glx05j6ivgaa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhrgqgts2glx05j6ivgaa.png" alt=" " width="540" height="626"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the function returns, something interesting happens.&lt;/p&gt;

&lt;p&gt;The local variable &lt;code&gt;user&lt;/code&gt; disappears because its stack frame is removed.&lt;/p&gt;

&lt;p&gt;But before the frame disappears, the reference is returned to the caller.&lt;/p&gt;

&lt;p&gt;Now another variable, &lt;code&gt;person&lt;/code&gt;, points to the very same object.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F450ndxg9b5q624ip43u0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F450ndxg9b5q624ip43u0.png" alt=" " width="506" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The function is gone.&lt;/p&gt;

&lt;p&gt;The original variable is gone.&lt;/p&gt;

&lt;p&gt;But the object is still alive because &lt;strong&gt;something still references it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And that's the key idea to remember.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Objects don't stay alive because the function that created them still exists. They stay alive because something can still reach them.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once you understand this idea, a lot of JavaScript starts making more sense.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;why objects can be shared,&lt;/li&gt;
&lt;li&gt;why changing an object through one variable affects another,&lt;/li&gt;
&lt;li&gt;and how garbage collection knows when an object can finally be removed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We'll look at that next.&lt;/p&gt;

&lt;h1&gt;
  
  
  If Objects Stay in Memory... Won't Memory Keep Filling Up?
&lt;/h1&gt;

&lt;p&gt;Now we know something important.&lt;/p&gt;

&lt;p&gt;Objects stored in the Heap don't disappear just because a function finishes.&lt;/p&gt;

&lt;p&gt;Instead, they stay alive as long as they're still being used.&lt;/p&gt;

&lt;p&gt;But that raises another question.&lt;/p&gt;

&lt;p&gt;Imagine your program creates thousands of objects every minute.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;name&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every time this function runs, a new object is created.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Charlie&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If these objects stay in memory after the function returns...&lt;/p&gt;

&lt;p&gt;Wouldn't your computer eventually run out of memory?&lt;/p&gt;

&lt;p&gt;Fortunately, the answer is &lt;strong&gt;no&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And that's because of something called &lt;strong&gt;Garbage Collection&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Is Garbage Collection?
&lt;/h1&gt;

&lt;p&gt;Garbage Collection is a process that automatically removes objects from the Heap when they're no longer needed.&lt;/p&gt;

&lt;p&gt;Think of it like a cleaning service.&lt;/p&gt;

&lt;p&gt;Imagine you move out of an apartment.&lt;/p&gt;

&lt;p&gt;As long as someone is still living there, the apartment stays occupied.&lt;/p&gt;

&lt;p&gt;But once everyone moves out, the apartment becomes empty.&lt;/p&gt;

&lt;p&gt;Eventually, someone comes along, cleans it, and makes it available for the next tenant.&lt;/p&gt;

&lt;p&gt;Garbage Collection works in a similar way.&lt;/p&gt;

&lt;p&gt;It doesn't remove objects immediately.&lt;/p&gt;

&lt;p&gt;Instead, from time to time, JavaScript checks which objects are still reachable.&lt;/p&gt;

&lt;p&gt;If an object can no longer be reached by your program, it becomes garbage.&lt;/p&gt;

&lt;p&gt;The Garbage Collector can safely remove it and reuse that memory later.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Most Important Word: Reachable
&lt;/h1&gt;

&lt;p&gt;When people first learn about Garbage Collection, they often think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Objects are deleted when a function ends."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's not true.&lt;/p&gt;

&lt;p&gt;The real rule is much simpler.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;An object stays alive as long as your program can still reach it.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's see what that means.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ada&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Right now, the object is alive because the variable &lt;code&gt;user&lt;/code&gt; points to it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flut7gjqxc5ozs6atvqzx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flut7gjqxc5ozs6atvqzx.png" alt=" " width="513" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now suppose we do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What happened?&lt;/p&gt;

&lt;p&gt;The variable no longer points to the object.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5x31ggirqef6cbe5675u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5x31ggirqef6cbe5675u.png" alt=" " width="512" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, nothing in our program knows where that object is anymore.&lt;/p&gt;

&lt;p&gt;No variable points to it.&lt;/p&gt;

&lt;p&gt;No array contains it.&lt;/p&gt;

&lt;p&gt;No object references it.&lt;/p&gt;

&lt;p&gt;It has become &lt;strong&gt;unreachable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Since the program can never use that object again, the Garbage Collector is free to remove it from memory.&lt;/p&gt;

&lt;p&gt;Notice something important.&lt;/p&gt;

&lt;p&gt;The object wasn't removed because we wrote &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It became removable because &lt;strong&gt;nothing references it anymore&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's a very important difference.&lt;/p&gt;




&lt;h1&gt;
  
  
  Garbage Collection Doesn't Run Immediately
&lt;/h1&gt;

&lt;p&gt;Here's another common misunderstanding.&lt;/p&gt;

&lt;p&gt;Some beginners think that as soon as an object becomes unreachable, JavaScript instantly deletes it.&lt;/p&gt;

&lt;p&gt;That's not how it works.&lt;/p&gt;

&lt;p&gt;Garbage Collection runs from time to time while your program is running.&lt;/p&gt;

&lt;p&gt;When it runs, it looks for objects that are no longer reachable.&lt;/p&gt;

&lt;p&gt;Then it cleans them up.&lt;/p&gt;

&lt;p&gt;Exactly when this happens depends on the JavaScript engine.&lt;/p&gt;

&lt;p&gt;As developers, we don't control it.&lt;/p&gt;

&lt;p&gt;And most of the time, we don't need to.&lt;/p&gt;

&lt;p&gt;Our job is simply to stop referencing objects that we no longer need.&lt;/p&gt;

&lt;p&gt;The JavaScript engine takes care of the rest.&lt;/p&gt;




&lt;h1&gt;
  
  
  How Is This Different From C?
&lt;/h1&gt;

&lt;p&gt;JavaScript makes memory management much easier.&lt;/p&gt;

&lt;p&gt;But not every programming language works this way.&lt;/p&gt;

&lt;p&gt;In the C programming language, the programmer is responsible for managing heap memory manually.&lt;/p&gt;

&lt;p&gt;When you allocate memory, you must also remember to free it later.&lt;/p&gt;

&lt;p&gt;If you forget, that memory stays allocated even though your program no longer needs it.&lt;/p&gt;

&lt;p&gt;This is called a &lt;strong&gt;memory leak&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Imagine checking into a hotel and never checking out.&lt;/p&gt;

&lt;p&gt;Even if nobody is using the room anymore, nobody else can use it either.&lt;/p&gt;

&lt;p&gt;The room stays occupied until someone finally clears it.&lt;/p&gt;

&lt;p&gt;That's similar to what happens with a memory leak.&lt;/p&gt;

&lt;p&gt;The memory exists.&lt;/p&gt;

&lt;p&gt;But it's no longer doing anything useful.&lt;/p&gt;




&lt;h1&gt;
  
  
  Does JavaScript Have Memory Leaks?
&lt;/h1&gt;

&lt;p&gt;At this point, you might think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Since JavaScript has Garbage Collection, memory leaks can't happen."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unfortunately, they still can.&lt;/p&gt;

&lt;p&gt;Remember the rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Garbage Collection only removes objects that are unreachable.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your program accidentally keeps a reference to an object that it no longer needs, the Garbage Collector assumes you're still using it.&lt;/p&gt;

&lt;p&gt;So it leaves the object in memory.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="nx"&gt;name&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every time this function runs, a new object is added to the &lt;code&gt;users&lt;/code&gt; array.&lt;/p&gt;

&lt;p&gt;As long as that array exists, every object inside it is still reachable.&lt;/p&gt;

&lt;p&gt;Even if you never use those objects again, the Garbage Collector cannot remove them because your program still has a reference to them.&lt;/p&gt;

&lt;p&gt;This is one of the most common reasons memory leaks happen in JavaScript.&lt;/p&gt;

&lt;p&gt;Not because the Garbage Collector failed...&lt;/p&gt;

&lt;p&gt;But because our code accidentally kept references that were no longer needed.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Big Idea
&lt;/h1&gt;

&lt;p&gt;At first, it might seem like the Garbage Collector magically knows which objects to delete.&lt;/p&gt;

&lt;p&gt;But the idea is actually much simpler.&lt;/p&gt;

&lt;p&gt;It asks one question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Can the program still reach this object?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the answer is &lt;strong&gt;yes&lt;/strong&gt;, the object stays.&lt;/p&gt;

&lt;p&gt;If the answer is &lt;strong&gt;no&lt;/strong&gt;, the object can eventually be removed.&lt;/p&gt;

&lt;p&gt;Everything else about Garbage Collection builds on this single idea.&lt;/p&gt;

&lt;p&gt;Once you understand &lt;strong&gt;reachability&lt;/strong&gt;, you've already understood one of the most important concepts in memory management.&lt;/p&gt;

&lt;h1&gt;
  
  
  When Things Go Wrong: Stack Overflow vs Memory Leak
&lt;/h1&gt;

&lt;p&gt;Now that we understand how the Stack and the Heap work, let's look at two very common memory-related problems.&lt;/p&gt;

&lt;p&gt;Although they both involve memory, they're completely different.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Stack Overflow&lt;/strong&gt; happens because the &lt;strong&gt;Stack runs out of space&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Memory Leak&lt;/strong&gt; happens because the &lt;strong&gt;Heap keeps holding memory that is no longer needed&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's understand them one at a time.&lt;/p&gt;




&lt;h1&gt;
  
  
  Stack Overflow
&lt;/h1&gt;

&lt;p&gt;Earlier, we learned that every function call creates a new stack frame.&lt;/p&gt;

&lt;p&gt;When the function finishes, that frame is removed.&lt;/p&gt;

&lt;p&gt;Normally, this works perfectly.&lt;/p&gt;

&lt;p&gt;For example, consider this function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Hello, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alex&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The sequence looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuaeuwriog3qmmz1tt3iv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuaeuwriog3qmmz1tt3iv.png" alt=" " width="397" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Stack grows a little while the function is running, then immediately shrinks again.&lt;/p&gt;

&lt;p&gt;No problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  But What If the Function Never Stops Calling Itself?
&lt;/h2&gt;

&lt;p&gt;Now let's look at a different example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;recurseForever&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;recurseForever&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;recurseForever&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first, nothing looks unusual.&lt;/p&gt;

&lt;p&gt;The function calls itself.&lt;/p&gt;

&lt;p&gt;Then it calls itself again.&lt;/p&gt;

&lt;p&gt;And again.&lt;/p&gt;

&lt;p&gt;And again.&lt;/p&gt;

&lt;p&gt;Each call creates a &lt;strong&gt;new stack frame&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpibn6pw7thohro4uxtsw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpibn6pw7thohro4uxtsw.png" alt=" " width="346" height="572"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice something important.&lt;/p&gt;

&lt;p&gt;None of these function calls can finish yet.&lt;/p&gt;

&lt;p&gt;Each one is waiting for the next call to return.&lt;/p&gt;

&lt;p&gt;So none of the stack frames can be removed.&lt;/p&gt;

&lt;p&gt;The Stack keeps growing.&lt;/p&gt;

&lt;p&gt;Eventually, it reaches its maximum size.&lt;/p&gt;

&lt;p&gt;When that happens, JavaScript throws an error similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RangeError:
Maximum call stack size exceeded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is called a &lt;strong&gt;Stack Overflow&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The program didn't run out of RAM.&lt;/p&gt;

&lt;p&gt;It simply ran out of &lt;strong&gt;Stack space&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem Isn't Recursion
&lt;/h2&gt;

&lt;p&gt;Many beginners hear about Stack Overflow and think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"So recursion is bad."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not at all.&lt;/p&gt;

&lt;p&gt;Recursion is a perfectly valid programming technique.&lt;/p&gt;

&lt;p&gt;The real problem is &lt;strong&gt;recursion without a reachable stopping condition&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let's compare two examples.&lt;/p&gt;

&lt;p&gt;This one is safe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;countdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;countdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;countdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eventually, &lt;code&gt;n&lt;/code&gt; becomes &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The function stops calling itself.&lt;/p&gt;

&lt;p&gt;Each stack frame returns.&lt;/p&gt;

&lt;p&gt;The Stack becomes empty again.&lt;/p&gt;

&lt;p&gt;Everything works correctly.&lt;/p&gt;

&lt;p&gt;Now compare that with this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;recurseForever&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;recurseForever&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no stopping condition.&lt;/p&gt;

&lt;p&gt;The function keeps creating new stack frames forever.&lt;/p&gt;

&lt;p&gt;That's why the Stack overflows.&lt;/p&gt;

&lt;p&gt;So the issue isn't recursion itself.&lt;/p&gt;

&lt;p&gt;The issue is &lt;strong&gt;never giving recursion a chance to end&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Memory Leaks
&lt;/h1&gt;

&lt;p&gt;Stack Overflow happens because the Stack fills up.&lt;/p&gt;

&lt;p&gt;Memory leaks are different.&lt;/p&gt;

&lt;p&gt;They happen in the &lt;strong&gt;Heap&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Remember what we learned about Garbage Collection.&lt;/p&gt;

&lt;p&gt;An object stays alive as long as something still references it.&lt;/p&gt;

&lt;p&gt;Now imagine we accidentally keep references to objects that we no longer need.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="nx"&gt;name&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every time this function runs, another object is added to the array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Charlie&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The array keeps growing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;users

↓

[
  { name: "Alice" },
  { name: "Bob" },
  { name: "Charlie" }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we never remove these objects, they stay reachable through the &lt;code&gt;users&lt;/code&gt; array.&lt;/p&gt;

&lt;p&gt;That means the Garbage Collector cannot remove them.&lt;/p&gt;

&lt;p&gt;If this continues for a long time, the application uses more and more memory.&lt;/p&gt;

&lt;p&gt;This is called a &lt;strong&gt;memory leak&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why It's Called a "Leak"
&lt;/h2&gt;

&lt;p&gt;Think of a water tank.&lt;/p&gt;

&lt;p&gt;You keep pouring water into it.&lt;/p&gt;

&lt;p&gt;But nothing ever comes out.&lt;/p&gt;

&lt;p&gt;Eventually, the tank becomes full.&lt;/p&gt;

&lt;p&gt;A memory leak is similar.&lt;/p&gt;

&lt;p&gt;Your program keeps allocating memory.&lt;/p&gt;

&lt;p&gt;But because old objects are still being referenced, that memory is never released.&lt;/p&gt;

&lt;p&gt;Over time, memory usage keeps growing.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Quick Comparison
&lt;/h2&gt;

&lt;p&gt;Although Stack Overflow and Memory Leak are both related to memory, they happen for completely different reasons.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stack Overflow&lt;/th&gt;
&lt;th&gt;Memory Leak&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Happens in the &lt;strong&gt;Stack&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Happens in the &lt;strong&gt;Heap&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usually caused by very deep or infinite recursion&lt;/td&gt;
&lt;td&gt;Usually caused by keeping references to objects you no longer need&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Happens quickly&lt;/td&gt;
&lt;td&gt;Often happens slowly over time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crashes the program immediately&lt;/td&gt;
&lt;td&gt;Gradually increases memory usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solved by reducing recursion or using iteration&lt;/td&gt;
&lt;td&gt;Solved by removing unnecessary references&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Understanding this difference is important because the solutions are completely different.&lt;/p&gt;

&lt;p&gt;If your Stack overflows, adding more RAM won't help.&lt;/p&gt;

&lt;p&gt;If your application has a memory leak, fixing recursion won't help either.&lt;/p&gt;

&lt;p&gt;The first problem is about &lt;strong&gt;running out of stack space&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The second is about &lt;strong&gt;holding onto heap memory longer than necessary&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Knowing which problem you're dealing with is the first step toward fixing it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Common Misunderstandings About Stack and Heap
&lt;/h1&gt;

&lt;p&gt;By now, you've learned how the Stack and the Heap work together.&lt;/p&gt;

&lt;p&gt;But there are a few misunderstandings that almost every beginner has at some point.&lt;/p&gt;

&lt;p&gt;Let's clear them up.&lt;/p&gt;




&lt;h2&gt;
  
  
  ❌ "Everything inside a function disappears when the function returns."
&lt;/h2&gt;

&lt;p&gt;This is probably the most common misunderstanding.&lt;/p&gt;

&lt;p&gt;Let's look at this example again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ada&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first glance, it seems like everything inside &lt;code&gt;createUser()&lt;/code&gt; should disappear after the function finishes.&lt;/p&gt;

&lt;p&gt;And that's partly true.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;variable&lt;/strong&gt; &lt;code&gt;user&lt;/code&gt; disappears because it belongs to the function's stack frame.&lt;/p&gt;

&lt;p&gt;But the &lt;strong&gt;object&lt;/strong&gt; doesn't disappear.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because the object lives in the Heap, and the variable &lt;code&gt;person&lt;/code&gt; now holds a reference to it.&lt;/p&gt;

&lt;p&gt;You can picture it like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj3hokhojzp3j8908yeac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj3hokhojzp3j8908yeac.png" alt=" " width="467" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The function is gone.&lt;/p&gt;

&lt;p&gt;The original variable is gone.&lt;/p&gt;

&lt;p&gt;But the object is still reachable.&lt;/p&gt;

&lt;p&gt;And as long as it's reachable, it stays alive.&lt;/p&gt;

&lt;p&gt;This is an important distinction.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Variables can disappear while the objects they point to continue to exist.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ❌ "Primitive values are always on the Stack, and objects are always on the Heap."
&lt;/h2&gt;

&lt;p&gt;You'll often hear people say this online.&lt;/p&gt;

&lt;p&gt;It's a useful simplification when you're first learning, but it's not the complete story.&lt;/p&gt;

&lt;p&gt;In JavaScript, it's helpful to think this way because it matches how the language behaves from a developer's point of view.&lt;/p&gt;

&lt;p&gt;However, modern JavaScript engines are highly optimized.&lt;/p&gt;

&lt;p&gt;They can sometimes store or optimize values differently behind the scenes.&lt;/p&gt;

&lt;p&gt;The important thing to remember isn't &lt;em&gt;where every byte lives&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The important thing is understanding how values behave.&lt;/p&gt;

&lt;p&gt;For beginners, this mental model works well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Primitive values behave like simple values.&lt;/li&gt;
&lt;li&gt;Objects and arrays behave like references to data that can outlive the current function.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you learn more about JavaScript engines like V8, you'll discover that the implementation is more complex.&lt;/p&gt;

&lt;p&gt;But for now, this model is exactly what you need.&lt;/p&gt;




&lt;h2&gt;
  
  
  ❌ "Garbage Collection removes objects immediately."
&lt;/h2&gt;

&lt;p&gt;This is another very common misconception.&lt;/p&gt;

&lt;p&gt;Imagine you do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ada&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The object has become unreachable.&lt;/p&gt;

&lt;p&gt;Does JavaScript delete it immediately?&lt;/p&gt;

&lt;p&gt;Not necessarily.&lt;/p&gt;

&lt;p&gt;The Garbage Collector runs from time to time while your program is running.&lt;/p&gt;

&lt;p&gt;When it runs, it looks for unreachable objects and removes them.&lt;/p&gt;

&lt;p&gt;So it's better to think of Garbage Collection like a cleaning service.&lt;/p&gt;

&lt;p&gt;The room becomes empty first.&lt;/p&gt;

&lt;p&gt;The cleaner comes later.&lt;/p&gt;




&lt;h2&gt;
  
  
  ❌ "Recursion is bad."
&lt;/h2&gt;

&lt;p&gt;After learning about Stack Overflow, some people become afraid of recursion.&lt;/p&gt;

&lt;p&gt;But recursion itself isn't the problem.&lt;/p&gt;

&lt;p&gt;Many algorithms are naturally recursive, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;traversing a file system,&lt;/li&gt;
&lt;li&gt;exploring a tree,&lt;/li&gt;
&lt;li&gt;walking through nested JSON,&lt;/li&gt;
&lt;li&gt;or solving divide-and-conquer problems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real problem is recursion that never reaches a stopping condition or recursion that's much deeper than the available stack space.&lt;/p&gt;

&lt;p&gt;A well-written recursive function is just as valid as an iterative one.&lt;/p&gt;

&lt;p&gt;The important thing is knowing when each approach is appropriate.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Special Note for C and C++ Developers
&lt;/h2&gt;

&lt;p&gt;If you're learning JavaScript, you don't have to worry about this section right away.&lt;/p&gt;

&lt;p&gt;But if you ever move to languages like &lt;strong&gt;C&lt;/strong&gt; or &lt;strong&gt;C++&lt;/strong&gt;, there's one mistake you'll hear about very often.&lt;/p&gt;

&lt;p&gt;Returning a pointer to a local stack variable.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;getNumber&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// ❌ Dangerous&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first, this might seem reasonable.&lt;/p&gt;

&lt;p&gt;The function returns the address of &lt;code&gt;value&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But remember what happens when a function finishes.&lt;/p&gt;

&lt;p&gt;Its stack frame is removed.&lt;/p&gt;

&lt;p&gt;That means &lt;code&gt;value&lt;/code&gt; no longer exists.&lt;/p&gt;

&lt;p&gt;The returned pointer now points to memory that is no longer valid.&lt;/p&gt;

&lt;p&gt;This is called a &lt;strong&gt;dangling pointer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Trying to use that pointer later leads to undefined behavior, which means the program could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;appear to work,&lt;/li&gt;
&lt;li&gt;produce incorrect results,&lt;/li&gt;
&lt;li&gt;or crash completely.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fortunately, JavaScript developers never deal with dangling pointers because memory management is handled automatically.&lt;/p&gt;

&lt;p&gt;Still, this example highlights an important idea that applies to every language:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Data stored in a function's stack frame cannot outlive that function.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's one of the main reasons long-lived data belongs in the Heap instead of the Stack.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Mental Model You Should Remember
&lt;/h1&gt;

&lt;p&gt;After everything we've discussed, Stack and Heap memory might still feel like a lot of different pieces.&lt;/p&gt;

&lt;p&gt;So let's put everything together into one simple mental model.&lt;/p&gt;

&lt;p&gt;Imagine your program is running.&lt;/p&gt;

&lt;p&gt;A function gets called.&lt;/p&gt;

&lt;p&gt;What happens?&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: A Function Call Creates a Stack Frame
&lt;/h2&gt;

&lt;p&gt;Every time a function starts, the program creates a new stack frame.&lt;/p&gt;

&lt;p&gt;That frame stores information that belongs only to that function:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;function parameters,&lt;/li&gt;
&lt;li&gt;local variables,&lt;/li&gt;
&lt;li&gt;and the place where the program should continue afterward.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;tax&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While this function runs, the Stack contains its temporary workspace.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0t6fhutzu4j2ni74mbh5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0t6fhutzu4j2ni74mbh5.png" alt=" " width="433" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the function finishes, the frame disappears.&lt;/p&gt;

&lt;p&gt;The Stack cleans itself automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Objects Need a Longer Home
&lt;/h2&gt;

&lt;p&gt;Now imagine the function creates an object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createAccount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;alex&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The object needs to survive after the function finishes.&lt;/p&gt;

&lt;p&gt;So the object is stored in the Heap.&lt;/p&gt;

&lt;p&gt;The Stack keeps only a reference to it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foc61o2ma6zm2vi2t4vtl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foc61o2ma6zm2vi2t4vtl.png" alt=" " width="490" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The reference can disappear.&lt;/p&gt;

&lt;p&gt;The object can continue living.&lt;/p&gt;

&lt;p&gt;As long as something can still reach that object, it stays alive.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Garbage Collection Cleans Unused Objects
&lt;/h2&gt;

&lt;p&gt;Eventually, an object may no longer be needed.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;account&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;alex&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;account&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now nothing points to that object.&lt;/p&gt;

&lt;p&gt;It becomes unreachable.&lt;/p&gt;

&lt;p&gt;The Garbage Collector can later remove it.&lt;/p&gt;

&lt;p&gt;The important rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Memory is not cleaned because a function ends. Memory is cleaned when data is no longer reachable.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 4: Problems Happen When We Break These Rules
&lt;/h2&gt;

&lt;p&gt;Understanding the rules also helps us understand common problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stack Overflow
&lt;/h3&gt;

&lt;p&gt;The Stack has limited space.&lt;/p&gt;

&lt;p&gt;If functions keep calling themselves forever:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;forever&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;forever&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;New stack frames keep getting added.&lt;/p&gt;

&lt;p&gt;Eventually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stack space exceeded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The program crashes because the Stack cannot grow anymore.&lt;/p&gt;




&lt;h3&gt;
  
  
  Memory Leak
&lt;/h3&gt;

&lt;p&gt;The Heap can hold a lot of data.&lt;/p&gt;

&lt;p&gt;But if your program accidentally keeps references to objects it no longer needs, those objects cannot be removed.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;saveData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;cache&lt;/code&gt; keeps growing forever, old objects remain reachable.&lt;/p&gt;

&lt;p&gt;The Garbage Collector cannot clean them.&lt;/p&gt;

&lt;p&gt;Memory usage keeps increasing.&lt;/p&gt;

&lt;p&gt;That's a memory leak.&lt;/p&gt;




&lt;h1&gt;
  
  
  Stack vs Heap: The Big Picture
&lt;/h1&gt;

&lt;p&gt;Let's compare them one final time.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Stack&lt;/th&gt;
&lt;th&gt;Heap&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;Temporary function data&lt;/td&gt;
&lt;td&gt;Long-lived dynamic data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stores&lt;/td&gt;
&lt;td&gt;Stack frames, local values&lt;/td&gt;
&lt;td&gt;Objects, arrays, complex data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speed&lt;/td&gt;
&lt;td&gt;Very fast&lt;/td&gt;
&lt;td&gt;Slower&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Management&lt;/td&gt;
&lt;td&gt;Automatically removed when functions return&lt;/td&gt;
&lt;td&gt;Removed when no longer reachable (or manually freed in some languages)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size&lt;/td&gt;
&lt;td&gt;Smaller and limited&lt;/td&gt;
&lt;td&gt;Much larger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Common problem&lt;/td&gt;
&lt;td&gt;Stack Overflow&lt;/td&gt;
&lt;td&gt;Memory Leak&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  The One Thing I Want You to Remember
&lt;/h1&gt;

&lt;p&gt;If you remember only one idea from this article, remember this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Stack manages the short life of functions. The Heap manages the longer life of data.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Functions come and go.&lt;/p&gt;

&lt;p&gt;Stack frames are created and destroyed quickly.&lt;/p&gt;

&lt;p&gt;Objects often need to stay around longer.&lt;/p&gt;

&lt;p&gt;That's why we need two different memory areas.&lt;/p&gt;

&lt;p&gt;The Stack gives us speed and automatic cleanup.&lt;/p&gt;

&lt;p&gt;The Heap gives us flexibility and longer lifetimes.&lt;/p&gt;

&lt;p&gt;Neither one is better.&lt;/p&gt;

&lt;p&gt;They solve different problems.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Understanding Stack and Heap won't immediately change how you write code every day.&lt;/p&gt;

&lt;p&gt;You can write many programs without thinking about memory at all.&lt;/p&gt;

&lt;p&gt;But once you understand what's happening underneath, many confusing programming concepts become much clearer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why local variables disappear.&lt;/li&gt;
&lt;li&gt;Why objects survive function calls.&lt;/li&gt;
&lt;li&gt;Why recursion can crash a program.&lt;/li&gt;
&lt;li&gt;Why memory leaks happen.&lt;/li&gt;
&lt;li&gt;Why garbage collection exists.&lt;/li&gt;
&lt;li&gt;Why some languages require manual memory management.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Programming becomes much easier when you stop seeing memory as magic.&lt;/p&gt;

&lt;p&gt;Behind every function call, every object, and every variable, there is a simple system working quietly in the background.&lt;/p&gt;

&lt;p&gt;And now you understand how that system works. 🚀&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Strings look simple... until they surprise you.</title>
      <dc:creator>Shajibul Alam Shihab</dc:creator>
      <pubDate>Tue, 21 Jul 2026 06:05:33 +0000</pubDate>
      <link>https://dev.to/shajibul_alam_shihab/strings-look-simple-until-they-surprise-you-3d8j</link>
      <guid>https://dev.to/shajibul_alam_shihab/strings-look-simple-until-they-surprise-you-3d8j</guid>
      <description>&lt;h1&gt;
  
  
  Strings &amp;amp; Text Processing: Text Isn't as Simple as It Looks
&lt;/h1&gt;

&lt;p&gt;If someone asks you what's the simplest type of data in programming, there's a good chance you'll say &lt;strong&gt;strings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After all, they're just text.&lt;/p&gt;

&lt;p&gt;A person's name is a string.&lt;/p&gt;

&lt;p&gt;An email address is a string.&lt;/p&gt;

&lt;p&gt;A password is a string.&lt;/p&gt;

&lt;p&gt;Even the message you're reading right now is just a collection of strings.&lt;/p&gt;

&lt;p&gt;At first glance, there doesn't seem to be much to learn. You create a string, print it, compare it with another string, and move on.&lt;/p&gt;

&lt;p&gt;But after writing a few programs, things start getting... strange.&lt;/p&gt;

&lt;p&gt;You convert &lt;code&gt;"hello"&lt;/code&gt; into uppercase, yet the original string somehow stays the same.&lt;/p&gt;

&lt;p&gt;An emoji that looks like a single character suddenly reports a length of &lt;strong&gt;2&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Joining thousands of small strings together makes your program unexpectedly slower.&lt;/p&gt;

&lt;p&gt;And then someone introduces you to something called &lt;strong&gt;Regex&lt;/strong&gt;, which looks less like code and more like an ancient spell.&lt;/p&gt;

&lt;p&gt;None of these are bugs. They're simply the result of how strings actually work behind the scenes.&lt;/p&gt;

&lt;p&gt;In this lesson, we'll uncover those hidden details one by one.&lt;/p&gt;




&lt;h1&gt;
  
  
  Surprise #1: Why Didn't the String Change?
&lt;/h1&gt;

&lt;p&gt;Take a look at this code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;original&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shouted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;original&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;original&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;shouted&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What would you expect the output to be?&lt;/p&gt;

&lt;p&gt;Many beginners think the output will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HELLO
HELLO
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But that's not what happens.&lt;/p&gt;

&lt;p&gt;Instead, JavaScript prints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hello
HELLO
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The original string remains exactly as it was.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because &lt;strong&gt;strings are immutable&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Does "Immutable" Mean?
&lt;/h2&gt;

&lt;p&gt;The word &lt;strong&gt;immutable&lt;/strong&gt; simply means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Once something is created, it cannot be changed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Think of a printed book.&lt;/p&gt;

&lt;p&gt;If you want every occurrence of the word &lt;em&gt;hello&lt;/em&gt; to become &lt;em&gt;HELLO&lt;/em&gt;, you don't magically change the ink that's already on the paper.&lt;/p&gt;

&lt;p&gt;Instead, you print a new copy with the updated text.&lt;/p&gt;

&lt;p&gt;Strings behave in a similar way.&lt;/p&gt;

&lt;p&gt;Whenever you use methods like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;toUpperCase()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toLowerCase()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;replace()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;concat()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;the original string stays untouched.&lt;/p&gt;

&lt;p&gt;Instead, JavaScript creates a &lt;strong&gt;brand-new string&lt;/strong&gt; and returns it.&lt;/p&gt;

&lt;p&gt;That's why this works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;original&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shouted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;original&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of modifying &lt;code&gt;original&lt;/code&gt;, JavaScript creates another string containing &lt;code&gt;"HELLO"&lt;/code&gt; and stores it inside &lt;code&gt;shouted&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This behavior isn't unique to JavaScript.&lt;/p&gt;

&lt;p&gt;Python, Java, C#, and many modern programming languages treat strings the same way.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Design Strings This Way?
&lt;/h2&gt;

&lt;p&gt;At first, immutability sounds like an unnecessary restriction.&lt;/p&gt;

&lt;p&gt;Why not simply change the existing string?&lt;/p&gt;

&lt;p&gt;Because immutable data is much safer.&lt;/p&gt;

&lt;p&gt;Imagine two different parts of your program are using the same string.&lt;/p&gt;

&lt;p&gt;If one part secretly changes it, the other part suddenly starts seeing different data, which can lead to bugs that are extremely difficult to track down.&lt;/p&gt;

&lt;p&gt;By making strings immutable, programming languages guarantee that once a string is created, nobody can unexpectedly modify it.&lt;/p&gt;

&lt;p&gt;Whenever a change is needed, a completely new string is created instead.&lt;/p&gt;

&lt;p&gt;It might seem like a small design decision, but it prevents countless bugs in large applications.&lt;/p&gt;




&lt;h1&gt;
  
  
  A Hidden Cost of Creating New Strings
&lt;/h1&gt;

&lt;p&gt;Creating new strings is usually so fast that you never notice it.&lt;/p&gt;

&lt;p&gt;But imagine doing it thousands or even millions of times.&lt;/p&gt;

&lt;p&gt;Consider this loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;word&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JavaScript&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;is&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;awesome&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;word&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code looks perfectly reasonable.&lt;/p&gt;

&lt;p&gt;But here's what's happening behind the scenes.&lt;/p&gt;

&lt;p&gt;Initially:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;""
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the first iteration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"JavaScript"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The old empty string is discarded.&lt;/p&gt;

&lt;p&gt;Next iteration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"JavaScriptis"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The previous string is discarded again.&lt;/p&gt;

&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"JavaScriptisawesome"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another new string is created.&lt;/p&gt;

&lt;p&gt;Even though we only care about the final result, JavaScript had to create multiple temporary strings along the way.&lt;/p&gt;

&lt;p&gt;For three words, that's not a problem.&lt;/p&gt;

&lt;p&gt;For three million words, it becomes expensive.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Better Approach
&lt;/h1&gt;

&lt;p&gt;When building large pieces of text, programmers usually avoid repeatedly using &lt;code&gt;+=&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Instead, they collect all the pieces first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;word&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JavaScript&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;is&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;awesome&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;word&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of constantly creating new strings, we simply store each word inside an array.&lt;/p&gt;

&lt;p&gt;Only at the very end do we combine everything into one final string.&lt;/p&gt;

&lt;p&gt;This creates far fewer temporary objects and is generally much more efficient when working with large amounts of text.&lt;/p&gt;

&lt;p&gt;That doesn't mean you should never use &lt;code&gt;+=&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For small strings, it's perfectly fine and often easier to read.&lt;/p&gt;

&lt;p&gt;But when performance matters or when you're building very large strings inside loops collecting pieces first and joining them later is the better approach.&lt;/p&gt;




&lt;h1&gt;
  
  
  Strings Seem Simple... Until They Aren't
&lt;/h1&gt;

&lt;p&gt;So far, we've learned two important things.&lt;/p&gt;

&lt;p&gt;First, strings never change after they're created.&lt;/p&gt;

&lt;p&gt;Second, every "modification" actually creates a completely new string.&lt;/p&gt;

&lt;p&gt;Most of the time, that's all you need to know.&lt;/p&gt;

&lt;p&gt;But then something even stranger happens.&lt;/p&gt;

&lt;p&gt;You write this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;😀&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And JavaScript replies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not &lt;strong&gt;1&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;How can a single emoji have a length of two?&lt;/p&gt;

&lt;p&gt;To answer that, we need to look beyond strings themselves and understand how computers store text in memory.&lt;/p&gt;




&lt;h1&gt;
  
  
  Surprise #2: Why Does One Emoji Have a Length of 2?
&lt;/h1&gt;

&lt;p&gt;At first, this feels like a bug.&lt;/p&gt;

&lt;p&gt;You can clearly see one emoji.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;😀&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yet JavaScript says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How can one visible character suddenly become two?&lt;/p&gt;

&lt;p&gt;The answer has nothing to do with emojis.&lt;/p&gt;

&lt;p&gt;It has everything to do with &lt;strong&gt;how computers store text&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Computers Don't Understand Letters
&lt;/h2&gt;

&lt;p&gt;When you type the letter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you see a character.&lt;/p&gt;

&lt;p&gt;But your computer doesn't.&lt;/p&gt;

&lt;p&gt;Computers only understand &lt;strong&gt;numbers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So before any text can be stored, every character must first be converted into numbers.&lt;/p&gt;

&lt;p&gt;This conversion is called &lt;strong&gt;text encoding&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Think of encoding as a giant dictionary.&lt;/p&gt;

&lt;p&gt;Instead of storing the actual letter &lt;strong&gt;A&lt;/strong&gt;, the computer stores a number that represents &lt;strong&gt;A&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When it reads that number again, it knows to display the letter &lt;strong&gt;A&lt;/strong&gt; on your screen.&lt;/p&gt;

&lt;p&gt;The same idea works for every language.&lt;/p&gt;

&lt;p&gt;Whether it's English,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Arabic,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;مرحبا
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Japanese,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;こんにちは
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or Bengali,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;হ্যালো
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;they're all stored as numbers behind the scenes.&lt;/p&gt;




&lt;h1&gt;
  
  
  Enter UTF-8
&lt;/h1&gt;

&lt;p&gt;Years ago, computers mostly dealt with English text.&lt;/p&gt;

&lt;p&gt;A simple encoding called &lt;strong&gt;ASCII&lt;/strong&gt; was enough because it only needed to represent English letters, digits, and a few symbols.&lt;/p&gt;

&lt;p&gt;But the internet changed everything.&lt;/p&gt;

&lt;p&gt;Suddenly, computers needed to store text from almost every language in the world.&lt;/p&gt;

&lt;p&gt;Not just that they also needed to support symbols, currency signs, mathematical operators, and eventually emojis.&lt;/p&gt;

&lt;p&gt;That's why modern software largely uses an encoding called &lt;strong&gt;UTF-8&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;UTF-8 is clever.&lt;/p&gt;

&lt;p&gt;Instead of giving every character the same amount of storage, it uses &lt;strong&gt;only as much space as needed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most English letters use &lt;strong&gt;1 byte&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Many accented characters use &lt;strong&gt;2 bytes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Some Asian characters use &lt;strong&gt;3 bytes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Many emojis use &lt;strong&gt;4 bytes&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps English text compact while still allowing virtually every written language to be represented.&lt;/p&gt;




&lt;h1&gt;
  
  
  Then Why Does JavaScript Say 2?
&lt;/h1&gt;

&lt;p&gt;Here's the confusing part.&lt;/p&gt;

&lt;p&gt;Even though UTF-8 is the most common encoding for storing and transmitting text, &lt;strong&gt;JavaScript doesn't use UTF-8 to calculate &lt;code&gt;.length&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead, JavaScript stores strings internally using &lt;strong&gt;UTF-16&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And &lt;code&gt;.length&lt;/code&gt; doesn't count "characters" the way humans see them.&lt;/p&gt;

&lt;p&gt;It counts &lt;strong&gt;UTF-16 code units&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Most everyday characters fit into a single code unit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;
&lt;span class="c1"&gt;// 1&lt;/span&gt;

&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;B&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;
&lt;span class="c1"&gt;// 1&lt;/span&gt;

&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;7&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;
&lt;span class="c1"&gt;// 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But many emojis are too large to fit into just one UTF-16 code unit.&lt;/p&gt;

&lt;p&gt;So JavaScript stores them using &lt;strong&gt;two&lt;/strong&gt; code units.&lt;/p&gt;

&lt;p&gt;That's why this happens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;😀&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You still see one emoji.&lt;/p&gt;

&lt;p&gt;But internally, JavaScript needs two UTF-16 code units to represent it.&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;.length&lt;/code&gt; reports &lt;strong&gt;2&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Wait... Does &lt;code&gt;length&lt;/code&gt; Lie?
&lt;/h1&gt;

&lt;p&gt;Not exactly.&lt;/p&gt;

&lt;p&gt;It simply answers a different question.&lt;/p&gt;

&lt;p&gt;Most beginners assume &lt;code&gt;.length&lt;/code&gt; means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How many characters can I see?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But JavaScript is actually answering:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How many UTF-16 code units are stored?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those aren't always the same thing.&lt;/p&gt;

&lt;p&gt;For everyday English text, they usually match.&lt;/p&gt;

&lt;p&gt;For emojis and some less common Unicode characters, they don't.&lt;/p&gt;

&lt;p&gt;That's why it's safer to think of &lt;code&gt;.length&lt;/code&gt; as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The internal length of this JavaScript string."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;rather than&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The number of visible characters."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  This Doesn't Only Affect Emojis
&lt;/h1&gt;

&lt;p&gt;Emojis are the easiest example because they're familiar.&lt;/p&gt;

&lt;p&gt;But they're not the only ones.&lt;/p&gt;

&lt;p&gt;Some languages contain characters that are formed by combining multiple Unicode values.&lt;/p&gt;

&lt;p&gt;Some accented letters can also be represented in more than one way.&lt;/p&gt;

&lt;p&gt;Even certain flags are actually made by combining two separate Unicode characters into what looks like a single symbol.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🇺🇸
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;looks like one flag.&lt;/p&gt;

&lt;p&gt;Behind the scenes, it's actually composed of multiple Unicode code points.&lt;/p&gt;

&lt;p&gt;This is why working with text across different languages can be surprisingly complex.&lt;/p&gt;

&lt;p&gt;Fortunately, for most everyday applications, you don't need to worry about these details unless you're doing advanced text processing.&lt;/p&gt;

&lt;p&gt;Still, it's useful to know that &lt;strong&gt;what humans see as one character isn't always what the computer stores as one unit.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Now That We Know How Text Is Stored...
&lt;/h1&gt;

&lt;p&gt;Understanding encoding explains a lot of strange behavior.&lt;/p&gt;

&lt;p&gt;But most of the time, we're not thinking about bytes or Unicode.&lt;/p&gt;

&lt;p&gt;We're simply trying to answer practical questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How do I remove extra spaces from user input?&lt;/li&gt;
&lt;li&gt;How do I split a full name into first and last name?&lt;/li&gt;
&lt;li&gt;How do I check whether a sentence contains a specific word?&lt;/li&gt;
&lt;li&gt;How do I extract all the numbers from a block of text?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the kinds of operations you'll use almost every day.&lt;/p&gt;

&lt;p&gt;Fortunately, programming languages give us a rich toolbox for working with strings.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Everyday String Toolbox
&lt;/h1&gt;

&lt;p&gt;Most of the time, we don't spend our day thinking about UTF-8, UTF-16, or immutable strings.&lt;/p&gt;

&lt;p&gt;We're simply trying to work with text.&lt;/p&gt;

&lt;p&gt;Maybe we're reading a user's name from a form.&lt;/p&gt;

&lt;p&gt;Maybe we're processing a CSV file.&lt;/p&gt;

&lt;p&gt;Maybe we're cleaning data before saving it to a database.&lt;/p&gt;

&lt;p&gt;Fortunately, most programming languages provide a handful of string methods that you'll use over and over again.&lt;/p&gt;

&lt;p&gt;To keep things simple, let's work with the same piece of text throughout this section.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;  Ada Lovelace, 1815-1852  &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first glance, it looks fine.&lt;/p&gt;

&lt;p&gt;But if you look carefully, you'll notice two extra spaces at the beginning and two more at the end.&lt;/p&gt;

&lt;p&gt;Small details like these are surprisingly common when dealing with user input.&lt;/p&gt;

&lt;p&gt;Let's clean it up.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 1: Remove Unwanted Spaces
&lt;/h1&gt;

&lt;p&gt;The first tool every programmer should know is &lt;code&gt;trim()&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trimmed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now our string becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ada Lovelace, 1815-1852
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The extra spaces are gone.&lt;/p&gt;

&lt;p&gt;One important thing to remember is that &lt;code&gt;trim()&lt;/code&gt; &lt;strong&gt;doesn't change the original string&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Remember what we learned earlier?&lt;/p&gt;

&lt;p&gt;Strings are immutable.&lt;/p&gt;

&lt;p&gt;So this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;does absolutely nothing useful if you ignore the returned value.&lt;/p&gt;

&lt;p&gt;You need to store the new string somewhere.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trimmed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tiny habit saves beginners from a lot of confusion.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why Is &lt;code&gt;trim()&lt;/code&gt; So Important?
&lt;/h1&gt;

&lt;p&gt;Imagine a login form.&lt;/p&gt;

&lt;p&gt;A user accidentally types:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;john@example.com␠
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the invisible space at the end.&lt;/p&gt;

&lt;p&gt;To us, it looks exactly like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;john@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But to the computer, they're different strings.&lt;/p&gt;

&lt;p&gt;Without trimming the input, a perfectly valid email might fail to match what's stored in your database.&lt;/p&gt;

&lt;p&gt;That's why one of the simplest best practices is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Whenever text comes from a user, trim it before comparing or storing it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It removes accidental spaces without changing the meaningful part of the text.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 2: Break Text Into Pieces
&lt;/h1&gt;

&lt;p&gt;Now that our string is clean, we can separate it into smaller parts.&lt;/p&gt;

&lt;p&gt;Right now, everything is stored in one string.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ada Lovelace, 1815-1852
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suppose we want the name and the years separately.&lt;/p&gt;

&lt;p&gt;This is exactly what &lt;code&gt;split()&lt;/code&gt; is designed for.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;years&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;trimmed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we have two independent values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name  → Ada Lovelace

years → 1815-1852
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The text hasn't disappeared.&lt;/p&gt;

&lt;p&gt;We've simply told JavaScript:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Whenever you see &lt;code&gt;", "&lt;/code&gt;, cut the string into pieces."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is useful for processing CSV files, parsing names, reading configuration files, and many other real-world tasks.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 3: Does This Text Contain Something?
&lt;/h1&gt;

&lt;p&gt;Sometimes you don't need to split a string.&lt;/p&gt;

&lt;p&gt;You just want to know whether a word exists inside it.&lt;/p&gt;

&lt;p&gt;Suppose we have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sentence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JavaScript is fun&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we want to know whether the word &lt;code&gt;"fun"&lt;/code&gt; appears, we can simply write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;sentence&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fun&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the word isn't present,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;sentence&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Python&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;returns&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's simple, readable, and usually the best choice when you only need a yes-or-no answer.&lt;/p&gt;




&lt;h1&gt;
  
  
  What About &lt;code&gt;indexOf()&lt;/code&gt;?
&lt;/h1&gt;

&lt;p&gt;Before &lt;code&gt;includes()&lt;/code&gt; became common, developers often used &lt;code&gt;indexOf()&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;sentence&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fun&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of returning &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;, it returns the position where the text starts.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;14
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the text isn't found, it returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both methods are useful.&lt;/p&gt;

&lt;p&gt;If you only care whether something exists, &lt;code&gt;includes()&lt;/code&gt; is usually easier to read.&lt;/p&gt;

&lt;p&gt;If you also need the position, &lt;code&gt;indexOf()&lt;/code&gt; gives you that information.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 4: Extract Just the Part You Need
&lt;/h1&gt;

&lt;p&gt;Sometimes you don't want the entire string.&lt;/p&gt;

&lt;p&gt;You only need a small section of it.&lt;/p&gt;

&lt;p&gt;That's where &lt;code&gt;slice()&lt;/code&gt; comes in.&lt;/p&gt;

&lt;p&gt;Imagine this string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;language&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JavaScript&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we only want the first four letters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;language&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;we get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Java
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first number tells JavaScript where to start.&lt;/p&gt;

&lt;p&gt;The second tells it where to stop.&lt;/p&gt;

&lt;p&gt;The character at the stopping position isn't included.&lt;/p&gt;

&lt;p&gt;You can think of &lt;code&gt;slice()&lt;/code&gt; as cutting out a portion of the original string while leaving the original untouched.&lt;/p&gt;




&lt;h1&gt;
  
  
  Step 5: Build Better Strings
&lt;/h1&gt;

&lt;p&gt;Sooner or later, you'll need to combine variables into a sentence.&lt;/p&gt;

&lt;p&gt;Suppose we already have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ada Lovelace&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;years&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1815-1852&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An older way to build a sentence would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; lived from &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;years&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works.&lt;/p&gt;

&lt;p&gt;But once the sentence becomes longer, all those &lt;code&gt;+&lt;/code&gt; operators start making the code harder to read.&lt;/p&gt;

&lt;p&gt;Modern JavaScript gives us a cleaner alternative called &lt;strong&gt;template literals&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; lived from &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;years&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ada Lovelace lived from 1815-1852
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The variables fit naturally into the sentence, making the code much easier to write and understand.&lt;/p&gt;

&lt;p&gt;Whenever you're building strings with variables, template literals are usually the preferred approach.&lt;/p&gt;




&lt;h1&gt;
  
  
  So Far, Everything Has Been Simple...
&lt;/h1&gt;

&lt;p&gt;Every method we've seen works with exact pieces of text.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;trim()&lt;/code&gt; removes spaces.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;split()&lt;/code&gt; cuts text apart.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;includes()&lt;/code&gt; searches for exact words.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;slice()&lt;/code&gt; extracts a section.&lt;/p&gt;

&lt;p&gt;Template literals build new strings.&lt;/p&gt;

&lt;p&gt;But what happens when the text you're looking for isn't fixed?&lt;/p&gt;

&lt;p&gt;Suppose you don't know the exact year.&lt;/p&gt;

&lt;p&gt;You simply want to find &lt;strong&gt;every number&lt;/strong&gt; inside a paragraph.&lt;/p&gt;

&lt;p&gt;Or every email address.&lt;/p&gt;

&lt;p&gt;Or every phone number.&lt;/p&gt;

&lt;p&gt;Searching for exact words is no longer enough.&lt;/p&gt;

&lt;p&gt;That's where one of the most powerful and sometimes intimidating tools in programming enters the picture:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regular Expressions&lt;/strong&gt;, or simply &lt;strong&gt;Regex&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  When Simple Search Isn't Enough
&lt;/h1&gt;

&lt;p&gt;So far, every string method we've used has worked with &lt;strong&gt;exact text&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;sentence&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JavaScript&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JavaScript looks for the exact word &lt;code&gt;"JavaScript"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That's great when you already know what you're searching for.&lt;/p&gt;

&lt;p&gt;But real-world text is often much messier.&lt;/p&gt;

&lt;p&gt;Imagine someone gives you this string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ada Lovelace, 1815-1852
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't care about the name.&lt;/p&gt;

&lt;p&gt;You don't even care about the hyphen.&lt;/p&gt;

&lt;p&gt;You simply want &lt;strong&gt;every number&lt;/strong&gt; that appears in the text.&lt;/p&gt;

&lt;p&gt;Or imagine you're processing thousands of user comments and want to find:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;every email address&lt;/li&gt;
&lt;li&gt;every phone number&lt;/li&gt;
&lt;li&gt;every URL&lt;/li&gt;
&lt;li&gt;every date&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can't possibly search for every number or every email one by one.&lt;/p&gt;

&lt;p&gt;You need a way to describe a &lt;strong&gt;pattern&lt;/strong&gt; instead of an exact word.&lt;/p&gt;

&lt;p&gt;That's exactly why &lt;strong&gt;Regular Expressions&lt;/strong&gt;, commonly called &lt;strong&gt;Regex&lt;/strong&gt;, exist.&lt;/p&gt;




&lt;h1&gt;
  
  
  Think of Regex as a Search Rule
&lt;/h1&gt;

&lt;p&gt;Instead of saying,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find the word &lt;code&gt;JavaScript&lt;/code&gt;."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Regex lets you say,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find anything that looks like a number."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find anything that looks like an email address."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find every word that starts with a capital letter."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In other words, regex doesn't search for one specific piece of text.&lt;/p&gt;

&lt;p&gt;It searches for &lt;strong&gt;a pattern&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's what makes it so powerful.&lt;/p&gt;




&lt;h1&gt;
  
  
  A Simple Example
&lt;/h1&gt;

&lt;p&gt;Let's go back to our string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;years&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1815-1852&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suppose we want to know whether this string contains any digits.&lt;/p&gt;

&lt;p&gt;We can write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="sr"&gt;/.test&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;years&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's break down the pattern.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Match any digit from &lt;strong&gt;0 to 9&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;code&gt;+&lt;/code&gt; means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Match one or more of them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So together,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\d+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Find one or more consecutive digits.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's enough to match:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1815
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1852
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;without us ever typing those numbers explicitly.&lt;/p&gt;




&lt;h1&gt;
  
  
  Extracting Every Match
&lt;/h1&gt;

&lt;p&gt;Sometimes we don't just want to know whether a match exists.&lt;/p&gt;

&lt;p&gt;We want the actual matches.&lt;/p&gt;

&lt;p&gt;That's where &lt;code&gt;match()&lt;/code&gt; comes in.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;allYears&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;years&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="sr"&gt;+/g&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1815&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1852&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pattern is exactly the same.&lt;/p&gt;

&lt;p&gt;The only new thing is the &lt;code&gt;g&lt;/code&gt; flag.&lt;/p&gt;

&lt;p&gt;You can think of &lt;code&gt;g&lt;/code&gt; as meaning:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Don't stop after the first match. Keep searching until you've found them all."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Without it, JavaScript would stop after finding &lt;code&gt;"1815"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;With it, it continues and also finds &lt;code&gt;"1852"&lt;/code&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Regex Is Powerful...
&lt;/h1&gt;

&lt;p&gt;By now, you can probably see why developers love regex.&lt;/p&gt;

&lt;p&gt;With the right pattern, you can search through huge amounts of text and find exactly what you're looking for.&lt;/p&gt;

&lt;p&gt;Need every number?&lt;/p&gt;

&lt;p&gt;Regex.&lt;/p&gt;

&lt;p&gt;Every hashtag?&lt;/p&gt;

&lt;p&gt;Regex.&lt;/p&gt;

&lt;p&gt;Every date?&lt;/p&gt;

&lt;p&gt;Regex.&lt;/p&gt;

&lt;p&gt;Every email?&lt;/p&gt;

&lt;p&gt;Regex.&lt;/p&gt;

&lt;p&gt;It's an incredibly versatile tool.&lt;/p&gt;




&lt;h1&gt;
  
  
  ...But It's Also Easy to Misuse
&lt;/h1&gt;

&lt;p&gt;Regex has a reputation. Not because it's bad. But because it's very easy to make it more complicated than it needs to be.&lt;/p&gt;

&lt;p&gt;Many beginners have this experience:&lt;/p&gt;

&lt;p&gt;They find a regex online. It seems to work. So they copy it into their project.&lt;/p&gt;

&lt;p&gt;A month later, they look at the same line of code and think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I have absolutely no idea what this does."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The problem gets even worse if the regex has no comments explaining it.&lt;/p&gt;

&lt;p&gt;A mysterious regex is like a complicated math formula with no explanation. It might be correct. But nobody wants to touch it. Including the person who originally wrote it.&lt;/p&gt;




&lt;h1&gt;
  
  
  Real-World Regex Is Harder Than It Looks
&lt;/h1&gt;

&lt;p&gt;Take email validation as an example.&lt;/p&gt;

&lt;p&gt;At first, it sounds easy.&lt;/p&gt;

&lt;p&gt;Just check whether the text contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Right?&lt;/p&gt;

&lt;p&gt;Unfortunately, real email addresses are much more complicated.&lt;/p&gt;

&lt;p&gt;Some contain &lt;code&gt;+&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Some contain subdomains.&lt;/p&gt;

&lt;p&gt;Some use international characters.&lt;/p&gt;

&lt;p&gt;Some perfectly valid email addresses look surprisingly unusual.&lt;/p&gt;

&lt;p&gt;Writing a regex that correctly accepts &lt;strong&gt;every valid email&lt;/strong&gt; while rejecting &lt;strong&gt;every invalid one&lt;/strong&gt; is much harder than it first appears.&lt;/p&gt;

&lt;p&gt;That's why many developers prefer using well-tested libraries instead of writing complex validation regex from scratch.&lt;/p&gt;




&lt;h1&gt;
  
  
  Another Hidden Problem
&lt;/h1&gt;

&lt;p&gt;Regex can also affect performance.&lt;/p&gt;

&lt;p&gt;Some poorly written patterns force the computer to try an enormous number of possible matches before finally giving up.&lt;/p&gt;

&lt;p&gt;This problem is known as &lt;strong&gt;catastrophic backtracking&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You don't need to understand the details yet.&lt;/p&gt;

&lt;p&gt;Just remember this rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A shorter, simpler regex is usually better than a clever one that nobody understands.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Best Practices
&lt;/h1&gt;

&lt;p&gt;At this point, we've covered the most important ideas about working with strings.&lt;/p&gt;

&lt;p&gt;Here are two habits that will save you from many common bugs.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Trim User Input
&lt;/h3&gt;

&lt;p&gt;Whenever text comes from a user, remove unnecessary spaces before using it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This small step helps prevent failed comparisons, incorrect lookups, and frustrating bugs caused by invisible whitespace.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Avoid Repeated String Concatenation in Large Loops
&lt;/h3&gt;

&lt;p&gt;For small pieces of text, using &lt;code&gt;+=&lt;/code&gt; is perfectly fine.&lt;/p&gt;

&lt;p&gt;But when building very large strings inside loops, it's more efficient to collect the pieces first and join them once.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;word&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;words&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;word&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's a simple change that scales much better as your program grows.&lt;/p&gt;




&lt;h1&gt;
  
  
  Common Beginner Mistakes
&lt;/h1&gt;

&lt;p&gt;Let's finish by revisiting a few misconceptions that often catch new programmers off guard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake #1: Assuming &lt;code&gt;length&lt;/code&gt; Means "Visible Characters"
&lt;/h3&gt;

&lt;p&gt;For plain English text, that's usually true.&lt;/p&gt;

&lt;p&gt;But once emojis or certain Unicode characters appear, it isn't.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;😀&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;because JavaScript counts UTF-16 code units, not the number of characters your eyes see.&lt;/p&gt;




&lt;h3&gt;
  
  
  Mistake #2: Forgetting That Strings Are Immutable
&lt;/h3&gt;

&lt;p&gt;Methods like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;trim()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;replace()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toUpperCase()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;don't modify the existing string.&lt;/p&gt;

&lt;p&gt;They return a new one.&lt;/p&gt;

&lt;p&gt;If you ignore that returned value, nothing changes.&lt;/p&gt;




&lt;h3&gt;
  
  
  Mistake #3: Writing Regex Nobody Can Read
&lt;/h3&gt;

&lt;p&gt;Regex is one of the most powerful tools in text processing.&lt;/p&gt;

&lt;p&gt;It's also one of the easiest places to create confusing code.&lt;/p&gt;

&lt;p&gt;If a regex becomes long or difficult to understand, add a comment explaining what it's supposed to match or consider whether there's a simpler approach.&lt;/p&gt;

&lt;p&gt;Your future self (and your teammates) will thank you.&lt;/p&gt;




&lt;h1&gt;
  
  
  Wrapping Up
&lt;/h1&gt;

&lt;p&gt;Strings seem simple because we use text every day.&lt;/p&gt;

&lt;p&gt;But programming treats text very differently than humans do.&lt;/p&gt;

&lt;p&gt;A string isn't just a sequence of letters. It's an immutable piece of data stored using an encoding, manipulated through specialized tools, and sometimes searched using powerful patterns.&lt;/p&gt;

&lt;p&gt;Once you understand these ideas, many "weird" behaviors start making sense:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why &lt;code&gt;toUpperCase()&lt;/code&gt; doesn't change the original string.&lt;/li&gt;
&lt;li&gt;Why one emoji can have a length of &lt;code&gt;2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Why trimming user input prevents subtle bugs.&lt;/li&gt;
&lt;li&gt;Why regex searches for &lt;strong&gt;patterns&lt;/strong&gt;, not exact words.&lt;/li&gt;
&lt;li&gt;Why repeatedly using &lt;code&gt;+=&lt;/code&gt; isn't always the best choice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next time you work with text, you'll know there's much more happening behind the scenes than meets the eye and you'll have the tools to handle it with confidence.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>coding</category>
    </item>
    <item>
      <title>Compilation vs. Interpretation: The Question That Turned Out to Be More Complicated Than Expected</title>
      <dc:creator>Shajibul Alam Shihab</dc:creator>
      <pubDate>Tue, 14 Jul 2026 06:58:17 +0000</pubDate>
      <link>https://dev.to/shajibul_alam_shihab/compilation-vs-interpretation-the-question-that-turned-out-to-be-more-complicated-than-expected-5f42</link>
      <guid>https://dev.to/shajibul_alam_shihab/compilation-vs-interpretation-the-question-that-turned-out-to-be-more-complicated-than-expected-5f42</guid>
      <description>&lt;h1&gt;
  
  
  Compilation vs. Interpretation: The Question That Turned Out to Be More Complicated Than Expected
&lt;/h1&gt;

&lt;p&gt;For a long time, the answer seemed obvious.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Is JavaScript compiled or interpreted?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The response came almost automatically:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Interpreted."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then another question appeared.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"If JavaScript is interpreted, why does V8 have a compiler?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That single question unraveled a misconception that many developers including experienced ones carry for years.&lt;/p&gt;

&lt;p&gt;The truth is that modern programming languages rarely fit into neat labels like &lt;em&gt;compiled&lt;/em&gt; or &lt;em&gt;interpreted&lt;/em&gt;. Once the execution pipeline is understood, those labels start to feel overly simplistic.&lt;/p&gt;




&lt;p&gt;Every program begins life as source code.&lt;/p&gt;

&lt;p&gt;Whether it's JavaScript, Python, Rust, Go, or TypeScript, none of that code can be executed directly by a processor.&lt;/p&gt;

&lt;p&gt;A CPU understands only one thing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Machine code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Somewhere between writing code and seeing a program run, translation has to happen.&lt;/p&gt;

&lt;p&gt;The only real difference between languages is &lt;strong&gt;when&lt;/strong&gt; and &lt;strong&gt;how&lt;/strong&gt; that translation takes place.&lt;/p&gt;




&lt;h2&gt;
  
  
  The First Approach: Translate Everything Up Front
&lt;/h2&gt;

&lt;p&gt;Imagine translating an entire novel before anyone starts reading it.&lt;/p&gt;

&lt;p&gt;The work takes time initially, but once it's finished, every future read is fast because no translation is needed anymore.&lt;/p&gt;

&lt;p&gt;That's exactly how &lt;strong&gt;Ahead-of-Time (AOT) compilation&lt;/strong&gt; works.&lt;/p&gt;

&lt;p&gt;Languages like &lt;strong&gt;C&lt;/strong&gt;, &lt;strong&gt;Rust&lt;/strong&gt;, and &lt;strong&gt;Go&lt;/strong&gt; compile the entire program into native machine code before execution begins.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcc program.c &lt;span class="nt"&gt;-o&lt;/span&gt; program
./program
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By the time &lt;code&gt;./program&lt;/code&gt; runs, every instruction has already been translated into machine code.&lt;/p&gt;

&lt;p&gt;The CPU simply executes it.&lt;/p&gt;

&lt;p&gt;The advantages are obvious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Excellent runtime performance&lt;/li&gt;
&lt;li&gt;Errors are caught before execution&lt;/li&gt;
&lt;li&gt;No translation overhead while the program is running&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trade-off?&lt;/p&gt;

&lt;p&gt;A separate executable is needed for every target platform and architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Second Approach: Translate While Running
&lt;/h2&gt;

&lt;p&gt;Now imagine a translator sitting beside the reader.&lt;/p&gt;

&lt;p&gt;Instead of translating the whole book beforehand, each sentence is translated only when it's reached.&lt;/p&gt;

&lt;p&gt;No preparation.&lt;/p&gt;

&lt;p&gt;No finished translated copy.&lt;/p&gt;

&lt;p&gt;Just translation and execution happening together.&lt;/p&gt;

&lt;p&gt;That's the traditional idea of &lt;strong&gt;interpretation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A command like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python script.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;doesn't produce a standalone executable first.&lt;/p&gt;

&lt;p&gt;Instead, the interpreter reads the program and executes it as it goes.&lt;/p&gt;

&lt;p&gt;This approach offers incredible portability.&lt;/p&gt;

&lt;p&gt;The same source code works anywhere the interpreter exists.&lt;/p&gt;

&lt;p&gt;The downside is that translation work happens every time the program runs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Then Came the Plot Twist
&lt;/h2&gt;

&lt;p&gt;For years, programming books often divided languages into two categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compiled&lt;/li&gt;
&lt;li&gt;Interpreted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That classification made sense decades ago.&lt;/p&gt;

&lt;p&gt;Today?&lt;/p&gt;

&lt;p&gt;Not so much.&lt;/p&gt;

&lt;p&gt;Modern language runtimes are far more sophisticated.&lt;/p&gt;

&lt;p&gt;Instead of choosing one approach, many combine several.&lt;/p&gt;




&lt;h2&gt;
  
  
  Enter Bytecode
&lt;/h2&gt;

&lt;p&gt;Before reaching machine code, many languages first compile into something called &lt;strong&gt;bytecode&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Bytecode isn't machine code.&lt;/p&gt;

&lt;p&gt;It's an intermediate instruction set designed to be portable across different operating systems and processors.&lt;/p&gt;

&lt;p&gt;Instead of looking like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Source Code
      ↓
Machine Code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the pipeline becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Source Code
      ↓
Bytecode
      ↓
Virtual Machine
      ↓
Execution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the first clue that the old "compiled vs interpreted" debate isn't telling the whole story.&lt;/p&gt;

&lt;p&gt;Python does this.&lt;/p&gt;

&lt;p&gt;Java does this.&lt;/p&gt;

&lt;p&gt;Even though both are commonly described as interpreted languages, they still perform a compilation step.&lt;/p&gt;

&lt;p&gt;It just doesn't produce machine code directly.&lt;/p&gt;




&lt;h2&gt;
  
  
  And Then Things Get Even More Interesting
&lt;/h2&gt;

&lt;p&gt;Modern runtimes don't stop at bytecode.&lt;/p&gt;

&lt;p&gt;They watch how a program behaves while it's running.&lt;/p&gt;

&lt;p&gt;Suppose a function gets called once.&lt;/p&gt;

&lt;p&gt;Nothing special happens.&lt;/p&gt;

&lt;p&gt;Suppose another function gets called a million times inside a loop.&lt;/p&gt;

&lt;p&gt;Now the runtime notices.&lt;/p&gt;

&lt;p&gt;Instead of interpreting that same code forever, it decides something.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This function is important."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That frequently executed section—often called a &lt;strong&gt;hot path&lt;/strong&gt;—gets compiled into native machine code &lt;strong&gt;while the program is still running&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This process is called &lt;strong&gt;Just-In-Time (JIT) compilation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It's one of the reasons modern JavaScript engines are incredibly fast.&lt;/p&gt;

&lt;p&gt;Rather than compiling everything upfront or interpreting everything forever, they optimize only the code that actually matters.&lt;/p&gt;

&lt;p&gt;The result is a balance between fast startup and excellent long-running performance.&lt;/p&gt;

&lt;p&gt;JavaScript's &lt;strong&gt;V8&lt;/strong&gt;, Java's &lt;strong&gt;HotSpot JVM&lt;/strong&gt;, and &lt;strong&gt;PyPy&lt;/strong&gt; all use this strategy.&lt;/p&gt;




&lt;h2&gt;
  
  
  So... What About TypeScript?
&lt;/h2&gt;

&lt;p&gt;This was the part that completely changed the mental model.&lt;/p&gt;

&lt;p&gt;At first glance, TypeScript seems similar to C.&lt;/p&gt;

&lt;p&gt;After all, there's a compiler.&lt;/p&gt;

&lt;p&gt;Running &lt;code&gt;tsc&lt;/code&gt; certainly feels like compilation.&lt;/p&gt;

&lt;p&gt;But &lt;code&gt;tsc&lt;/code&gt; isn't producing machine code.&lt;/p&gt;

&lt;p&gt;Its job is much simpler.&lt;/p&gt;

&lt;p&gt;Given this code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The TypeScript compiler checks the types...&lt;/p&gt;

&lt;p&gt;removes every type annotation...&lt;/p&gt;

&lt;p&gt;and emits plain JavaScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's where &lt;code&gt;tsc&lt;/code&gt; stops.&lt;/p&gt;

&lt;p&gt;The resulting JavaScript is then handed to a JavaScript engine like V8.&lt;/p&gt;

&lt;p&gt;Only then does the familiar execution pipeline begin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parse JavaScript&lt;/li&gt;
&lt;li&gt;Generate bytecode&lt;/li&gt;
&lt;li&gt;Start execution&lt;/li&gt;
&lt;li&gt;Identify hot paths&lt;/li&gt;
&lt;li&gt;JIT compile them into native machine code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, a TypeScript program goes through &lt;strong&gt;two completely different compilation stages&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;First:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TypeScript → JavaScript&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Later:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JavaScript → Native Machine Code (via V8's JIT compiler)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's why answering&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Is TypeScript compiled or interpreted?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;with a single word doesn't really work.&lt;/p&gt;

&lt;p&gt;It's both.&lt;/p&gt;

&lt;p&gt;Just at different stages.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Biggest Misconceptions
&lt;/h2&gt;

&lt;p&gt;One misconception appears almost everywhere:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Interpreted languages aren't compiled."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Modern Python and Java both compile into bytecode before execution.&lt;/p&gt;

&lt;p&gt;Compilation still exists.&lt;/p&gt;

&lt;p&gt;It simply happens at a different stage.&lt;/p&gt;

&lt;p&gt;Another common misconception:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"&lt;code&gt;tsc&lt;/code&gt; works like the C compiler."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It doesn't.&lt;/p&gt;

&lt;p&gt;The TypeScript compiler never produces machine code.&lt;/p&gt;

&lt;p&gt;It only performs type checking and transpiles TypeScript into JavaScript.&lt;/p&gt;

&lt;p&gt;The JavaScript engine still carries the responsibility of producing executable machine instructions.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Last Thing About Performance
&lt;/h2&gt;

&lt;p&gt;Benchmarks for JIT-powered languages can be surprisingly misleading.&lt;/p&gt;

&lt;p&gt;The first few executions often represent the runtime &lt;em&gt;before&lt;/em&gt; optimization.&lt;/p&gt;

&lt;p&gt;Only after the runtime identifies hot paths and compiles them into native machine code does peak performance begin to appear.&lt;/p&gt;

&lt;p&gt;That's why serious benchmarks usually include a &lt;strong&gt;warm-up phase&lt;/strong&gt; before measuring execution speed.&lt;/p&gt;




&lt;p&gt;Perhaps the biggest lesson wasn't learning what compilation or interpretation means.&lt;/p&gt;

&lt;p&gt;It was realizing that the question itself has become outdated.&lt;/p&gt;

&lt;p&gt;Modern programming languages aren't strictly compiled.&lt;/p&gt;

&lt;p&gt;They aren't strictly interpreted either.&lt;/p&gt;

&lt;p&gt;Most combine multiple techniques compilation, bytecode, interpretation, and JIT optimization to balance portability, startup time, developer experience, and runtime performance.&lt;/p&gt;

&lt;p&gt;So the next time the question appears&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Is JavaScript compiled or interpreted?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The most accurate answer might simply be:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"It's more interesting than that."&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>computerscience</category>
      <category>softwareengineering</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Python for Beginners: Installation, Basics, Logic, Files &amp; Mini Project</title>
      <dc:creator>Shajibul Alam Shihab</dc:creator>
      <pubDate>Tue, 17 Feb 2026 12:30:30 +0000</pubDate>
      <link>https://dev.to/shajibul_alam_shihab/python-for-beginners-installation-basics-logic-files-mini-project-c8a</link>
      <guid>https://dev.to/shajibul_alam_shihab/python-for-beginners-installation-basics-logic-files-mini-project-c8a</guid>
      <description>&lt;h1&gt;
  
  
  Python Foundations &amp;amp; Workflow
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Installing Python
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Windows:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Download from python.org&lt;/span&gt;
&lt;span class="c"&gt;# Or use winget&lt;/span&gt;
winget &lt;span class="nb"&gt;install &lt;/span&gt;Python.Python.3.11
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;পাইথন ইনস্টল করার পর টার্মিনালে &lt;code&gt;python --version&lt;/code&gt; লিখে চেক করুন যে সঠিকভাবে ইনস্টল হয়েছে কিনা।&lt;/p&gt;




&lt;h2&gt;
  
  
  Python Data Types &amp;amp; Variables
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Basic Data Types / মৌলিক ডেটা টাইপ
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integer&lt;/strong&gt;: যেকোনো পূর্ণ সংখ্যা (১, ২, ১০০, -৫)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Float&lt;/strong&gt;: দশমিক সংখ্যা (৩.১৪, ৫.৯)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;String&lt;/strong&gt;: টেক্সট বা লেখা ("নাম", "Hello")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boolean&lt;/strong&gt;: শুধু দুটি মান থাকতে পারে - True অথবা False
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Integer (পূর্ণসংখ্যা)
&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# &amp;lt;class 'int'&amp;gt;
&lt;/span&gt;
&lt;span class="c1"&gt;# Float (দশমিক সংখ্যা)
&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;5.9&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# &amp;lt;class 'float'&amp;gt;
&lt;/span&gt;
&lt;span class="c1"&gt;# String (স্ট্রিং/টেক্সট)
&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;আহমেদ&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# Bengali text supported
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# &amp;lt;class 'str'&amp;gt;
&lt;/span&gt;
&lt;span class="c1"&gt;# Boolean (সত্য/মিথ্যা)
&lt;/span&gt;&lt;span class="n"&gt;is_student&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;is_student&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# &amp;lt;class 'bool'&amp;gt;
&lt;/span&gt;
&lt;span class="c1"&gt;# None (কিছুই নেই)
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# &amp;lt;class 'NoneType'&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Lists &amp;amp; Dictionaries (Important for ML)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Lists / লিস্ট
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;লিস্ট হলো একাধিক ডেটা একসাথে রাখার উপায়&lt;/li&gt;
&lt;li&gt;লিস্টের ইনডেক্স শূন্য (০) থেকে শুরু হয়&lt;/li&gt;
&lt;li&gt;নেগেটিভ ইনডেক্স (-1) দিয়ে শেষ থেকে অ্যাক্সেস করা যায়
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Creating lists (লিস্ট তৈরি)
&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;রহিম&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;করিম&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;সালমা&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;mixed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Accessing elements (এলিমেন্ট অ্যাক্সেস)
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# 1 (প্রথম এলিমেন্ট)
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# 5 (শেষ এলিমেন্ট)
&lt;/span&gt;
&lt;span class="c1"&gt;# Slicing (স্লাইসিং)
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# [2, 3, 4]
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;   &lt;span class="c1"&gt;# [1, 2, 3] (প্রথম তিনটি)
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;   &lt;span class="c1"&gt;# [3, 4, 5] (তৃতীয় থেকে শেষ পর্যন্ত)
&lt;/span&gt;
&lt;span class="c1"&gt;# List operations
&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;# শেষে যোগ করা
&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;# নির্দিষ্ট স্থানে যোগ করা
&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;# নির্দিষ্ট মান মুছে ফেলা
&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;            &lt;span class="c1"&gt;# শেষ এলিমেন্ট মুছে ফেলা
&lt;/span&gt;
&lt;span class="c1"&gt;# List comprehension (খুবই শক্তিশালী!)
&lt;/span&gt;&lt;span class="n"&gt;squares&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="c1"&gt;# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
&lt;/span&gt;
&lt;span class="n"&gt;even_squares&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# [0, 4, 16, 36, 64]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dictionaries / ডিকশনারি
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ডিকশনারি হলো key-value পেয়ার&lt;/li&gt;
&lt;li&gt;প্রতিটি key এর বিপরীতে একটি value থাকে&lt;/li&gt;
&lt;li&gt;key দিয়ে খুব দ্রুত value খুঁজে পাওয়া যায়
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Creating dictionary (ডিকশনারি তৈরি)
&lt;/span&gt;&lt;span class="n"&gt;student&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;আহমেদ&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cgpa&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;3.85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;subjects&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Math&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Physics&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Accessing values (মান অ্যাক্সেস)
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;        &lt;span class="c1"&gt;# আহমেদ
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;     &lt;span class="c1"&gt;# 22
&lt;/span&gt;
&lt;span class="c1"&gt;# Adding/Updating (যোগ/আপডেট করা)
&lt;/span&gt;&lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ahmed@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;

&lt;span class="c1"&gt;# Dictionary methods
&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;         &lt;span class="c1"&gt;# সব key পাওয়া
&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;     &lt;span class="c1"&gt;# সব value পাওয়া
&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;       &lt;span class="c1"&gt;# (key, value) pairs
&lt;/span&gt;
&lt;span class="c1"&gt;# Dictionary comprehension
&lt;/span&gt;&lt;span class="n"&gt;squared_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;span class="c1"&gt;# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Control Flow (if/else, loops)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  If-Else Statements
&lt;/h3&gt;

&lt;p&gt;if-else দিয়ে শর্ত চেক করা যায় এবং সেই অনুযায়ী কোড চালানো যায়।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Simple if-else
&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;আপনি প্রাপ্তবয়স্ক&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# You are adult
&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;আপনি নাবালক&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# You are minor
&lt;/span&gt;
&lt;span class="c1"&gt;# Multiple conditions
&lt;/span&gt;&lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;grade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;grade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;grade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;B&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;grade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;C&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Your grade: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;grade&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Ternary operator (এক লাইনে if-else)
&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pass&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Fail&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;for loop&lt;/strong&gt;: নির্দিষ্ট সংখ্যকবার বা লিস্টের প্রতিটি আইটেমের জন্য চলে&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;while loop&lt;/strong&gt;: যতক্ষণ শর্ত সত্য ততক্ষণ চলতে থাকে&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;break&lt;/strong&gt;: লুপ থামিয়ে দেয়&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;continue&lt;/strong&gt;: বর্তমান ইটারেশন স্কিপ করে পরেরটিতে যায়&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For Loops / ফর লুপ
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Basic for loop
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 0, 1, 2, 3, 4
&lt;/span&gt;
&lt;span class="c1"&gt;# Loop through list
&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;আম&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;কলা&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;জাম&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;fruit&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Loop with index and value
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fruit&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fruit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Range with start, stop, step
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;  &lt;span class="c1"&gt;# 0, 2, 4, 6, 8
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  While Loops / হোয়াইল লুপ
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Basic while loop
&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="c1"&gt;# Break and continue
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;  &lt;span class="c1"&gt;# Skip 3
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;     &lt;span class="c1"&gt;# Stop at 7
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Functions / ফাংশন
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Defining Functions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ফাংশন হলো পুনরায় ব্যবহারযোগ্য কোড ব্লক&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;def&lt;/code&gt; দিয়ে ফাংশন তৈরি করা হয়&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;return&lt;/code&gt; দিয়ে ফাংশন থেকে মান ফেরত পাঠানো হয়&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;*args&lt;/code&gt;: যেকোনো সংখ্যক আর্গুমেন্ট নেয়&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;**kwargs&lt;/code&gt;: যেকোনো সংখ্যক keyword আর্গুমেন্ট নেয়
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Basic function
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;এই ফাংশন একটি নাম নিয়ে শুভেচ্ছা বার্তা দেয়&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;আহমেদ&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Hello, আহমেদ!
&lt;/span&gt;
&lt;span class="c1"&gt;# Multiple parameters
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;দুটি সংখ্যা যোগ করে&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 8
&lt;/span&gt;
&lt;span class="c1"&gt;# Default arguments
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;power&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exponent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;একটি সংখ্যার ঘাত বের করে (ডিফল্ট ঘাত = ২)&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;exponent&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;power&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;      &lt;span class="c1"&gt;# 9 (3^2)
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;power&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# 27 (3^3)
&lt;/span&gt;
&lt;span class="c1"&gt;# *args - variable number of arguments
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sum_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;যেকোনো সংখ্যক সংখ্যা যোগ করে&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;        &lt;span class="c1"&gt;# 6
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# 15
&lt;/span&gt;
&lt;span class="c1"&gt;# **kwargs - keyword arguments
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;student_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Student information প্রিন্ট করে&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;student_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;রহিম&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cgpa&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Lambda Functions (Anonymous Functions)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Regular function
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;square&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="c1"&gt;# Lambda equivalent (এক লাইনে)
&lt;/span&gt;&lt;span class="n"&gt;square_lambda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;square&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;         &lt;span class="c1"&gt;# 25
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;square_lambda&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# 25
&lt;/span&gt;
&lt;span class="c1"&gt;# Lambda with multiple arguments
&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# 8
&lt;/span&gt;
&lt;span class="c1"&gt;# Used with map, filter
&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;squared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# [1, 4, 9, 16, 25]
&lt;/span&gt;
&lt;span class="n"&gt;even&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# [2, 4]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  File Handling (CSV read/write, Pathlib)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;with open()&lt;/code&gt; ব্যবহার করলে ফাইল অটোমেটিক বন্ধ হয়ে যায়&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;'r'&lt;/code&gt; = read (পড়া), &lt;code&gt;'w'&lt;/code&gt; = write (লেখা), &lt;code&gt;'a'&lt;/code&gt; = append (যোগ করা)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;encoding='utf-8'&lt;/code&gt; বাংলা টেক্সটের জন্য জরুরি&lt;/li&gt;
&lt;li&gt;Pathlib আধুনিক এবং ক্রস-প্ল্যাটফর্ম উপায়&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Reading Files / ফাইল পড়া
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Basic file reading
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data.txt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Read line by line
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data.txt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;  &lt;span class="c1"&gt;# strip() removes \n
&lt;/span&gt;
&lt;span class="c1"&gt;# Read all lines into a list
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data.txt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readlines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Writing Files / ফাইলে লেখা
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Write mode (overwrites existing file)
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;output.txt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, World!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;নমস্কার, পৃথিবী!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Append mode (adds to existing file)
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;output.txt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;New line added&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Working with CSV Files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;

&lt;span class="c1"&gt;# Reading CSV
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;students.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;csv_reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Skip header
&lt;/span&gt;    &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csv_reader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;csv_reader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cgpa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cgpa&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Writing CSV
&lt;/span&gt;&lt;span class="n"&gt;students&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CGPA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;আহমেদ&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.85&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;রহিম&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.70&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;সালমা&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.92&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;students.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;csv_writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;csv_writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;students&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Using DictReader/DictWriter (recommended)
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;students.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;csv_reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;csv_reader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CGPA&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using Pathlib (Modern approach)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="c1"&gt;# Create Path object
&lt;/span&gt;&lt;span class="n"&gt;data_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;file_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;students.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

&lt;span class="c1"&gt;# Check if exists
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;File exists&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Create directory
&lt;/span&gt;&lt;span class="n"&gt;data_dir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Read file
&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Write file
&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;New content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Get file info
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;# students.csv
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;# students
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;suffix&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;# .csv
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;# data
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Exception Handling / এক্সেপশন হ্যান্ডলিং
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;try&lt;/code&gt;: যে কোড এরর দিতে পারে তা এখানে রাখি&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;except&lt;/code&gt;: এরর হলে এই কোড চলবে&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;finally&lt;/code&gt;: এরর হোক বা না হোক এই কোড চলবে&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;raise&lt;/code&gt;: নিজে এরর তৈরি করা
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Basic try-except
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Enter a number: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Result: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;দয়া করে একটি সংখ্যা লিখুন!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ZeroDivisionError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;শূন্য দিয়ে ভাগ করা যায় না!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Multiple exceptions
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data.txt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;FileNotFoundError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error occurred: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Always executes
&lt;/span&gt;
&lt;span class="c1"&gt;# Raising exceptions
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate_percentage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;marks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Total cannot be zero&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;percentage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculate_percentage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ValueError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Logging Basics (Debugging Setup)
&lt;/h2&gt;

&lt;p&gt;লগিং ব্যবহার করে প্রোগ্রামের কি হচ্ছে তা ট্র্যাক করা যায়, যা ডিবাগিংয়ে খুব সাহায্য করে।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;

&lt;span class="c1"&gt;# Basic logging
&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%(asctime)s - %(levelname)s - %(message)s&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;এটি একটি debug message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;এটি একটি info message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;এটি একটি warning message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;এটি একটি error message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;critical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;এটি একটি critical message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Logging to file
&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;app.log&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%(asctime)s - %(levelname)s - %(message)s&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Application started&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Mini-Project: CSV Data Cleaner
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_file&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    CSV file থেকে empty rows এবং duplicate rows মুছে ফেলে

    Args:
        input_file: Input CSV file path
        output_file: Output CSV file path
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Read data
&lt;/span&gt;    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Remove empty rows
&lt;/span&gt;    &lt;span class="n"&gt;cleaned_rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;())]&lt;/span&gt;

    &lt;span class="c1"&gt;# Remove duplicates
&lt;/span&gt;    &lt;span class="n"&gt;seen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;unique_rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cleaned_rows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;row_tuple&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row_tuple&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row_tuple&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;unique_rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Write cleaned data
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;unique_rows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fieldnames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;unique_rows&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
            &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeheader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unique_rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✓ Cleaned &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; rows → &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unique_rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; unique rows&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✓ Saved to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;output_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Usage
&lt;/span&gt;&lt;span class="nf"&gt;clean_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dirty_data.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;clean_data.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✓ Python এর মৌলিক syntax এবং data types&lt;/li&gt;
&lt;li&gt;✓ List, Dictionary ব্যবহার করে data organize করা&lt;/li&gt;
&lt;li&gt;✓ Control flow দিয়ে logic তৈরি করা&lt;/li&gt;
&lt;li&gt;✓ Function লিখে reusable code তৈরি করা&lt;/li&gt;
&lt;li&gt;✓ File handling দিয়ে data read/write করা&lt;/li&gt;
&lt;li&gt;✓ Exception handling দিয়ে error handle করা&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>Javascript ES6 (ECMAScript 2015) Features</title>
      <dc:creator>Shajibul Alam Shihab</dc:creator>
      <pubDate>Thu, 30 Jan 2025 11:15:32 +0000</pubDate>
      <link>https://dev.to/shajibul_alam_shihab/es6-ecmascript-2015-features-58pl</link>
      <guid>https://dev.to/shajibul_alam_shihab/es6-ecmascript-2015-features-58pl</guid>
      <description>&lt;p&gt;&lt;strong&gt;ES6&lt;/strong&gt; also known as &lt;strong&gt;ECMAScript 2015&lt;/strong&gt; is a major update to JavaScript, and it introduced many new features that make JavaScript more powerful and easier to work with. Whether you're a beginner or an experienced developer, understanding ES6 is essential for modern web development.&lt;/p&gt;

&lt;p&gt;In this blog, we'll cover &lt;strong&gt;all the key features of ES6&lt;/strong&gt;, including &lt;strong&gt;let and const&lt;/strong&gt;, &lt;strong&gt;arrow functions&lt;/strong&gt;, &lt;strong&gt;template literals&lt;/strong&gt;, &lt;strong&gt;destructuring&lt;/strong&gt;, &lt;strong&gt;spread and rest operators&lt;/strong&gt;, &lt;strong&gt;classes&lt;/strong&gt;, &lt;strong&gt;modules&lt;/strong&gt;, and much more.&lt;/p&gt;

&lt;p&gt;So, let's get started!&lt;/p&gt;




&lt;h3&gt;
  
  
  1. let and const
&lt;/h3&gt;

&lt;p&gt;ES6 introduced two new ways to declare variables: &lt;strong&gt;&lt;code&gt;let&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;const&lt;/code&gt;&lt;/strong&gt;. Before ES6, we only had &lt;strong&gt;&lt;code&gt;var&lt;/code&gt;&lt;/strong&gt;, but &lt;code&gt;var&lt;/code&gt; has some issues, especially with &lt;strong&gt;scope&lt;/strong&gt;. Let's see how &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt; solve these problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;let&lt;/code&gt;&lt;/strong&gt; is used for variables that can change their value, while &lt;strong&gt;&lt;code&gt;const&lt;/code&gt;&lt;/strong&gt; is used for variables that cannot be reassigned. Here's an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Doe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// This is allowed&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// This will throw an error&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The main difference between &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;var&lt;/code&gt; is &lt;strong&gt;block scope&lt;/strong&gt;. Variables declared with &lt;code&gt;let&lt;/code&gt; are only accessible within the block they are defined in, while &lt;code&gt;var&lt;/code&gt; is function-scoped. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Error: x is not defined&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, always use &lt;strong&gt;&lt;code&gt;let&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;const&lt;/code&gt;&lt;/strong&gt; instead of &lt;strong&gt;&lt;code&gt;var&lt;/code&gt;&lt;/strong&gt; in modern JavaScript.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Arrow Functions
&lt;/h3&gt;

&lt;p&gt;Next, let's talk about &lt;strong&gt;arrow functions&lt;/strong&gt;. Arrow functions are a shorter and more concise way to write functions in JavaScript. They also handle the &lt;strong&gt;&lt;code&gt;this&lt;/code&gt;&lt;/strong&gt; keyword differently.&lt;/p&gt;

&lt;p&gt;Here's a comparison between a regular function and an arrow function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Regular function&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Arrow function&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Arrow functions are especially useful for &lt;strong&gt;callback functions&lt;/strong&gt;. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doubled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One important thing to note is that arrow functions do not have their own &lt;strong&gt;&lt;code&gt;this&lt;/code&gt;&lt;/strong&gt;. Instead, they inherit &lt;code&gt;this&lt;/code&gt; from the surrounding context. This makes them ideal for use in methods like &lt;code&gt;setTimeout&lt;/code&gt; or event listeners.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Template Literals
&lt;/h3&gt;

&lt;p&gt;ES6 introduced &lt;strong&gt;template literals&lt;/strong&gt;, which make it easier to work with strings. Instead of using single or double quotes, we use backticks (&lt;code&gt;`&lt;/code&gt;). Template literals allow us to embed expressions inside strings using &lt;code&gt;${}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here's an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`My name is &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; and I am &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; years old.`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// My name is John and I am 25 years old.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Template literals also support &lt;strong&gt;multi-line strings&lt;/strong&gt; without needing to use &lt;code&gt;\n&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
  &amp;lt;div&amp;gt;
    &amp;lt;h1&amp;gt;Hello, World!&amp;lt;/h1&amp;gt;
  &amp;lt;/div&amp;gt;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes our code much cleaner and easier to read."&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Destructuring
&lt;/h3&gt;

&lt;p&gt;Destructuring is a powerful feature in ES6 that allows us to extract values from arrays or objects into variables. Let's start with &lt;strong&gt;array destructuring&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 1&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 2&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can also use destructuring with &lt;strong&gt;objects&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// John&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Destructuring is very useful when working with functions that return multiple values or when dealing with complex data structures.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Spread and Rest Operators
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;spread operator&lt;/strong&gt; (&lt;code&gt;...&lt;/code&gt;) allows us to expand an array or object into individual elements. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newNumbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newNumbers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// [1, 2, 3, 4, 5]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can also use the spread operator to copy objects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newPerson&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Dhaka&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newPerson&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// { name: "John", age: 25, city: "Dhaka" }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;rest operator&lt;/strong&gt; is used to collect multiple elements into an array. It's often used in function parameters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// 6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These operators are very versatile and can simplify many tasks in JavaScript.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Classes
&lt;/h3&gt;

&lt;p&gt;ES6 introduced &lt;strong&gt;classes&lt;/strong&gt;, which provide a cleaner and more structured way to work with objects and inheritance. Here's an example of a class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Hello, my name is &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;john&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;john&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Hello, my name is John&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can also use &lt;strong&gt;inheritance&lt;/strong&gt; with the &lt;code&gt;extends&lt;/code&gt; keyword:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Student&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;grade&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;grade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;grade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;study&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is studying`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;alice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Student&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;alice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Hello, my name is Alice&lt;/span&gt;
&lt;span class="nx"&gt;alice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;study&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Alice is studying&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Classes make it easier to organize and reuse code in JavaScript.&lt;/p&gt;




&lt;h3&gt;
  
  
  7. Modules
&lt;/h3&gt;

&lt;p&gt;ES6 introduced a native module system for JavaScript. With modules, we can split our code into multiple files and import/export functionality as needed.&lt;/p&gt;

&lt;p&gt;Here's an example of exporting and importing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// math.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;subtract&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// main.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subtract&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./math.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// 5&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;subtract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// 3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can also use &lt;strong&gt;default exports&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// math.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// main.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;multiply&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./math.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// 6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modules help us keep our code organized and maintainable.&lt;/p&gt;




&lt;h3&gt;
  
  
  8. Promises and Async/Await
&lt;/h3&gt;

&lt;p&gt;ES6 introduced &lt;strong&gt;Promises&lt;/strong&gt; to handle asynchronous operations in a more elegant way. A Promise represents a value that may be available now, in the future, or never.&lt;/p&gt;

&lt;p&gt;Here's an example of a Promise:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Data fetched!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Data fetched!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ES7 introduced &lt;strong&gt;async/await&lt;/strong&gt;, which makes working with Promises even easier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Data fetched!&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Async/await allows us to write asynchronous code that looks like synchronous code, making it easier to read and debug.&lt;/p&gt;




&lt;p&gt;We've covered all the major features of ES6, including &lt;strong&gt;let and const&lt;/strong&gt;, &lt;strong&gt;arrow functions&lt;/strong&gt;, &lt;strong&gt;template literals&lt;/strong&gt;, &lt;strong&gt;destructuring&lt;/strong&gt;, &lt;strong&gt;spread and rest operators&lt;/strong&gt;, &lt;strong&gt;classes&lt;/strong&gt;, &lt;strong&gt;modules&lt;/strong&gt;, and &lt;strong&gt;Promises and async/await&lt;/strong&gt;. These features make JavaScript more powerful and easier to work with, and they are essential for modern web development.&lt;/p&gt;

&lt;p&gt;This post was created using AI. But the planning, presentation and final editing of each piece is the result of my own efforts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thank you
&lt;/h3&gt;

</description>
      <category>es6</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why Use Redux in React? Complete Guide in Bangla</title>
      <dc:creator>Shajibul Alam Shihab</dc:creator>
      <pubDate>Sun, 12 Jan 2025 09:15:36 +0000</pubDate>
      <link>https://dev.to/shajibul_alam_shihab/why-use-redux-in-react-complete-guide-in-bangla-8gi</link>
      <guid>https://dev.to/shajibul_alam_shihab/why-use-redux-in-react-complete-guide-in-bangla-8gi</guid>
      <description>&lt;p&gt;&lt;strong&gt;React&lt;/strong&gt; ব্যবহার করার সময় কি কখনো আপনাদের মনে হয়েছে, "এই কম্পোনেন্ট থেকে ঐ কম্পোনেন্টে ডেটা পাঠানো এত জটিল কেন?" বা, "State ম্যানেজমেন্ট এর জন্য আরও ভালো উপায় কি হতে পারে?&lt;/p&gt;

&lt;p&gt;আমরা জানি, React আমাদের কম্পোনেন্টগুলোর মধ্যে state শেয়ার করার জন্য খুবই কার্যকর। কিন্তু যখন অ্যাপ্লিকেশন বড় হতে থাকে, তখন এই state ম্যানেজমেন্ট এতটা জটিল হয়ে যায় যে কোড পড়া এবং মেইনটেন করা যেন একটা দুঃস্বপ্ন হয়ে দাঁড়ায়। এই সমস্যাগুলো সমাধানের জন্য Redux এসেছে। Redux এমন একটি লাইব্রেরি যা আমাদের state ম্যানেজমেন্টকে আরও সহজ এবং কার্যকর করে তোলে। এই পোস্টে আমরা খুব গভীরভাবে Redux-এর প্রতিটি দিক আলোচনা করবো।&lt;/p&gt;

&lt;p&gt;আসুন, আমরা একবার ভাবি একটি React অ্যাপ্লিকেশন তৈরি করেছি যেখানে ডেটা Parent Component থেকে Child Component হয়ে আরও অনেক Nested Component পর্যন্ত যেতে হবে। এখন প্রতিটি লেভেলে ডেটা পাঠানোর জন্য props ব্যবহার করতে হচ্ছে। প্রথমে এটা সহজ মনে হলেও, অ্যাপ বড় হতে থাকলে এটা খুব জটিল হয়ে যায়। এই সমস্যার নাম হলো Props Drilling। &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbljxk2w419x4s07rbfuc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbljxk2w419x4s07rbfuc.png" alt="Props Drilling" width="800" height="926"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ধরি, আমাদের App কম্পোনেন্টের কাছে একটি state আছে, এবং সেই state আমরা AddToCartButton কম্পোনেন্টে পাঠাতে চাই। কিন্তু সমস্যা হলো, MainContent, ProductList আর Proeduct  কম্পোনেন্টের  মধ্য দিয়ে সেই state পাঠানো ছাড়া অন্য কোনো উপায় নেই। ফলে, এমন অনেক props ডেটা মাঝের কম্পোনেন্টে পৌঁছে যায় যেগুলো তাদের দরকারই নেই।&lt;/p&gt;

&lt;p&gt;Props Drilling এর সমস্যা গুলো হলোঃ&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;কোড জটিল হয়ে যায়।&lt;/li&gt;
&lt;li&gt;মাঝের কম্পোনেন্টগুলো অপ্রয়োজনীয় ডেটা বহন করে।&lt;/li&gt;
&lt;li&gt;ডেটা শেয়ারিং ত্রুটিপূর্ণ এবং সময়সাপেক্ষ হয়।&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;React আমাদের জন্য Context API নামের একটি সমাধান এনেছে, যা Props Drilling সমস্যা অনেকটা সমাধান করতে পারে। Context API ব্যবহার করলে আমরা ডেটা সরাসরি প্রয়োজনীয় কম্পোনেন্টে পাঠাতে পারি, মাঝের কম্পোনেন্টগুলো এড়িয়ে। এটি নিঃসন্দেহে একটি ভালো সমাধান। তবে বড় অ্যাপ্লিকেশনের ক্ষেত্রে Context API এর কিছু সীমাবদ্ধতা রয়েছে।&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxn3msbpvz8jc6r64tfn0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxn3msbpvz8jc6r64tfn0.png" alt="Context API" width="800" height="797"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Problems with Context API&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Performance Issues:&lt;/strong&gt; যখন Context এর state পরিবর্তিত হয়, তখন সেই Context এর নিচের সব কম্পোনেন্ট একসাথে re-render হয়। ফলে বড় অ্যাপ্লিকেশনে পারফরমেন্স সমস্যা দেখা দেয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nested Providers:&lt;/strong&gt; Context API এর Nested Providers ব্যবহার করলে কোড জটিল হয়ে যায়। একাধিক Context ব্যবহার করার ফলে Provider এর ভেতরে Provider থাকে, যাকে Provider Hell বলা হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability Issues:&lt;/strong&gt; Context API ছোট বা মাঝারি অ্যাপ্লিকেশনের জন্য ভালো, কিন্তু বড় এবং জটিল অ্যাপ্লিকেশনের state ম্যানেজমেন্টের জন্য এটি পর্যাপ্ত নয়।"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnj3hj38q8x9a9q07hrm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnj3hj38q8x9a9q07hrm.png" alt="Context API Re-render Problem &amp;amp; Provider Hell" width="800" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;তাহলে, Context API এর এই সীমাবদ্ধতাগুলো ছাড়িয়ে যাওয়ার জন্য আমাদের প্রয়োজন Redux। Redux আমাদের state ম্যানেজমেন্ট আরও সহজ এবং কার্যকর করতে সাহায্য করে। আসুন, এখন আমরা Redux কীভাবে কাজ করে এবং এটি কীভাবে আমাদের state ম্যানেজমেন্ট সহজ করে তোলে, তা নিয়ে আলোচনা করি।&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Redux&lt;/strong&gt; কী? এটি একটি প্রশ্ন যা অনেকের মনে আসে, বিশেষ করে যারা React-এ নতুন। Redux হলো এমন একটি লাইব্রেরি, যা JavaScript অ্যাপ্লিকেশনের জন্য state ম্যানেজমেন্ট সহজ করে। কিন্তু প্রশ্ন হলো কেন আমরা Redux ব্যবহার করবো? Redux কীভাবে কাজ করে? চলুন এই প্রশ্নগুলোর উত্তর খুঁজি।&lt;/p&gt;

&lt;p&gt;Redux হলো একটি predictable state container। এর মানে হলো, এটি আমাদের অ্যাপ্লিকেশনের state বা data কে একটি নির্দিষ্ট নিয়ম মেনে এক জায়গায় সংরক্ষণ করে। ফলে state পরিবর্তন কোথায়, কখন এবং কীভাবে হচ্ছে, তা সহজেই বোঝা যায়।&lt;/p&gt;

&lt;p&gt;Redux এর সবচেয়ে বড় সুবিধা হলো, এটি predictable। এর মানে, একবার state পরিবর্তনের নিয়ম (reducers) সেট করলে, state সবসময় নির্দিষ্ট নিয়মেই পরিবর্তিত হবে।&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0nef1rojjyvrq2i2zg9t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0nef1rojjyvrq2i2zg9t.png" alt="Redux Selection Update" width="800" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Redux ব্যবহারের কয়েকটি মূল কারণ হলো:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Centralized State Management:&lt;/strong&gt; Redux আমাদের state এক জায়গায় সংরক্ষণ করতে দেয়। ফলে পুরো অ্যাপ্লিকেশনে ডেটা ম্যানেজ করা সহজ হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predictability:&lt;/strong&gt; State কখন এবং কীভাবে পরিবর্তিত হচ্ছে, তা সবসময় একই নিয়ম মেনে চলে। এটি debug করা সহজ করে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time Travel Debugging:&lt;/strong&gt; Redux DevTools ব্যবহার করে আমরা আমাদের state পরিবর্তনের ইতিহাস দেখতে এবং সেটা undo বা redo করতে পারি।&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Redux কীভাবে কাজ করে, তা বোঝার জন্য আমাদের তিনটি গুরুত্বপূর্ণ জিনিস জানতে হবে  Store, Action, এবং Reducer।&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Store:&lt;/strong&gt; Redux Store হলো সেই জায়গা যেখানে আমাদের অ্যাপ্লিকেশনের পুরো state সংরক্ষিত হয়। এটি হলো Redux এর মস্তিষ্ক। ধরি, একটি React অ্যাপ্লিকেশন আছে, যেখানে একটি counter state রাখতে হবে। এই state আমরা Store-এ সংরক্ষণ করবো, যাতে অ্যাপের যেকোনো জায়গা থেকে এটি ব্যবহার করা যায়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action:&lt;/strong&gt; Action হলো এমন একটি জাভাস্ক্রিপ্ট অবজেক্ট, যা বলে দেয় অ্যাপ্লিকেশনে কী করতে হবে। Action হলো Redux এর মাধ্যমে state পরিবর্তনের প্রথম ধাপ।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reducer:&lt;/strong&gt; Reducer হলো একটি pure function, যা বলে দেয় Action এর ভিত্তিতে state কীভাবে পরিবর্তিত হবে। এটি আগের state এবং নতুন action নিয়ে কাজ করে এবং একটি নতুন state রিটার্ন করে।&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Redux-এর কাজ করার পুরো প্রক্রিয়াটি একটি সাইকেলের মতো।&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dispatch an Action:&lt;/strong&gt; কম্পোনেন্ট থেকে একটি Action পাঠানো হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reducer Processes the Action:&lt;/strong&gt; Reducer Action অনুযায়ী state আপডেট করে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store Updates the State:&lt;/strong&gt; Store নতুন state ধরে রাখে, যা কম্পোনেন্টে পৌঁছে যায়।&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Redux শেখার এই পর্যায়ে আমরা বুঝেছি Redux কীভাবে কাজ করে। কিন্তু প্রশ্ন হলো Redux ব্যবহার করা কি সবসময় সহজ? সত্যি কথা বলতে, Vanilla Redux (Redux এর সাধারণ ব্যবহার) কখনো কখনো জটিল ও ক্লান্তিকর হয়ে যায়।&lt;/p&gt;

&lt;p&gt;প্রথমে আমরা দেখবো Vanilla Redux ব্যবহারের কিছু সমস্যাঃ&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Boilerplate Code:&lt;/strong&gt; Redux এ অনেক boilerplate কোড লিখতে হয়। প্রতিটি action, reducer, এবং store সেটআপ করার জন্য প্রচুর সময় লাগে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex Configuration:&lt;/strong&gt; Store configure করতে middleware যোগ করা এবং enhancer সেট করা অনেক সময় জটিল হয়ে যায়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Immutability Management:&lt;/strong&gt; Reducer ফাংশন লেখার সময় state কে immutable রাখতে হবে। এটা নিশ্চিত করার জন্য অনেক manual কোড লিখতে হয়, যা নতুনদের জন্য ভীতিকর।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging and Scaling Issues:&lt;/strong&gt; Redux DevTools সাপোর্ট থাকলেও vanilla Redux-এ debugging এবং বড় অ্যাপ্লিকেশন ম্যানেজ করা কঠিন হয়ে যায়।&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;এই সব সমস্যার সমাধান নিয়ে এসেছে Redux Toolkit। এটি Redux ব্যবহারের জন্য একটি আধুনিক, সহজ এবং opinionated উপায়।&lt;/p&gt;

&lt;h3&gt;
  
  
  Redux Toolkit কী?
&lt;/h3&gt;

&lt;p&gt;Redux Toolkit হলো Redux এর জন্য একটি অফিসিয়াল প্যাকেজ, যা আমাদের state ম্যানেজমেন্ট আরও সহজ ও কার্যকর করতে সাহায্য করে। এটি Redux এর সাধারণ কাজগুলোকে সহজ করে এবং boilerplate কোড কমায়।&lt;/p&gt;

&lt;h3&gt;
  
  
  কেন Redux Toolkit ব্যবহার করা উচিত?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Simpler Store Configuration:&lt;/strong&gt; Redux Toolkit এর &lt;code&gt;configureStore&lt;/code&gt; মেথড দিয়ে খুব সহজেই store configure করা যায়। Middleware এবং Redux DevTools সাপোর্ট অটোমেটিকভাবে এড করা থাকে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in &lt;code&gt;createSlice&lt;/code&gt;:&lt;/strong&gt; &lt;code&gt;createSlice&lt;/code&gt; আমাদের action এবং reducer একসঙ্গে তৈরি করতে দেয়। ফলে কোড লেখার ঝামেলা কমে যায়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Immutability with Immer:&lt;/strong&gt; Redux Toolkit এর ভিতরে &lt;code&gt;Immer&lt;/code&gt; নামে একটি লাইব্রেরি ব্যবহার করা হয়। এটি state কে immutable রাখতে সাহায্য করে। ফলে nested state পরিবর্তন করা সহজ হয়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redux DevTools and Middleware Integration:&lt;/strong&gt; Redux Toolkit DevTools এবং middleware এর ইন্টিগ্রেশন অটোমেটিকভাবে দেয়, যা debugging সহজ করে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalable and Maintainable:&lt;/strong&gt; Redux Toolkit বড় অ্যাপ্লিকেশন ম্যানেজ করার জন্য আদর্শ। এটি কোড সহজে পড়া এবং মেইনটেইন করা সম্ভব করে।&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Redux Toolkit Redux ব্যবহারের জন্য সহজ, আধুনিক এবং efficient উপায়। Vanilla Redux এর তুলনায় এটি দ্রুত, কম কোডে কাজ করে এবং বড় প্রজেক্ট পরিচালনার জন্য উপযুক্ত।&lt;/p&gt;




&lt;p&gt;আমরা Redux এবং Redux Toolkit সম্পর্কে অনেক কিছু শিখেছি। কিন্তু এখন প্রশ্ন হলো React অ্যাপ্লিকেশনে Redux কীভাবে ব্যবহার করবো? এর জন্য আমাদের দরকার একটি ব্রিজ বা সংযোগ, যা React এবং Redux এর মধ্যে কাজ করবে। এই সংযোগের নাম হলো React-Redux।&lt;/p&gt;

&lt;p&gt;React-Redux হলো একটি অফিসিয়াল লাইব্রেরি, যা React কম্পোনেন্ট এবং Redux store-এর মধ্যে যোগাযোগ স্থাপন করতে সাহায্য করে। এটি Redux এর state এবং actions কে React-এর সাথে ব্যবহার করার একটি সহজ এবং কার্যকর উপায়।&lt;/p&gt;

&lt;h3&gt;
  
  
  কেন আমরা React-Redux ব্যবহার করবো?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Simplifies State Access:&lt;/strong&gt; Redux এর state এবং actions সরাসরি React কম্পোনেন্টে অ্যাক্সেস করা জটিল হতে পারে। React-Redux এটি সহজ করে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficient Updates:&lt;/strong&gt; React-Redux Redux state-এর পরিবর্তনের উপর ভিত্তি করে React কম্পোনেন্টগুলোকে efficient ভাবে আপডেট করে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in Best Practices:&lt;/strong&gt; React-Redux অনেকগুলো built-in best practices ফলো করে। এটি আমাদের জন্য boilerplate কোড কমায় এবং performance উন্নত করে।&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Core Concepts of React-Redux
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Provider Component:&lt;/strong&gt; React-Redux একটি &lt;code&gt;Provider&lt;/code&gt; কম্পোনেন্ট প্রদান করে, যা Redux store কে পুরো React অ্যাপ্লিকেশনে access করতে দেয়।
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-redux&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./store&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MyComponent&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hooks for State and Dispatch:&lt;/strong&gt; React-Redux ব্যবহার করার জন্য আমরা দুটি গুরুত্বপূর্ণ হুক ব্যবহার করি &lt;code&gt;useSelector&lt;/code&gt; এবং &lt;code&gt;useDispatch&lt;/code&gt;।
    - &lt;strong&gt;&lt;code&gt;useSelector:&lt;/code&gt;&lt;/strong&gt; Redux store থেকে state পড়ার জন্য।
    - &lt;strong&gt;&lt;code&gt;useDispatch:&lt;/code&gt;&lt;/strong&gt; Redux store-এ action পাঠানোর জন্য।
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useSelector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useDispatch&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-redux&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;increment&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./counterSlice&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useSelector&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useDispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;())}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Increment&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Optimized Re-renders:&lt;/strong&gt; React-Redux এর হুক এবং &lt;code&gt;connect&lt;/code&gt; মেথড state পরিবর্তনের সময় কম্পোনেন্টগুলোকে optimized ভাবে re-render করতে সাহায্য করে।&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;React-Redux React এবং Redux-এর মধ্যে একটি ব্রিজ তৈরি করে, যা ডেটা ম্যানেজমেন্টকে সহজ এবং কার্যকর করে। Provider, useSelector, এবং useDispatch এর মতো টুল ব্যবহার করে আমরা Redux এর state এবং actions React কম্পোনেন্টে আনতে পারি।&lt;/p&gt;




&lt;p&gt;Redux এর বেসিক মেকানিজম আমরা শিখেছি। কিন্তু রিয়েল ওয়ার্ল্ড অ্যাপ্লিকেশনগুলোতে অনেক সময় আমাদের asynchronous ডেটা ফেচিং বা জটিল লজিক হ্যান্ডল করতে হয়। এখন আমরা Redux এর কিছু অ্যাডভান্সড টপিক, যেমন middleware, async actions, এবং debugging tools সম্পর্কে জানবো।&lt;/p&gt;

&lt;p&gt;Middleware হলো Redux-এর জন্য একটি powerful tool, যা actions এবং reducers এর মধ্যে কাজ করে। এটি action dispatch হওয়ার পর এবং reducer পর্যন্ত পৌঁছানোর আগে এক্সিকিউট হয়।&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Use Middleware?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Logging: Track actions dispatched and state changes.&lt;/li&gt;
&lt;li&gt;Error Handling: Catch errors during action processing.&lt;/li&gt;
&lt;li&gt;Async Operations: Handle tasks like API calls or delayed updates.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;জটিল অ্যাপ্লিকেশনে আমাদের অনেক সময় asynchronous ডেটা ফেচ করতে হয়। Redux Toolkit এর createAsyncThunk ফাংশন এটি সহজ করে।&lt;/p&gt;

&lt;h3&gt;
  
  
  Step-by-Step Example: Fetching API Data
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Define Async Thunk&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createAsyncThunk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;createSlice&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@reduxjs/toolkit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchUserData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createAsyncThunk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user/fetchUserData&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;thunkAPI&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/api/users/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Add Thunk to Slice&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userSlice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSlice&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;reducers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="na"&gt;extraReducers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;builder&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetchUserData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pending&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetchUserData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fulfilled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetchUserData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rejected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;userSlice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Use in Component&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useSelector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useDispatch&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-redux&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fetchUserData&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./userSlice&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;UserProfile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useDispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useSelector&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fetchUserData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Loading&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;User&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Redux DevTools হলো Redux অ্যাপ্লিকেশন ডিবাগিংয়ের জন্য সবচেয়ে কার্যকর টুল। এটি আমাদের actions এবং state পরিবর্তন পর্যবেক্ষণ করতে সাহায্য করে।&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Up Redux DevTools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Redux Toolkit already integrates Redux DevTools, so no additional setup is required.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Steps to Use:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open your app in a browser.&lt;/li&gt;
&lt;li&gt;Install the Redux DevTools browser extension.&lt;/li&gt;
&lt;li&gt;Inspect the app's state and actions directly in the extension.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Redux DevTools এর মাধ্যমে আমরা যেকোনো সময়ের state এবং actions রিভিউ করতে পারি। এটি ডেভেলপারদের জন্য একটি অসাধারণ টুল।&lt;/p&gt;




&lt;p&gt;এই পোস্টটিতে আমরা Redux এবং Redux Toolkit এর অনেক দিক আলোচনা করেছি। Redux Toolkit এর মাধ্যমে আমরা দেখলাম কীভাবে জটিল অ্যাপ্লিকেশনগুলোর state ম্যানেজমেন্ট সহজ করা যায়। এটি আমাদের সময় এবং কোডিং এফোর্ট দুটোই বাঁচায়।&lt;/p&gt;

&lt;p&gt;এই পোস্টটি তৈরি করতে AI এর সাহায্য নেওয়া হয়েছে। তবে প্রতিটি অংশের পরিকল্পনা, উপস্থাপনা এবং চূড়ান্ত সম্পাদনা আমার নিজস্ব প্রচেষ্টার ফল। &lt;/p&gt;

&lt;p&gt;ধন্যবাদ।&lt;/p&gt;

</description>
      <category>redux</category>
      <category>reduxtoolkit</category>
      <category>reactredux</category>
      <category>react</category>
    </item>
    <item>
      <title>How to Handle Asynchronous Operations</title>
      <dc:creator>Shajibul Alam Shihab</dc:creator>
      <pubDate>Mon, 09 Dec 2024 10:57:38 +0000</pubDate>
      <link>https://dev.to/shajibul_alam_shihab/how-to-handle-asynchronous-operations-48m3</link>
      <guid>https://dev.to/shajibul_alam_shihab/how-to-handle-asynchronous-operations-48m3</guid>
      <description>&lt;h2&gt;
  
  
  How to Handle Asynchronous Operations
&lt;/h2&gt;

&lt;p&gt;In TypeScript, we have multiple ways to handle asynchronous operations: callbacks, promises, and async/await. Asynchronous programming allows us to manage operations that could take time, like fetching data from an API, without blocking the execution of other code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Callbacks
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;A callback is a function passed as an argument to another function and is executed after a task completes. While callbacks work for simple tasks, they can quickly become unreadable when operations need to be chained.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Todo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createPromise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Todo&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://jsonplaceholder.typicode.com/todos/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;failed to load data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nf"&gt;createPromise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Promises
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Promises provide a cleaner approach than callbacks by allowing us to handle asynchronous operations in a more linear way using .then() and .catch() methods. They’re easier to chain but can still get messy with complex operations.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createPromise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="s2"&gt;`https://jsonplaceholder.typicode.com/todos/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;failed to load data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nf"&gt;createPromise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Async/Await
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Async/await provide a more readable and manageable way of handling asynchronous code compared to promises and callbacks. It lets us write asynchronous code as if it were synchronous, using the async keyword to mark functions as asynchronous and await to pause code execution until the promise resolves. This approach provides improved readability and is easier to debug.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Todo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getTodo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Todo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://jsonplaceholder.typicode.com/todos/1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getTodo&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why Use Async/Await?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Improved readability: Async/await is more readable and easier to follow, especially for complex code with multiple asynchronous calls.&lt;/li&gt;
&lt;li&gt;Error handling: It allows for simpler error handling with try/catch blocks, instead of multiple .catch() methods.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;&lt;em&gt;Thank You&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>typescript</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Semantic HTML</title>
      <dc:creator>Shajibul Alam Shihab</dc:creator>
      <pubDate>Mon, 09 Dec 2024 10:55:26 +0000</pubDate>
      <link>https://dev.to/shajibul_alam_shihab/semantic-html-1b37</link>
      <guid>https://dev.to/shajibul_alam_shihab/semantic-html-1b37</guid>
      <description>&lt;h1&gt;
  
  
  Semantic HTML
&lt;/h1&gt;

&lt;h3&gt;
  
  
  What is Semantic HTML?
&lt;/h3&gt;

&lt;p&gt;Semantic HTML uses HTML elements that convey meaning, both to developers and browsers. Instead of using generic elements like &lt;strong&gt;&lt;em&gt;&amp;lt;div&amp;gt;&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;&amp;lt;span&amp;gt;&lt;/em&gt;&lt;/strong&gt;, semantic tags like &lt;strong&gt;&lt;em&gt;&amp;lt;header&amp;gt;&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;&amp;lt;footer&amp;gt;&lt;/em&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;em&gt;&amp;lt;section&amp;gt;&lt;/em&gt;&lt;/strong&gt; clarify the structure of the content.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why It Matters: The Evolution of HTML
&lt;/h3&gt;

&lt;p&gt;Early HTML (Pre-HTML5):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Relied on &amp;lt;div&amp;gt; and &amp;lt;span&amp;gt; for layout.&lt;/li&gt;
&lt;li&gt;Made web pages difficult to read for both humans and machines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Introduction of HTML5 (2014):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added semantic elements like &amp;lt;header&amp;gt;, &amp;lt;footer&amp;gt;, &amp;lt;article&amp;gt;, etc.&lt;/li&gt;
&lt;li&gt;Promoted cleaner and more accessible code.&lt;/li&gt;
&lt;li&gt;Improved machine readability and accessibility for users.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Benefits of Semantic HTML
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Accessibility
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Assistive technologies like screen readers
understand document structure with
semantic tags.&lt;/li&gt;
&lt;li&gt;Tags help screen readers identify sections,
enhancing the experience for users with
disabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SEO (Search Engine Optimization)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Semantic tags help search engines interpret
content structure and importance.&lt;/li&gt;
&lt;li&gt;Tags like &amp;lt;article&amp;gt; and &amp;lt;header&amp;gt; improve
content hierarchy and rankings.&lt;/li&gt;
&lt;li&gt;&amp;lt;main&amp;gt;, &amp;lt;nav&amp;gt;, &amp;lt;header&amp;gt;, and other elements
enhance context and relevance for search
engines.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Clean Code Structure
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Semantic elements organize code logically,
making it easier to read and maintain.
Developers can quickly identify content
sections, reducing coding errors and
improving collaboration across teams.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;References or related articles:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Semantics" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Glossary/Semantics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/html/html5_semantic_elements.asp" rel="noopener noreferrer"&gt;https://www.w3schools.com/html/html5_semantic_elements.asp&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;&lt;em&gt;Thank You&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>semantichtml</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>HTML Element vs HTML Tag</title>
      <dc:creator>Shajibul Alam Shihab</dc:creator>
      <pubDate>Mon, 09 Dec 2024 05:47:08 +0000</pubDate>
      <link>https://dev.to/shajibul_alam_shihab/html-element-vs-html-tag-46c2</link>
      <guid>https://dev.to/shajibul_alam_shihab/html-element-vs-html-tag-46c2</guid>
      <description>&lt;h1&gt;
  
  
  HTML Element vs HTML Tag
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Understanding the Difference
&lt;/h2&gt;

&lt;p&gt;When working with HTML, developers often come across the terms "HTML Tag" and "HTML Element." While they are related, they are not the same thing. In this post, we’ll break down the differences, provide examples, and explain why understanding this distinction matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is an HTML Tag?
&lt;/h2&gt;

&lt;p&gt;An HTML &lt;strong&gt;tag&lt;/strong&gt; is the syntax used to define an element in HTML. Tags are enclosed in angle brackets (&amp;lt; &amp;gt;) and consist of a &lt;strong&gt;start tag&lt;/strong&gt; and, in most cases, an &lt;strong&gt;end tag&lt;/strong&gt;.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Structure:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;tagname&amp;gt;&lt;/span&gt;Content&lt;span class="nt"&gt;&amp;lt;/tagname&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;This is a paragraph.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Points:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tags are enclosed in &amp;lt; &amp;gt;.&lt;/li&gt;
&lt;li&gt;Tags instruct the browser how to interpret content.&lt;/li&gt;
&lt;li&gt;A start tag is required for all elements, and many require an end tag.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is an HTML Element?
&lt;/h2&gt;

&lt;p&gt;An HTML element refers to the entire structure, which includes the tags, content, and attributes (if any).&lt;/p&gt;

&lt;h3&gt;
  
  
  Structure:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;tagname&lt;/span&gt; &lt;span class="na"&gt;attribute=&lt;/span&gt;&lt;span class="s"&gt;"value"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Content&lt;span class="nt"&gt;&amp;lt;/tagname&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click here&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Points:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Elements consist of:

&lt;ul&gt;
&lt;li&gt;A start tag.&lt;/li&gt;
&lt;li&gt;Optional attributes.&lt;/li&gt;
&lt;li&gt;Content (if applicable).&lt;/li&gt;
&lt;li&gt;An end tag (if applicable).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Some elements, like &lt;strong&gt;&lt;em&gt;&amp;lt;img&amp;gt;&lt;/em&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;em&gt;&amp;lt;br&amp;gt;&lt;/em&gt;&lt;/strong&gt;, are self-closing and do not require an end tag.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comparing HTML Tags and HTML Elements
&lt;/h2&gt;

&lt;p&gt;Here’s a clear example to help you understand the difference:&lt;/p&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello World&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;HTML Tag:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&amp;lt;h1&amp;gt;&lt;/strong&gt;: The start tag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&amp;lt;/h1&amp;gt;&lt;/strong&gt;: The end tag.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;HTML Element:

&lt;ul&gt;
&lt;li&gt;The complete structure: &lt;strong&gt;&lt;em&gt;&amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt;&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Includes the tags and the content: "Hello World."&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why This Difference Matters
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Semantic Understanding:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Knowing the distinction helps you understand how browsers interpret HTML.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Debugging:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Clear knowledge of tags vs elements makes it easier to identify and fix issues in your code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Effective Communication:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Using the correct terminology improves collaboration with other developers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;HTML Tag: A syntax that defines an element, enclosed in &lt;strong&gt;&lt;em&gt;&amp;lt; &amp;gt;&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;HTML Element: The complete structure, which includes tags, content, and attributes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Thank you
&lt;/h1&gt;

</description>
      <category>html</category>
      <category>htmlelement</category>
      <category>htmltag</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
