美文网首页js css html
栈内存和堆内存区别

栈内存和堆内存区别

作者: 扶得一人醉如苏沐晨 | 来源:发表于2022-05-31 08:30 被阅读0次

栈内存:主要用于存储各种基本类型的变量,包括Boolean、Number、String、Undefined、Null 以及  对象变量的指针, 这时候栈内存给人的感觉就像一个线性排列的空间,每个小单元大小基本相等。

堆内存:主要负责像对象Object这种变量类型的存储,可以使用栈中的键名来取得。

栈内存中的变量一般都是已知大小或者有范围上限的。

而堆内存存储的对象类型数据对于大小这方面,一般都是未知的。

值类型和引用类型其实说的就是栈内存变量和堆内存变量;值传递和引用传递、深拷贝和浅拷贝,都是围绕堆栈内存展开的,一个是处理值,一个是处理指针。


数据类型访问和复制

基本数据类型访问:基本数据类型是指保存在栈内存中的简单数据段。访问方式是按值访问。 

基本类型的复制:从一个变量向一个变量复制时,会在栈中创建一个新值,然后把值复制到为新变量分配的位置上。 

引用数据类型的赋值分为两种类型:

浅拷贝和深拷贝。

浅拷贝:直接赋值,赋值的是内存地址(指针),赋值之后 两个变量使用的相同内容,一个操作,另一个也会改变。

深拷贝:只赋值引用数据类型中的数值,而不是赋值地址,数据赋值后二者互不相干。  

  
为什么const定义的值部分能改,部分不能改

当我们定义一个const对象的时候, 我们说的常量其实是指针,就是const对象对应的堆内存指向是不变的,但是堆内存中的数据本身的大小或者属性是可变的。而对于const定义的基础变量而言,这个值就相当于const对象的指针,是不可变。

为什么const、let定义的变量不能二次定义

每次使用const或者let去初始化一个变量的时候,会首先遍历当前的内存栈,看看有没有重名变量,有的话就返回错误。

new关键字初始化的之后是不是存储在栈内存中

根据构造函数生成新实例,这个时候生成的是对象,而不是基本类型。

let str1 = new String('123')

let str2 = new String('123')

console.log(str1==str2, str1===str2) // false false

很明显,如果str1 ,str2 是存储在栈内存中的话,两者应该是明显相等的,但结果两者并不相等,说明两者都是存储在堆内存中的,指针指向不一致。

内存分配和垃圾回收

一般来说栈内存线性有序存储,容量小,系统分配效率高。而堆内存首先要在堆内存新分配存储区域,之后又要把指针存储到栈内存中,效率相对就要低一些了。

垃圾回收:

栈内存变量基本上用完就回收了,而堆内存中的变量因为存在很多不确定的引用,只有当所有调用的变量全部销毁之后才能回收。

相关文章

网友评论

    本文标题:栈内存和堆内存区别

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