javascript数据结构之栈和堆理解

引言:

JavaScript同样也有栈和队列概念,通过数组的方式,模仿实现堆栈,和队列。JavaScript引擎由c++编写,所以本质来说,JavaScript是不具备这样的功能的,由c++底层提供。而今天我所要讲的js底层本身实现的堆 和栈,主要用做变量的临时存储。

JavaScrit内存问题:

先来说说数据类型:

Javascript中分五种基本数据类型,分别是:

  • number
  • string
  • boolean
  • null
  • undefined

以上就是js五种基本数据类型,编程中我们经常使用。但是这些值,都以什么形式存储在内存中,供程序运行调用呢?实际上,他们是以两大数据类型在内存进行存储的,分别是值类型和引用类型

这里解释下两种类型:

值类型: 就是上述五种基本数据类型中的,string,number,boolean.值结构本身简单。
引用类型: 比如arr,function,object…数据随访问而变化(比如对象属性),数据有一定结构的,或者说成结构体的,值存放在堆内存内。

数据存储

首先程序在运行之前,操作系统都会为程序分配资源,内存就是一种。内存分两种,堆内存,和栈内存。js引擎依据两种数据类型,分类存放,共程序调用执行。

存储过程说明: 上面说了,js引擎根据不同数据类型,分类存放。碰到值类型,写入标识符和值到栈内;如果是引用类型,首先在栈内放入标识符,同时在改指针处存放指向堆内地址,而value值则会放入堆内存放。注意,存放的时候,只根据两大类型存放,不再做具体划分。

**数据操作&&复制:对于值类型,直接拷贝;对于引用类型,首先会声明一个新的标识符到栈中,然后复制已存在引用地址,此时两个变量指向同一引用。

下面用实例分析:

// 有这样一个栈堆内存结构,拟定程序开始运行,现声明一些变量,并初始化。
//栈
let iNum = 2	//值类型
let sToken  = 'string'
let obj = {a:1,fn:function(){}};
let arr = [12,5];
arr2 = arr;
//预编译,执行.内存存入变量。。。。。
//栈
ST001: iNum , 2	//值类型直接存入
ST002: sToken, 'string'
ST003:obj, HP001	//引用类型,value指向地址(引用)
ST004:arr, HP002
ST005:arr2, HP002
ST006

//堆
HP001:{a:1,fn:function(){}} ,(1)	
HP002: [15,5],(1)
HP003:
HP004:
HP005:

垃圾回收机制

GC内存(垃圾)回收机制,js对引用过的变量做垃圾回收处理,目的用来释放堆内存的内存。程序是如何确定哪些变量需要清除呢?那就是引用计数,这个是栈内存与堆内存之间的一种协议。

引用计数 ===0 : 一般对引用类型的,如果有引用他,那么对应的引用计数就会变化。当引用计数等于零时候,那么变量的直接被摧毁。关于引用计数等于零的情况,如下:

  • 如果变量运行到栈内存变量的作用域以外时,变量就会别摧毁,同时变量的引用计数减一

  • 如果变量赋值,指向其他值变量或者引用变量,引用减一

垃圾回收时间:

  • 1.当内存达到一定使用限制
  • 2.定期清理

还有一种特殊情况,value永远不会Gc回收,最终导致内存泄漏。
比如,js的闭包。如下,案列。

var a1 = [];
var a2 = [];

a1[0] = a2;
a2[0] = a1;

当然,js引擎有处理这样问题的办法,通过简单的循环检测。如果一个引用类型的值,无法通过栈内存的引用访问。
那么可以确定,此时变量已经不存在,那么就可以清除此值。

JavaScript数组的堆栈和队列

:他是一种数据结构,它里面的数据结构特点是,成队列排序。栈对数据操作行为是,后进先出,或者尾进尾出(即栈顶的先出栈)。

通过数组的push(),pop()方法实现栈。

//尾进尾出
 let arr = [1,2,3];
console.log(arr.push(4));
console.log(arr.join('-'));
console.log(arr.pop());

//头进头出,听起来别扭,遵从后进先出特点
let arr1 = ['a','v','c'];
console.log("--------------------------");
console.log(arr1.join('-'));
console.log(arr1.unshift('z'));
console.log(arr1.shift());

队列:也是程序运行时的一种数据结构,他的数据数据访问规则是,现进先出。他的队列结构不同于栈的桶状结构(比喻),他的两端是相通的。

数组实现队列的先进先出,通过: shift( ),unshift( ).

let arr = [1,2,3];
let s_arr = arr.unshift(1).join(',');
console.log(s_arr);
let d_arr = arr.shift().join(',');
console.log(d_arr);

//头进尾出
let arr3 = ['a','c','z'];
console.log(arr3.join('-'));
arr3.unshift('ok');
console.log(arr3.join(','));
arr3.pop();
console.log(arr3.join(','))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值