【JavaScript】数据结构与内存中的堆和栈

栏目: 数据库 · 发布时间: 5年前

内容简介:电脑中一个很重要的部件是内存条,绝大多数时候我们在操控一部分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}复制代码

改天再放几张图上来吧,困,先睡为敬~


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

iOS面试之道

iOS面试之道

故胤道长、唐巧 / 电子工业出版社 / 2018-7 / 59.00元

《iOS面试之道》是作者将多年的工作经验和积累,结合具体面试内容总结而成的。 《iOS面试之道》共分为3部分。第1部分为面试准备,详细介绍求职中遇到的基本问题,作者根据其多年的经验,在面试流程、简历投递、复习准备方面给出了完善的参考意见和建议。第2部分为算法知识。算法几乎是各种水平的程序员都要面对的考查内容。该部分采用Swift语言重新审视了多种数据结构和算法原理,可以说是为iOS开发者量身......一起来看看 《iOS面试之道》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器