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,放在堆里面的变量,值相等(应为会默认转成相同数据类型进行对比),全等=会比较是否引用一个数据故不等,不会自动释放值
栈中数据可以共享,若是两个变量值一样,可以一起指向那个值

最新文章

  1. [bzoj3626][LNOI2014]LCA
  2. js 对数据转换成数据容量单位
  3. python简易爬虫来实现自动图片下载
  4. putpixel
  5. Windows Server 2003修改远程桌面最大连接数的方法
  6. 说不尽的MVVM(3) – 从通知属性说起
  7. phpexcel 导入导出
  8. .net 中连接mysql
  9. cf701A Cards
  10. $.getJSON(url,function success(){})回调函数不起作用
  11. HDOJ 1423 Greatest Common Increasing Subsequence(dp)
  12. std::string 不支持back
  13. MAC 配置--Tomcat服务器
  14. 双核 CPU
  15. Spring中的Service/DAO/DTO
  16. mysql TIMESTAMP与DATATIME的区别---转载加自己的看法
  17. 图数据库orientDB(1-2)例子
  18. Day1 《机器学习》第一章学习笔记
  19. vsCode---进行HTML文件编辑与浏览器运行
  20. php.ini 配置详解

热门文章

  1. Altium Designer 设置多层方法及各层介绍
  2. js中DOM事件探究
  3. SpringCloud Function SpEL注入
  4. Typora中Markdown学习
  5. Queue实现
  6. 内网穿透NPS
  7. MySQL入门学习day3随笔2
  8. acwing刷题--激光炸弹--前缀和(后期会有优化做法)
  9. python基础练习题(题目 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少)
  10. Ubuntu 下 Mariadb 数据库的安装和目录迁移