JavaScript中的栈和堆

在执行上下文一文中,我们简单的提到了栈这个概念,那么栈到底是一个什么东西呢,我们今天来详细的论述一下,在JavaScript中,栈和堆的这两个概念。

什么是栈,什么是堆

在JavaScript中,变量可以分为基本类型和引用类型两类,他们分别被保存在栈和堆中。
栈(stack):基本类型(String,Number,Boolean,Null,Undefined)会直接保存在栈中,栈会为他们自动分配固定的内存空间,也会自动释放。
堆(heap):引用类型(Function,Array,Object)并不会被分配固定的内存大小,而是通过动态分配内存的方式保存,大小不定,同时他也不会被自动释放。他们事实上是在栈内存中保存一个指针,并通过这个指针指向堆内存中的对象。

区别

栈是先进者后出,而堆属于队列优先,先进先出。
在栈内存的赋值时,我们称之为是传值,而堆内存的赋值我们称之为传址,因为多个变量可能指向同一个堆内存中的对象,所以某一个对象的改变,可能会引起其他变量的变化,而基本类型,则完全没有这方便的忧虑。
下面这段代码就给我们展示了这两种情况的区别:

let a = [1,2,3,4,5,6,7,8];
let b = a;
let c = a[0];
b[0] = 0;
console.log(a,b,c)

而也是堆的这种地址传递的特性,我们在对象的拷贝时,有了深拷贝和浅拷贝这两种区别。

const值的改变问题

const是es6中所新带来的变量声明,我们知道用const声明的变量是不能修改的,但是,他真的是完全不能修改的么?其实也不是,当他声明的是一个引用变量的时候,我们可以改变他的属性,像这样:

const a = {};
a.b = 'test';

这正是因为对象的赋值事实上是一个传址的操作,当我们给这个a变量添加属性b的时候,他的地址并没有发生改变,所以我们并没有改变这个变量a的值,所以它可以正常运行。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 8,790评论 0 6
  • 最全的iOS面试题及答案 iOS面试小贴士 ———————————————回答好下面的足够了-----------...
    zweic阅读 7,652评论 0 73
  • 307、setValue:forKey和setObject:forKey的区别是什么? 答:1, setObjec...
    AlanGe阅读 5,547评论 0 1
  • 近日在研究flutter,看flutter实际效果,能否尝试应用到实际项目中。首先要搭建开发环境,搭建过程中遇到一...
    神迹12阅读 5,842评论 0 3
  • 所谓父母子女一场,都是一次渐行渐远的旅行,相抚养,相赡养,珍惜缘分一场,谁都不确定自己老年时候的状态,这过程,这结...
    卯儿敕阅读 1,247评论 0 0

友情链接更多精彩内容