Stack and Heap Memory

Think of it like this:

  • Stack = Your desk (small, organized, quick access)
  • Heap = Your closet (big, messy, takes time to find things)

1. The Golden Rule


    // 📘 Goes in STACK - Simple values
    let age = 25;          // number
    let name = "Raj";      // string  
    let passed = true;     // boolean

    // 📦 Goes in HEAP - Complex values
    let person = {         // object
        name: "Raj"
    };
    let scores = [1, 2, 3];  // array

2. How Stack Works (Simple Values)


    <!DOCTYPE html>
    <html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Stack and Heap - Simple Examples</title>
        <style>
            body {
                font-family: Arial, sans-serif;
                max-width: 900px;
                margin: 0 auto;
                padding: 20px;
                background-color: #f5f5f5;
            }

            .example-box {
                background: white;
                border-radius: 10px;
                padding: 20px;
                margin: 20px 0;
                box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
            }

            h2 {
                color: #333;
                border-bottom: 3px solid #4CAF50;
                padding-bottom: 10px;
            }

            .memory-container {
                display: flex;
                gap: 30px;
                margin: 20px 0;
                justify-content: center;
            }

            .memory-box {
                flex: 1;
                max-width: 300px;
            }

            .stack-box {
                background: #E3F2FD;
                border: 3px solid #2196F3;
                border-radius: 10px;
                padding: 15px;
            }

            .heap-box {
                background: #F3E5F5;
                border: 3px solid #9C27B0;
                border-radius: 10px;
                padding: 15px;
            }

            .memory-title {
                font-weight: bold;
                text-align: center;
                margin-bottom: 15px;
                font-size: 18px;
            }

            .memory-item {
                background: white;
                padding: 8px;
                margin: 5px 0;
                border-radius: 5px;
                font-family: monospace;
                box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
            }

            .code-demo {
                background: #263238;
                color: #ECEFF1;
                padding: 15px;
                border-radius: 5px;
                margin: 15px 0;
                font-family: 'Courier New', monospace;
                line-height: 1.6;
            }

            .comment {
                color: #78909C;
            }

            .variable {
                color: #FF5252;
            }

            .value {
                color: #69F0AE;
            }

            .keyword {
                color: #82B1FF;
            }

            button {
                background: #4CAF50;
                color: white;
                border: none;
                padding: 10px 20px;
                border-radius: 5px;
                cursor: pointer;
                font-size: 16px;
                margin: 10px 5px;
            }

            button:hover {
                background: #45a049;
            }

            .output {
                background: #F5F5F5;
                border: 2px solid #DDD;
                padding: 15px;
                border-radius: 5px;
                margin: 15px 0;
                font-family: monospace;
                white-space: pre-line;
            }

            .arrow {
                font-size: 20px;
                color: #FF5722;
                margin: 0 10px;
            }

            .highlight {
                background: #FFEB3B;
                padding: 2px 5px;
                border-radius: 3px;
                color: #333;
            }

            .simple-diagram {
                text-align: center;
                margin: 20px 0;
                padding: 20px;
                background: #FFF;
                border-radius: 10px;
                box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
            }

            .rule-box {
                background: #E8F5E9;
                border-left: 5px solid #4CAF50;
                padding: 15px;
                margin: 20px 0;
                font-weight: bold;
            }

            .problem-box {
                background: #FFEBEE;
                border-left: 5px solid #F44336;
                padding: 15px;
                margin: 10px 0;
            }

            .solution-box {
                background: #E8F5E9;
                border-left: 5px solid #4CAF50;
                padding: 15px;
                margin: 10px 0;
            }
        </style>
    </head>

    <body>
        <h1 style="text-align: center;">🧠 Stack and Heap Memory - Made Easy!</h1>

        <!-- Rule 1 -->
        <div class="example-box">
            <h2>📌 Rule 1: What Goes Where?</h2>

            <div class="rule-box">
                <p>🔵 STACK = Simple Values (numbers, strings, booleans)</p>
                <p>🟣 HEAP = Complex Values (objects, arrays)</p>
            </div>

            <div class="memory-container">
                <div class="memory-box">
                    <div class="stack-box">
                        <div class="memory-title">📚 STACK (Simple)</div>
                        <div class="memory-item">age = 25</div>
                        <div class="memory-item">name = "John"</div>
                        <div class="memory-item">passed = true</div>
                    </div>
                </div>
                <div class="memory-box">
                    <div class="heap-box">
                        <div class="memory-title">📦 HEAP (Complex)</div>
                        <div class="memory-item">{name: "John", age: 25}</div>
                        <div class="memory-item">[1, 2, 3, 4, 5]</div>
                        <div class="memory-item">function() {...}</div>
                    </div>
                </div>
            </div>
        </div>

        <!-- Example 1: Stack Copy -->
        <div class="example-box">
            <h2>🎯 Example 1: Stack Memory (Simple Copy)</h2>

            <div class="code-demo">
                <span class="keyword">let</span> <span class="variable">a</span> = <span class="value">10</span>; <span
                    class="comment">// Stack: a = 10</span>
                <span class="keyword">let</span> <span class="variable">b</span> = <span class="variable">a</span>; <span
                    class="comment">// Stack: b = 10 (new copy!)</span>
                <span class="variable">b</span> = <span class="value">20</span>; <span class="comment">// Only b
                    changes</span>

                console.log(<span class="variable">a</span>); <span class="comment">// 10 ✅</span>
                console.log(<span class="variable">b</span>); <span class="comment">// 20 ✅</span>
            </div>

            <button onclick="runStackExample()">▶️ Run Example</button>
            <div id="stackOutput" class="output"></div>

            <div class="simple-diagram">
                <strong>What happens:</strong><br>
                Step 1: a = 10 <span class="arrow"></span> <span class="highlight">Creates box with 10</span><br>
                Step 2: b = a <span class="arrow"></span> <span class="highlight">Creates NEW box with 10</span><br>
                Step 3: b = 20 <span class="arrow"></span> <span class="highlight">Changes only b's box</span>
            </div>
        </div>

        <!-- Example 2: Heap Reference -->
        <div class="example-box">
            <h2>🎯 Example 2: Heap Memory (Reference Copy)</h2>

            <div class="code-demo">
                <span class="keyword">let</span> <span class="variable">obj1</span> = {<span class="variable">x</span>:
                <span class="value">10</span>}; <span class="comment">// Creates object in HEAP</span>
                <span class="keyword">let</span> <span class="variable">obj2</span> = <span class="variable">obj1</span>;
                <span class="comment">// obj2 points to SAME object</span>
                <span class="variable">obj2</span>.<span class="variable">x</span> = <span class="value">20</span>; <span
                    class="comment">// Changes the shared object</span>

                console.log(<span class="variable">obj1</span>.<span class="variable">x</span>); <span class="comment">// 20
                    😱 (changed!)</span>
                console.log(<span class="variable">obj2</span>.<span class="variable">x</span>); <span class="comment">//
                    20</span>
            </div>

            <button onclick="runHeapExample()">▶️ Run Example</button>
            <div id="heapOutput" class="output"></div>

            <div class="simple-diagram">
                <strong>What happens:</strong><br>
                Step 1: obj1 <span class="arrow"></span> <span class="highlight">Points to object in heap</span><br>
                Step 2: obj2 = obj1 <span class="arrow"></span> <span class="highlight">Points to SAME object</span><br>
                Step 3: obj2.x = 20 <span class="arrow"></span> <span class="highlight">Changes the shared object</span>
            </div>
        </div>

        <!-- Visual Difference -->
        <div class="example-box">
            <h2>👁️ Visual Difference</h2>

            <div class="memory-container">
                <div class="memory-box">
                    <h3>With Numbers (Stack)</h3>
                    <div class="stack-box">
                        <div class="memory-item">a = 10 📦</div>
                        <div class="memory-item">b = 10 📦</div>
                        <p style="text-align:center; margin-top:10px;">
                            <strong>Two separate boxes!</strong>
                        </p>
                    </div>
                </div>
                <div class="memory-box">
                    <h3>With Objects (Heap)</h3>
                    <div class="heap-box">
                        <div class="memory-item">obj1 → 📍</div>
                        <div class="memory-item">obj2 → 📍</div>
                        <div class="memory-item" style="background:#FFE082; margin-top:10px;">
                            📍 {x: 20}
                        </div>
                        <p style="text-align:center; margin-top:10px;">
                            <strong>Both point to same box!</strong>
                        </p>
                    </div>
                </div>
            </div>
        </div>

        <!-- Common Mistakes -->
        <div class="example-box">
            <h2>⚠️ Common Mistakes</h2>

            <div class="problem-box">
                <strong>❌ Problem: Accidentally changing original object</strong>
                <div class="code-demo">
                    <span class="keyword">let</span> <span class="variable">person1</span> = {<span
                        class="variable">name</span>: <span class="value">"Raj"</span>};
                    <span class="keyword">let</span> <span class="variable">person2</span> = <span
                        class="variable">person1</span>;
                    <span class="variable">person2</span>.<span class="variable">name</span> = <span
                        class="value">"Amit"</span>; <span class="comment">// Oops! person1 also changed!</span>
                </div>
            </div>

            <div class="solution-box">
                <strong>✅ Solution: Create a copy</strong>
                <div class="code-demo">
                    <span class="keyword">let</span> <span class="variable">person1</span> = {<span
                        class="variable">name</span>: <span class="value">"Raj"</span>};
                    <span class="keyword">let</span> <span class="variable">person2</span> = {...<span
                        class="variable">person1</span>}; <span class="comment">// Create new object</span>
                    <span class="variable">person2</span>.<span class="variable">name</span> = <span
                        class="value">"Amit"</span>; <span class="comment">// Only person2 changes!</span>
                </div>
            </div>

            <button onclick="runMistakeExample()">▶️ See the Difference</button>
            <div id="mistakeOutput" class="output"></div>
        </div>

        <!-- Simple Array Example -->
        <div class="example-box">
            <h2>🎯 Example 3: Arrays (Also in Heap!)</h2>

            <div class="code-demo">
                <span class="keyword">let</span> <span class="variable">arr1</span> = [<span class="value">1</span>, <span
                    class="value">2</span>, <span class="value">3</span>];
                <span class="keyword">let</span> <span class="variable">arr2</span> = <span class="variable">arr1</span>;
                <span class="comment">// Same reference!</span>
                <span class="variable">arr2</span>.push(<span class="value">4</span>);

                console.log(<span class="variable">arr1</span>); <span class="comment">// [1, 2, 3, 4] 😱</span>
                console.log(<span class="variable">arr2</span>); <span class="comment">// [1, 2, 3, 4]</span>
            </div>

            <button onclick="runArrayExample()">▶️ Run Example</button>
            <div id="arrayOutput" class="output"></div>
        </div>

        <!-- Quick Reference -->
        <div class="example-box">
            <h2>📋 Quick Reference</h2>

            <table style="width:100%; border-collapse: collapse;">
                <tr>
                    <th style="border: 1px solid #ddd; padding: 10px; background: #f2f2f2;">Type</th>
                    <th style="border: 1px solid #ddd; padding: 10px; background: #f2f2f2;">Where Stored</th>
                    <th style="border: 1px solid #ddd; padding: 10px; background: #f2f2f2;">Copy Behavior</th>
                </tr>
                <tr>
                    <td style="border: 1px solid #ddd; padding: 10px;">number, string, boolean</td>
                    <td style="border: 1px solid #ddd; padding: 10px;">Stack</td>
                    <td style="border: 1px solid #ddd; padding: 10px;">Creates new copy ✅</td>
                </tr>
                <tr>
                    <td style="border: 1px solid #ddd; padding: 10px;">object, array, function</td>
                    <td style="border: 1px solid #ddd; padding: 10px;">Heap</td>
                    <td style="border: 1px solid #ddd; padding: 10px;">Shares reference ⚠️</td>
                </tr>
            </table>
        </div>

        <script>
            function runStackExample() {
                const output = document.getElementById('stackOutput');
                output.textContent = '';

                let a = 10;
                output.textContent += `Step 1: let a = 10;  // a = ${a}\n`;

                let b = a;
                output.textContent += `Step 2: let b = a;   // b = ${b} (got a copy)\n`;

                b = 20;
                output.textContent += `Step 3: b = 20;      // b = ${b}\n\n`;

                output.textContent += `Final values:\n`;
                output.textContent += `a = ${a} ✅ (unchanged)\n`;
                output.textContent += `b = ${b} ✅ (only b changed)\n\n`;
                output.textContent += `📝 Each variable has its own value!`;
            }

            function runHeapExample() {
                const output = document.getElementById('heapOutput');
                output.textContent = '';

                let obj1 = { x: 10 };
                output.textContent += `Step 1: let obj1 = {x: 10};\n`;
                output.textContent += `        obj1.x = ${obj1.x}\n\n`;

                let obj2 = obj1;
                output.textContent += `Step 2: let obj2 = obj1; (sharing reference)\n`;
                output.textContent += `        obj2.x = ${obj2.x}\n\n`;

                obj2.x = 20;
                output.textContent += `Step 3: obj2.x = 20;\n\n`;

                output.textContent += `Final values:\n`;
                output.textContent += `obj1.x = ${obj1.x} 😱 (changed!)\n`;
                output.textContent += `obj2.x = ${obj2.x}\n\n`;
                output.textContent += `📝 Both variables point to the SAME object!`;
            }

            function runMistakeExample() {
                const output = document.getElementById('mistakeOutput');
                output.textContent = '';

                // Wrong way
                output.textContent += `❌ WRONG WAY:\n`;
                let person1 = { name: "Raj" };
                let person2 = person1;
                person2.name = "Amit";
                output.textContent += `person1.name = "${person1.name}" (changed!)\n`;
                output.textContent += `person2.name = "${person2.name}"\n\n`;

                // Right way
                output.textContent += `✅ RIGHT WAY:\n`;
                let person3 = { name: "Raj" };
                let person4 = { ...person3 };
                person4.name = "Amit";
                output.textContent += `person3.name = "${person3.name}" (unchanged!)\n`;
                output.textContent += `person4.name = "${person4.name}"\n`;
            }

            function runArrayExample() {
                const output = document.getElementById('arrayOutput');
                output.textContent = '';

                let arr1 = [1, 2, 3];
                output.textContent += `Step 1: let arr1 = [1, 2, 3];\n`;

                let arr2 = arr1;
                output.textContent += `Step 2: let arr2 = arr1; (sharing reference)\n`;

                arr2.push(4);
                output.textContent += `Step 3: arr2.push(4);\n\n`;

                output.textContent += `Final arrays:\n`;
                output.textContent += `arr1 = [${arr1}] 😱 (changed!)\n`;
                output.textContent += `arr2 = [${arr2}]\n\n`;

                output.textContent += `To copy array properly:\n`;
                output.textContent += `let arr3 = [...arr1]; // Creates new array\n`;
                output.textContent += `OR\n`;
                output.textContent += `let arr3 = arr1.slice(); // Also creates new array`;
            }
        </script>
    </body>

    </html>

