一点点内存小知识

173 阅读2分钟

内存分配(变量创建时分配内存 不使用时回收)

栈存放变量(基本数据类型)

栈内存存储方式 后进先出类似于木桶

堆存放对象(引用数据类型)

堆内存存储方式 有序

js不允许直接操作堆内存的位置 因此,堆内存储引用类型数据操作是在操作引用而不是真实的对象

保存在栈内存的一个地址(地址指针) 该地址与堆内存相关联 存在栈中的数据可以共享(变量名字不同但要存储的内容一样 js引擎只会分配一块内存 )

池存放常量(池一般归类到栈) 堆内存运行速度高于栈 栈内存复制 会重新分配 相互独立互不影响 堆内存复制 栈指针不同(引用名字不同) 但数据对象还是指向一个

eg: var a1 = 0; // 栈

var a2 = 'this is string'; // 栈

var a3 = null; // 栈

var b = { m: 20 }; // 变量b存在于栈中,{m: 20} 作为对象存在于堆内中

var c = [1, 2, 3]; // 变量c存在于栈中,[1, 2, 3] 作为对象存在于堆内中

1613987494(1).png 原始值:在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量完全独立(原始值存栈内存,每个都是独立的地址)

引用值:在将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量,两个变量指向了堆内存中的一个对象,一方反应另一方也会起作用

内存的生命周期

JS环境中分配的内存一般有如下生命周期:

  1. 内存分配:当我们申明变量、函数、对象的时候,系统会自动为他 们分配内存
  2. 内存使用:即读写内存,也就是使用变量、函数等
  3. 内存回收:使用完毕,由垃圾回收机制自动回收不再使用的内存