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

PHASE 1 — Topic 4: How Socket.IO Works Internally (Engine.IO, Transports, and Fallback)

We now understand what Socket.IO is and why it is useful. In this post, we go one level deeper and look at what actually happens behind the ...