Simple Programs to Understand

Program 1: Number Copy (Stack)


    let a = 5;
    let b = a;   // b gets value 5
    b = 10;      // Only b changes

    console.log(a);  // 5 ✅
    console.log(b);  // 10 ✅

What happens: Each variable gets its own box with the value.

Program 2: Object Copy (Heap)


    let car1 = { color: "red" };
    let car2 = car1;   // car2 points to SAME car
    car2.color = "blue";

    console.log(car1.color);  // "blue" 😱
    console.log(car2.color);  // "blue"

What happens: Both variables point to the same object.

Easy Way to Remember

📝 Simple Types = Simple Copy


    let x = 10;
    let y = x;    // y = 10 (separate copy)
    y = 20;       // x is still 10

📦 Complex Types = Sharing


    let obj1 = { a: 10 };
    let obj2 = obj1;      // Both share same object
    obj2.a = 20;          // obj1.a is also 20 now!

How to Fix the Sharing Problem

Method 1: Spread Operator (...)


    let original = { name: "John", age: 25 };
    let copy = { ...original };  // Creates NEW object
    copy.age = 30;

    console.log(original.age);  // 25 ✅
    console.log(copy.age);      // 30 ✅

Method 2: For Arrays


    let arr1 = [1, 2, 3];
    let arr2 = [...arr1];    // Creates NEW array
    arr2.push(4);

    console.log(arr1);  // [1, 2, 3] ✅
    console.log(arr2);  // [1, 2, 3, 4] ✅

One Line Summary

  • Numbers/Strings = Each variable gets its own value
  • Objects/Arrays = Variables share the same thing
  • Want separate copy? = Use {...obj} or [...arr]

No comments:

Post a Comment

Debouncing and Throttling in JavaScript

Debouncing and Throttling - Made Simple! Think of these as traffic controllers for your functions: Debouncing = Wait until user stops, ...