web api 栈和堆的小知识 个人向理解用

71 阅读1分钟
<script>
    // js数据类型共有七种 分为两大类
    // 1.简单数据类型(值类型): 栈中存储数据 赋值拷贝的是数据 修改拷贝后的数据对原数据没有影响
    // 
    // 2.复杂数据类型(引用类型): 栈中存储地址 堆中存储数据 赋值拷贝地址 修改拷贝后的数据对原数据有影响
    // 刷卡


    let num1 = 10
    let num2 = num1
    num2 = 100
    console.log(num1, num2) // 10  100


    let obj1 = { name: '张三', age: 30 }
    let obj2 = obj1
    obj2.age = 33
    console.log(obj1, obj2) // 均为 { name: '张三',age: 33}

    // let 只能在栈中开辟空间  
    // let num1 = 10,
    //  栈(钱包) 空间小 但是运行快         堆(银行)  空间大 但是运行较慢


    // 等号都是从右往左解析  但是仅仅是等号  
    // 这里let是优先执行 因此  他会先走 let num1 然后再走num1 = 10
    // 这里变量 num1 只能在栈中开空间  num2 同理
    // 值类型的 拷贝的是数据 修改拷贝后的数据对原数据没有影响

    // let obj1  在栈中开空间  一般说复杂数据类型在堆里面开空间 但是是否在里面开空间
    // 取决于 []中括号 和 {}花括号 来决定  他不是let 来决定的
    // 左边let obj1在栈中开完空间后 然后就会解析右边的 这里由于是花括号 编译器就在堆里面开辟空间了
    // 变量名字是指栈里面的名字  堆里面先说存储 在堆开辟的大空间里面 又有小房间 来装 name 和 age
    // 数据比较多 栈放不下 因此会存放在堆里面  完成存储后 为了证明这是你的账户以及财产 
    // 他会给你一张银行卡 也就是一个 二进制的堆地址 然后等号会赋值把 这个地址给放在栈的 obj1的空间里
    // 同理obj2 也是在栈中开空间 拷贝直接把地址拷给过去 因此两个的地址一样 相当于 同一个账户的主卡和副卡
    // 那么当我们需要引用里面的数据只需要刷卡就可以了
    // 这就是为什么引用类型无法直接使用 要么使用点语法 要么使用中括号语法[] 
    // 因此此时的两张银行卡指向的是同一个账户  另外一个人花钱用银行卡的话 本质是通过这个地址来刷这个卡
    //

    // let age = obj1.age  这个时候拷贝的是数据 此时 age把33 取出来了
    // 此时修改age的值  obj1的不会改变   age = 35 
    //  console.log(age,obj1.age)  //  35 / 33


    // let s = document.querySelector('#second') // dom对象 :  拷贝地址
    // s.innerHTML-- // 页面会变化  拷贝地址


    // let s = document.querySelector('#second').innerText // 拷贝的是对象里面的字符串 拷贝数据
    // s-- // 页面不会变 你只是把 s 变了   obj没有变
    // // 数据s变而来  但是页面的原值不能显示出来 需要重新赋值回去
    // document.querySelector('#second').innerText = s

  </script>

snipaste20220306_215508.jpg

snipaste20220306_215455.jpg

snipaste20220306_215418.jpg