天天看點

Javascript,堆和棧的了解

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>堆和棧</title>
</head>

<body>

    <script>
        // 棧記憶體
        // a:'fwfwfw'
        // b:123
        // c:00      棧記憶體由下至上查找   

        var a = 'fwfwfw'
        // 開辟1單元a 存儲 'fwfwwfw' 
        var b = 123
        // 開辟2單元b 存儲 123
        a = b;
        // 開辟3單元a 存儲 123
        b = 43
        // 開辟4單元b 存儲 43 
        var c = a
        // 開辟5單元c 存儲 123 
        var c;
        // 開辟6單元c 存儲 123
        var d;
        // 開辟7單元d 存儲            |從下至上找單元d未找到,變量已聲明,開辟7單元d空間, 未存儲資料:undefined  
        var d = 1232;
        // 開辟8單元d 存儲 1232       |8單元d内的 1232 并不會消失
        var d;
        // 開辟9單元d 存儲 1232       |從下至上找到最近單元d,在8單元找到資料 空間記憶體儲1232 找到并進行clone存儲在9單元d;
        var o = d;
        // 開辟10單元o 存儲 1232      |從下至上未找到單元o,開辟10單元o,找到單元d内空間資料1232 clone到10單元o空間記憶體儲1232,
        d = '666';
        // 開辟11單元d 存儲 '666'     
        var o;
        // 開辟12單元o 存儲 '1232'    |從下至上找到10單元o,clone資料1232到12單元o

        console.log(a, b, c, d, o)  //a從下至上找最近的 
        // 取值會從下至上找棧記憶體中最近的一個存儲單元 遇到同名時會拿取同名單元的存儲資料;
        // 棧記憶體存儲原始資料,原始資料一旦建立,不可删除,永久存儲,隻會開辟新單元空間存放資料;
        // 内部的原始資料删除之後可以找回;

        // 堆記憶體
        var arr = [1, 2]
        // 開辟新1單元arr 堆記憶體  存放1,2   在棧記憶體中開辟13單元arr 存儲 1單元堆記憶體指向   
        var arr2 = arr;
        // 未開辟新單元   堆記憶體    在棧記憶體中開辟14單元arr2 存儲 1單元堆記憶體指向     
        arr = [3]
        // 開辟新2單元arr 堆記憶體  存放3  在棧記憶體中開辟15單元arr 存儲 2單元堆記憶體指向  
        var arr;
        // 未開辟新單元   堆記憶體    在棧記憶體中開辟16單元arr 存儲 2單元堆記憶體指向  
        arr2 = arr;
        // 未開辟新單元   堆記憶體    在棧記憶體中開辟17單元arr2 存儲 2單元堆記憶體指向       
        arr[1] = 'nihao'
        // 未開辟新單元   堆記憶體    在棧記憶體中開辟18單元arr 存儲 2單元堆記憶體指向      |從下至上找到堆記憶體2單元arr更改資料為 [3,'nihao']  

        console.log(arr, arr2)

        // 堆記憶體  用來存儲引用類型資料  引用資料的指針路徑存在棧記憶體  
        // 修改引用資料類型時,會通過棧記憶體的存儲路徑找到堆記憶體中的資料進行修改,棧記憶體中的存儲指針路徑并不會修該,是以在更改引用資料類型時,其他棧記憶體有引用的也會更改;
        // !棧記憶體會不斷疊加,原始資料不能删除 ,容易造成棧記憶體溢出;

    </script>


</body>

</html>