【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}复制代码

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


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

查看所有标签

猜你喜欢:

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

Ajax for Web Application Developers

Ajax for Web Application Developers

Kris Hadlock / Sams / 2006-10-30 / GBP 32.99

Book Description Reusable components and patterns for Ajax-driven applications Ajax is one of the latest and greatest ways to improve users’ online experience and create new and innovative web f......一起来看看 《Ajax for Web Application Developers》 这本书的介绍吧!

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

各进制数互转换器

MD5 加密
MD5 加密

MD5 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具