前端中关于堆和栈的那些事

前端中关于堆和栈的那些事

写在前面:关于堆和栈,概念知道,但是该怎么应用呢,我自己本身是第三遍才更加深刻的明白,第一遍是知道什么是堆和栈,第二遍是在应用时懵逼了,第三遍是刷视频和自己练习时有了醍醐灌顶的感觉。

  • 栈 内存:里面的数据不能长期存在,一般存在运行的函数或者局部变量(基本类型)

  • 堆 内存: 数据可以长期存放,一般存放对象。(引用类型)

    数据类型

    • 基本数据类型:(还是要声明一点,占用内存空间固定,保存在栈中,保存与复制的是值本身)
      1. string:字符串,用于文本
      2. boolean:布尔类型
      3. number:用于表示数值
      4. null :缺少的标识,指示变量未指向任何对象
      5. underfined:任何一个只声明未复制的变量
    • 引用类型:对象,数组,Data,...除了基本数据类型外

    堆和栈的应用

    • 堆:只要时引用类型的数据,复制和赋值的都是一个地址,数据指向的都是一个地址,地址里面的数据变化之后,指向这个地址的数据都会变化
    //判断arr1  和 arr2是否一致
     let arr1 = [1,2,3,4]
     let arr2 = arr1
     arr2[2]=8
     cinsole.log(arr1,arr2)
     // arr1,arr2都为[1,2,8,4]
    
    • 栈:基本类型的数据都是存在栈中,保存和复制的都是自己本身

      	let a = 1
      	let b = a
      	b =2
      	console.log(a,b)
      	a为1,b为2																												
      

      练习时出错的点

       let arr1 = [1,2,3,4]
       let arr2 = arr1
       arr2[2]=[1,3,3,4]
       cinsole.log(arr1,arr2)
       arr1 = [1,2,3,4];
       arr2[2]=[1,3,3,4]
      

      问题:按理说引用数据类型指针指向的是一个地址,会什么有两个不一样的答案呢

      分析发现:arr1指向的地址和arr2是不同的,所以是不同的数据,arr2 自己又重新引用了一个地址,一个数组,一个对象就是一个堆,arr2=[]就是重新得到了一个新的内存地址

原文地址:https://www.cnblogs.com/wszzj/p/14103423.html