美文网首页
js的栈内存和堆内存

js的栈内存和堆内存

作者: 小妍妍说 | 来源:发表于2021-03-17 10:59 被阅读0次

js对变量的存储主要有两种方式:栈内存和堆内存。
栈内存主要存储基本数据类型的变量(一般都是已知大小或者范围有上限),包括Boolean、Number、String、undefined、null,以及对象的指针
堆内存主要存储对象等引用类型(大小未知)。

image.png
所以说,我们在定义基本数据类型的值时,js会把它的值存储进栈内存中,可以直接去改变它的值;
而当我们定义一个引用数据类型时,此时是分为两个步骤,
首先因为我们的值大小是不固定的,所以需要存进堆内存中,其次js会创建一个指针(也就是一个key,对应堆内存中的值),指向存进去的这块数据,然后把这个指针存进栈内存中,通俗讲就是js在栈内存中存储了当前引用数据类型的堆内存地址,我们使用某个对象时其实是通过这个内存地址去引用堆内存中的值。

举例:

  • 当我们定义一个const对象的时候,我们说的常量其实是指针,就是const对象对应的堆内存指向是不变的,但是堆内存中的数据本身的大小或者属性是可变的。而对于const定义的基础变量而言,这个值就相当于const对象的指针,是不可变。
  • 使用new关键字初始化的之后是不存储在栈内存中的。为什么呢?new大家都知道,根据构造函数生成新实例,这个时候生成的是对象,而不是基本类型。
var a = new String('123')
var b = String('123')
var c = '123'
console.log(a==b, a===b, b==c, b===c, a==c, a===c)  
>>> true false true true true false
console.log(typeof a)
>>> 'object'

new一个String,出来的是对象,而直接字面量赋值和工厂模式出来的都是字符串。但是根据我们上面的分析大小相对固定可预期的即便是对象也可以存储在栈内存的,比如null,为啥这个不是呢?再继续看

var a = new String('123')
var b = new String('123')
console.log(a==b, a===b)
>>> false false

很明显,如果a,b是存储在栈内存中的话,两者应该是明显相等的,就像null === null是true一样,但结果两者并不相等,说明两者都是存储在堆内存中的,指针指向不一致。

说到这里,再去想一想我们常说的值类型和引用类型其实说的就是栈内存变量和堆内存变量,再想想值传递和引用传递、深拷贝和浅拷贝,都是围绕堆栈内存展开的,一个是处理值,一个是处理指针。

内存分配和垃圾回收

一般来说栈内存线性有序存储,容量小,系统分配效率高。而堆内存首先要在堆内存新分配存储区域,之后又要把指针存储到栈内存中,效率相对就要低一些了。
垃圾回收方面,栈内存变量基本上用完就回收了,而推内存中的变量因为存在很多不确定的引用,只有当所有调用的变量全部销毁之后才能回收。

参考文献:https://www.cnblogs.com/heioray/p/9487093.html

相关文章

  • JS 垃圾回收

    内存 JS 数据的存储地址分为栈内存和堆内存。 栈内存 堆内存 在 JS 存放数据的内存中又分为高位和低位,其中高...

  • 变量提升

    堆内存 & 栈内存 JS中的内存一共两种:堆内存和栈内存 堆内存 作用:用来存储引用数据类型值的内存空间叫做堆内存...

  • JS内存图

    画JS内存图可以有效的解决JS中的一些内存问题JS中内存分为2中:栈内存(Stack)跟堆内存(Heap)栈内存:...

  • js数组--window.Array和window.Functi

    window.Array和window.Function 标准库js内存栈内存和堆内存,栈内存有一个很重要的全局属...

  • js知识版图-数据类型

    一、js中内存分为栈内存、堆内存此处引申知识点:js中堆栈内存及函数处理机制 栈内存 从数据类型角度思考 栈内存 ...

  • 10.11java中的堆和栈

    java高级-堆和栈 java堆 /栈 栈内存 / 堆内存的区别 1. java堆 /栈 2. 栈内存 / 堆内存的区别

  • js:栈内存和堆内存

    【声明:】本文是作者(蘑菇v5)原创,版权归作者 蘑菇v5所有,侵权必究。本文首发在简书。如若转发,请注明作者和来...

  • 堆栈内存

    JS中的内存:堆内存和栈内存 堆内存是用来存储引用数据类型值的(例如:创建函数和创建对象,就像开辟一个堆内存,把代...

  • java中栈内存和堆内存有什么区别

    java中栈内存和堆内存有什么区别 栈内存和堆内存的区别: 1、栈内存用来存放基本类型的变量和引用变量,堆内存用来...

  • 内存

    内存的几大区域 栈内存和堆内存 所谓的栈内存和堆内存并不是内存里面有一块区域叫栈,有一块区域叫堆.所谓的栈内存和对...

网友评论

      本文标题:js的栈内存和堆内存

      本文链接:https://www.haomeiwen.com/subject/ocmscltx.html