JavaScript中的对象,带你认清楚基础类型和引用类型都是在内存中如何运作的,栈内存和堆内存的区别。

基础类型:string Number Boole Null Undefined
引用类型:Objcet

基本类型数据直接存入栈内存。

基本类型

直接上图。然后一步一步解释。

在这里插入图片描述
我们都知道 var变量中存入的类型都是基础值,从图中可以看出,JS中的变量都存入了栈内存中。

var a =123 ;
var b =a ;
a++;

我们先是存入了a变量赋值为123,然后把a变量赋值给了b变量。此过程就是,在栈中又存入了b变量,然后b变量复制了a的值,此时从图中可以看出,a,b都已经存在了栈内存中,二者是独立的2个变量,互不影响。
所以我们执行a++的时候,修改的是a变量,对b变量并没有影响。
所以执行完后 a=124 ,b=123

引用类型

对象是保存在堆内存当中的,每创建一个新的对象,就会在堆内存中开辟一个新的空间,而栈内存的变量,保存的是对象的内存地址(对象的引用)。
当通过一个变量修改属性的时候,另一个也会受到影响。

看图 解释:
在这里插入图片描述

var obj =new Objcet() ;
obj.name ="swk";
var obj2=obj;
obj.name="zbj";

从图中可以看到,我们new了一个对象,对象是存在堆内存的,当你new了一个对象后,堆内存给你开辟一个空间,并给了你一个标识,这个标识就是内存地址,然后你把这个内存地址赋值给了变量obj,然后变量是存储在栈内存中,所以从上图中可以看到,栈内存中obj存入的值是堆内存的地址,这样栈内存和堆内存就关联了起来。
然后你给了obj一个name属性,他存储在堆内存中,接着你将obj又赋值给了obj2,我们从图一的解释可以知道,obj2会复制obj的值,所以,obj和obj2都指向了同一个地址,同一块内存,所以当你修改name属性值的时候,二者都会改变。

此时我们在进行改变,看图。
在这里插入图片描述
当obj2=null的时候
obj是不受影响的,因为图一中已经解释过,他俩是独立的变量。你让obj2为空,只是断开了他的指向,但并不影响obj的指向。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值