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

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

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

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


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

查看所有标签

猜你喜欢:

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

CSS实战手册

CSS实战手册

David Sawyer McFarland / 俞黎敏 / 电子工业出版社 / 2007-07-01 / 68.00元

CSS是一场革命 借用quirksMode的PPK(Peter-Paul Koch)的话来说:CSS是一场革命。 Ajax的浪潮正在逐步改变着Web开发的方式。谈到Ajax,开发人员似乎更注重于 XMLHttpRequest 和 JavaScript ,而淡忘了Ajax还有一个重要的组成部分 CSS。 事实上,CSS和DOM、xHTML以及粘合它们的JavaScript密不可分,......一起来看看 《CSS实战手册》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试