内容简介:电脑中一个很重要的部件是内存条,绝大多数时候我们在操控一部分ram运行我们的程序,于是就涉及到了堆栈的概念,鉴于总是记不住要查,写一篇比较简单的来记一下堆栈。堆栈是一个计算机专用术语,在数据结构里它代表着两种数据的操作方式,在内存维度里代表着两种不同的缓存方式和分配。栈(stack): 相对来说大家比较熟悉一些,其数据的存取方式是先进后出,如同一个只有一个单元一层只有一户的筒子楼倒着看(奇怪的比喻,-_-||主要是想说明空间与门牌号关系的感觉),举个例子,js中的全局下文栈在运行时是第一个进(push)栈的
目录
- 前言
- 一 堆栈
- 二 堆栈与内存泄漏
前言
电脑中一个很重要的部件是内存条,绝大多数时候我们在操控一部分ram运行我们的程序,于是就涉及到了堆栈的概念,鉴于总是记不住要查,写一篇比较简单的来记一下堆栈。
一 堆栈
堆栈是一个计算机专用术语,在数据结构里它代表着两种数据的操作方式,在内存维度里代表着两种不同的缓存方式和分配。
1.1 数据结构中的堆栈
栈(stack): 相对来说大家比较熟悉一些,其数据的存取方式是先进后出,如同一个只有一个单元一层只有一户的筒子楼倒着看(奇怪的比喻,-_-||主要是想说明空间与门牌号关系的感觉),举个例子,js中的全局下文栈在运行时是第一个进(push)栈的,在浏览器关闭时成为最后一个出(pop)栈的。其他的函数上下文也是存储在栈中,但是一般都是即进(函数创建)即出(函数执行完毕)的,
堆(heap): 一种经过 排序 的树形结构,通常用来实现优先队列,有小顶堆和大顶堆两种,可以看作一个像树一样的书架,每本书的区域存放着一定特性的数据,可以直接拿放。(没具体写过)
1.2 存储空间中的堆栈(上下文与深浅拷贝)
栈区:
前面特意用上下文的存取举了个栈结构的栗子,那么js中除了上下文引用类型,别的类型的变量都存在哪里呢?
首先可以确定的是基本类型都存放在栈区,该类型的数据存在该变量门牌号(地址)的房间里(数据值)。所以当你在拷贝一个值给另一个变量时,传递的是一个单纯的值,不会再产生任何指向运算。而当你在声明一个引用类型时,该变量所在的房间里存放的数据实际是一个地址值,该地址指向了内存中的另一块区域——堆区。
堆区:
当引用类型被浅拷贝时,因为所分配的数据空间是同一块,位于堆中的某一个位置。所以浅拷贝的数据值被所引用的引用类型变量所共同使用,一发则同全身。
而被深拷贝的时候,会根据执行重新分配一块新的内存空间,两个栈上的引用类型的变量指向运算后会指向堆中不同的地址空间。这个时候,大家各干各的,雨各自无瓜。
这样,在我们想要深拷贝的场景中,我们对引用类型拷贝时就不能使用直接赋值这种方式了,而是要重新分配一块空间给被拷贝值。
举个最简单的例子:
function deepCopy(obj) { return JSON.parse(JSON.stringify(obj)); } // 最常用场景使用
当然,如果遇到无函数可调用时,那么就需要手撸了,这里只提与本文最核心一行:
if (isType(parent, 'xType')) { child = xTypeInstance}复制代码
改天再放几张图上来吧,困,先睡为敬~
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- JavaScript 数据结构与算法之美 - 栈内存与堆内存 、浅拷贝与深拷贝
- go语言[3]-数据结构-递归树构建17亿数据的内存模型
- iOS标准库中常用数据结构和算法之内存池
- 数据结构 – 用于构建文件系统的数据结构?
- 荐 用Python解决数据结构与算法问题(三):线性数据结构之栈
- 数据库索引背后的数据结构
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。