简单例子理解值类型的值和引用类型的值得存储在堆或栈中的问题

152 阅读2分钟

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战

简单例子理解值类型的值和引用类型的值得存储在堆或栈中的问题

在JS中,每一个数据都需要一个内存空间。内存空间又被分为两种,栈内存(stack)与堆内存(heap)。

 一、JavaScript 中的数据类型 

  • 原始数据类型: number,string,boolean,undefined, null,object
  • 基本类型(简单类型),值类型: number,string,boolean
  • 复杂类型(引用类型):object
  • 空类型:undefined,null  

二、值的存储问题

1、值类型 基础数据类型与栈内存

这些值都有“固定的大小”,往往都保存在"栈内存"中(闭包除外),由系统自动分配存储空间。我们可以直接操作保存在栈内存空间的值,因此基础数据类型都是按值访问,值类型直接的传递传的是值。

数据在栈内存中的存储与使用方式类似于数据结构中的堆栈数据结构,遵循"后进先出"的原则。

var lut=520;

2、引用类型

与其他语言不通,JS的引用数据类型,比如Array、Object,它们值的"大小是不固定"的。引用数据类型的值是保存在堆内存中的对象。Java不允许直接访问堆内存中的位置,因此我们不能直接操作对象的堆内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。因此,引用类型的值都是按引用访问的。这里的引用,我们可以粗浅地理解为保存在栈内存中的一个地址,该地址与堆内存的实际值相关联。

引用类型的值是对象在堆上存储,地址在栈上存储;引用类型作为函数传递,传的是地址(引用)。

var lut = new Person ("lzp", 520, 1314);

上例变量的内存分配情况图解

因此当我们要访问堆内存中的引用数据类型时,实际上我们首先是从栈中获取了该对象的地址引用(或者地址指针),然后再从堆内存中取得我们需要的数据。理解了JS的内存空间,我们就可以借助内存空间的特性来验证一下引用类型的一些特点了