前端js堆栈
1、介绍
创建数据的时候就会占用内容、内存主要开辟了两类空间
1. 堆(进程,线程共享)
大小不固定,可随时增加
不允许js直接访问堆内存
存储引用类型数据
按引用访问
存储的值大小不定,可动态调整
主要用来存放对象
空间大,但是运行效率相对较低
无序存储,可根据引用直接获取
2. 栈(线程)
创建的时候就确定了大小,故可能会溢出
按照顺序存放 先进后出
存储基础数据类型以及引用类型数据的堆地址
按值访问
存储的值大小固定
由系统自动分配内存空间
空间小,运行效率高
栈中的DOM,ajax,setTimeout会依次进入到队列中,当栈中代码执行完毕后,再将队列中的事件放到执行栈中依次执行。
复杂数据类型(Object、[数组、对象])创建的时候 开辟的 堆内存
基本数据类型(number、string等6种)创建的时候 开辟的 栈内容
var str=new String('abc');
var str='abc';
同样是创建两个字符串,第一种是用new关键字来新建String对象,对象会存放在堆中,每调用一次就会创建一个新的对象;
而第二种是在栈中,栈中存放值‘abc’和对值的引用。推荐使用第二种方式创建多个’abc’字符串,这种写法在内存中只存在一个值,有利于节省内存空间。
同时它可以在一定程度上提高程序的运行速度,因为存储在栈中,其值可以共享,并且由于栈访问更快,所以对于性能的提高大有裨益。
而第一种方式每次都在堆中创建一个新的String对象,而不管其字符串值是否相等及是否有必要创建新对象,从而加重了程序的负担。并且堆的访问速度慢,对程序性能的影响也大。
另外,出于逻辑运算的考虑,当对两个变量进行比较时,使用堆和栈存储就会有差异
var str1='abc';
var str2='abc';
alert(str1==str2); // true
alert(str1===str2); // true
不管是逻辑等于和逻辑全等运算都返回true,可以看出str1和str2指向同一个值。
var str1=new String('abc');
var str2=new String('abc');
alert(str1==str2); // false
alert(str1===str2); // false
不管是逻辑等于还是逻辑全等都返回false,可以看出str1和str2指向的不是同一个对象。
var str1=new String('abc');
var str2='abc';
alert(str1==str2); // true
alert(str1===str2); // false
在进行逻辑等于和逻辑全等运算时,会首先将变量转成相同的数据类型,然后进行对比。变量str1和str2的数据类型虽然不同,但比较运算还是返回true。但逻辑全等运算与逻辑等于运算不同,它会对数据类型进行比较,看是否是引用的同一个数据。
总结
栈内存是有限度的可以自动释放,堆内存无限不会自动释放,运行程序的时候,每个线程分配一个栈,每个进程分配一个堆
栈存放基本类型的变量、函数、对象变量指针,堆存放对象
放在栈里面的变量,只要值一样就可以全等,栈占内存较小,会自动释放值,值为null,放在堆里面的变量,值相等(应为会默认转成相同数据类型进行对比),全等=会比较是否引用一个数据故不等,不会自动释放值
栈中数据可以共享,若是两个变量值一样,可以一起指向那个值
前端js堆栈的更多相关文章
- 前端Js框架汇总
概述: 有些日子没有正襟危坐写博客了,互联网飞速发展的时代,技术更新迭代的速度也在加快.看着Java.Js.Swift在各领域心花路放,也是煞是羡慕.寻了寻.net的消息,也是振奋人心,.net co ...
- 闲聊——浅谈前端js模块化演变
function时代 前端这几年发展太快了,我学习的速度都跟不上演变的速度了(门派太多了,后台都是大牛公司支撑类似于facebook的react.google的angular,angular的1.0还 ...
- json处理总结(前端js和后端java)
前端(js): json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键,下面将介绍两者之间的相互转换. json字符串:var st ...
- 前端js文件合并三种方式
最近在思考前端js文件该如何合并,当然不包括不能合并文件,而是我们能合并的文件,想了想应该也只有三种方式. 三个方式如下: 1. 一个大文件,所有js合并成一个大文件,所有页面都引用它. 2. 各个页 ...
- 2015 前端[JS]工程师必知必会
2015 前端[JS]工程师必知必会 本文摘自:http://zhuanlan.zhihu.com/FrontendMagazine/20002850 ,因为好东东西暂时没看懂,所以暂时保留下来,供以 ...
- RSA加密前端JS加密,后端asp.net解密,报异常
RSA加密前端JS加密,后端asp.net解密,报异常 参考引用:http://www.ohdave.com/rsa/的JS加密库 前端JS加密代码: function GetChangeStr() ...
- 前端js的书写规范和高效维护的方案_自我总结使用的方案
作为程序员,人生最值得幸福的事有几件: 解决困扰了很长时间的问题 升职加薪 找个漂亮又靠谱的对象 深得领导的喜欢 带领团队冲锋陷阵 ... 哈哈,这些都是梦想,暂时想想就好了.这肯定和我说的东西不符合 ...
- 前端js,css文件合并三种方式,bat命令
前端js,css文件合并三种方式,bat命令 前端js文件该如何合并三个方式如下:1. 一个大文件,所有js合并成一个大文件,所有页面都引用它.2. 各个页面大文件,各自页面合并生成自己所需js的大文 ...
- 前端js上传文件 到后端接收文件
下面是前端js代码: <html> <head> <meta http-equiv="Content-Type" content="text ...
随机推荐
- 9_根轨迹_Part3_分离点/汇合点和根的性质
- Architecture Review Board
Architecture Review Board What's an Architecture Review? Architecture design is not a one-time final ...
- 程序人生:织梦dedecms后台/会员验证码关闭
dedecms默认是所有的功能几乎只要用到验证码的地方我们都需要验证的,如果要关闭一些验证功能我们可以参考下面的教程,这里介绍了关闭后台,留言板,会员系统等验证码功能关闭了.提示:支持DedeCMS ...
- webSocket原理探索
本文概述 Web Sockets的目标是在一个单独的持久连接上提供全双工.双向通信.在Javascript创建了Web Socket之后,会有一个HTTP请求发送到浏览器以发起连接.在取得服务器响应后 ...
- 【uniapp 开发】手绘签名组件
代码如下: <template> <view class="content"> <button type="primary" @t ...
- Java中 i++和++i 的区别
学习目标: 理解i++和++i的区别 学习内容: 1.i++ / i- - i++/i- -:遇到 i++或 i- -,i先参与运算,然后 i 再自加或自减1 代码如下: int a = 1; int ...
- CSS简单样式练习(三)
运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...
- Springboot集成cache的key生成策略
代码接上文:深度理解springboot集成redis缓存之源码解析 ## 1.使用SpEL表达式 @Cacheable(cacheNames = "emp",key = &quo ...
- &&与&,||与| 区别
1. &&和&都是表示与,区别是&&只要第一个条件不满足,后面条件就不再判断. 而&要对所有的条件都进行判断. public class Test { ...
- 使用Visual Studio 2019开发Qt程序
安装Qt 如标题,你首先需要到 http://download.qt.io/ 去下载并安装Qt,并在引导下安装MSVC组件(这里不做过多解释) Visual Studio 2019 配置 打开VS20 ...