这里先说两个概念:1、堆(heap)2、栈(stack)
 是堆内存的简称。
 是栈内存的简称。
说到堆栈,我们讲的就是内存的使用和分配了,没有寄存器的事,也没有硬盘的事。
各种语言在处理堆栈的原理上都大同小异。堆是动态分配内存,内存大小不一,也不会自动释放。栈是自动分配相对固定大小的内存空间,并由系统自动释放。

javascript的基本类型就5种:Undefined、Null、Boolean、Number和String,它们都是直接按值存储在栈中的,每种类型的数据占用的内存空间的大小是确定的,并由系统自动分配和自动释放。这样带来的好处就是,内存可以及时得到回收,相对于堆来说,更加容易管理内存空间。

javascript中其他类型的数据被称为引用类型的数据 : 如对象(Object)、数组(Array)、函数(Function) …,它们是通过拷贝和new出来的,这样的数据存储于堆中。其实,说存储于堆中,也不太准确,因为,引用类型的数据的地址指针是存储于栈中的,当我们想要访问引用类型的值的时候,需要先从栈中获得对象的地址指针,然后,在通过地址指针找到堆中的所需要的数据。

说来也是形象,栈,线性结构,后进先出,便于管理。堆,一个混沌,杂乱无章,方便存储和开辟内存空间
传值与传址

var arr1 = [1,2,5,8];
var arr2 = arr1 ;
var str1 = arr1[2];
console.log(arr2);//1,2,5,8
console.log(str1);//5
arr2[4] = 99;
str1 = 6;
console.log(arr1);//1,2,5,8,99
console.log(arr1[2]);//5

上方例子得知,当我改变arr2中的数据时,arr1中数据也发生了变化,当改变str1的数据值时,arr1却没有发生改变。为什么?这就是传值与传址的区别。

因为arr1是数组,属于引用类型,所以它赋予给arr2的时候传的是栈中的地址(相当于新建了一个不同名“指针”),而不是堆内存中的对象的值。str1得到的是一个基本类型的赋值,因此,str1仅仅是从arr1堆内存中获取了一个数值,并直接保存在栈中。arr1、arr2都指向同一块堆内存,arr2修改的堆内存的时候,也就会影响到arr1,str1是直接在栈中修改,并且不能影响到arr1堆内存中的数据。

浅拷贝和深拷贝

上边说到的赋值方式就是浅拷贝,那么什么叫作深拷贝呢?就是要将arr1的每个基本类型的数据都遍历一遍,依次的赋值给arr2的对应字段。避免产生因为地址引用带来的问题。

var arr1 = [1,2,5,8];
var arr2 = [];
for(var i=0;i<arr1.length;i++){arr2[i]=arr1[i];
};
console.log(arr2)//1,2,5,8
arr2[4]=99;
console.log(arr2)//1,2,5,8,99
console.log(arr1)//1,2,5,8

javascript面向对象的语言本身在处理对象和非对象上就进行了划分,从数据结构的角度来讲,对象就是栈的指针和堆中的数值。

本文内容借鉴自
链接:https://www.jianshu.com/p/5e0...

理解JavaScript中的堆和栈相关推荐

  1. 详细讲解JavaScript中的堆和栈

    1.栈(stack)和堆(heap) stack为自动分配的内存空间,它由系统自动释放: heap则是动态分配的内存,大小不定也不会自动释放. 2.基本类型和引用类型 基本类型:存放在栈stack内存 ...

  2. Jvm(29),理解升级----C语言中的堆和栈的区别 (可以借鉴)

    假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情 ...

  3. Java中的堆和栈的区别

    当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更糟糕的是,Java中存在栈这样一个后进先 ...

  4. 关于.NET内存中的堆和栈

    http://www.cnblogs.com/zoupeiyang/archive/2011/07/20/2112163.html 今天中午李建忠老师发了一条关于class性能好还是struct性能好 ...

  5. 嵌入式开发中的堆与栈

    关注.星标公众号,直达精彩内容 文章内容出处:网路素材 整理:李肖遥 0.前言 堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下, ...

  6. 帮助你更好理解javascript中easing功能的网站 - Easings.net

    日期:2012-10-17  来源:GBin1.com 如果你开发过jQuery的动画效果的话,肯定接触过一个jQuery插件:jquery.easing plugin,这个插件可以帮助你生成不同类型 ...

  7. 理解javascript中的回调函数(callback)【转】

    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...

  8. php event loop,理解javascript中的事件循环(Event Loop)

    背景 在研究js的异步的实现方式的时候,发现了JavaScript 中的 macrotask 和 microtask 的概念.在查阅了一番资料之后,对其中的执行机制有所了解,下面整理出来,希望可以帮助 ...

  9. 理解JavaScript中的原型继承(2)

    两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...

最新文章

  1. hive sql练习_SQL语句+语法 I 数据分析面试必备
  2. 2021年北京高校数学建模校际联赛题目_B
  3. AT2365-[AGC012E]Camel and Oases【状压dp】
  4. .NET高级代码审计(第三课)Fastjson反序列化漏洞
  5. 发一则自己创作的Lae程序员小漫画,仅供一乐
  6. Corba传值包含中文解决
  7. opencv mat赋值_opencv-python 关于位操作
  8. 卷积神经网络CNN结构
  9. java添加关闭窗口事件_Java开发网 - 如何给JInternalFrame类的窗口添加关闭事件?...
  10. 卸载 Navicat!事实已证明,正版客户端,它更牛逼……
  11. 【Unity】12.3 Off Mesh Link组件
  12. Linux 镜像文件ISO下载地址、centos网络配置:
  13. C语言实验:输入任意一个日期的年、月、日的值,求出从公元1年1月1日到这一天总共有多少天,并求出这一天是星期几。
  14. 详解SQL中Groupings Sets 语句的功能和底层实现逻辑
  15. CAD直接打印,不出现打印对话框
  16. 计算9+99+999+……+999999999
  17. CA410_SDK测试及读数软件
  18. libjpeg库的简单使用,rgb565与rgb888互转,以及色块的寻找
  19. python解包什么意思_Python 解包骚操作,看这篇文章
  20. Qt修改exe文件图标

热门文章

  1. python(学习笔记-自用)
  2. XnView v2.0
  3. Spring之Joinpoint类详解
  4. float转int型
  5. ubuntu linux 换源,给Ubuntu换源
  6. delphi cxgrid导出excel去除货币符号
  7. Mapstruct中类型的映射规则(二)
  8. python面向对象编程中_Python面向对象编程中关于类和方法
  9. html 文本文字选中效果,CSS ::selection选中文字后的效果
  10. 如何使用Floccus + 坚果云管理自己的浏览器书签