关于JS中引用类型的变量内存地址指向问题

关于JS中引用类型的变量内存地址指向问题


初学JS语言的朋友们会学习到关于变量的类型问题,变量一般可分为原始类型的变量和引用类型的变量,两者的存放方式自然是截然不同的,那么具体的区别是说明呢?具体如下:

一、原始类型的变量

原始类型的数据这里无需多说,例如:

	var a = 123,
		b = 456;

其数据的存放方式大体如下图:
在这里插入图片描述

就是在栈内存(stack)中申请一块空间,存储数据内容。打一个不恰当的比喻,就好比去酒店开好房间后直接将要存放的东西放入房间中,这种变量的声明与赋值理解起来很简单,我们称之为原始类型的变量。数字、字符串、布尔型数据均可直接赋值为此类变量。

二、引用类型的变量

引用类型的变量一般涉及到数组、对象的声明赋值,以对象声明为例:

	var user1 = {
		name:'Mago',
		sex:'male',
	  	add:{
			country:'China',
			city:'shanghai'
	  }
	};
	var user2 = {
		name:'Mago',
		sex:'female',
	  	add:{
			country:'China',
			city:'beijing'
	  }
	}

其数据的存放方式大体如下图:
在这里插入图片描述
同样是在栈内存(stack)中申请了两块空间,但存放的数据并非对象本身,而是存放在堆内存(heap)中申请的空间的地址;与此类似,对象中存在对象时同理。
这里需要注意的是,如相互赋值,结果如下:

	var user1 = {
		name:'Mago',
		sex:'male',
	  	add:{
			country:'China',
			city:'shanghai'
	  }
	};
	var user2 = {
		name:'Mago',
		sex:'female',
	  	add:{
			country:'China',
			city:'beijing'
	  }
	};
	user2 = user1;

在这里插入图片描述
这样如将user1、user2两者任意之一对象的内容更改,另一个在访问的过程中,访问到的内容也会是更改后的内容,因为两者实际上指向的地址是同一块堆内存。

为了进一步理解,我们做出进行以下调整,存放的数据又会有所改动:

	 var user1 = {
            name: 'Mago',
            sex: 'male',
            add: {
                country: 'China',
                city: 'shanghai'
            }
        };
        var user2 = {
            name: 'Mago',
            sex: 'female',
            add: {
                country: 'China',
                city: 'beijing'
            }
        };
        user2.sex = user1.sex;
        user2.add = user1.add;
        user2.add.country = 'USA';

在这里插入图片描述

此时user2的name、sex属性都已改变为user1的name、sex的值,但是值得关注的是,user2的add属性因为是一个引用类型的变量,因此地址会改变为user1的add的地址,这样一来,user2与user1中任一add属性发生变化,二者都会有所改动。这就是引用类型的变量内存地址指向问题。

三、拓展知识

JS中的垃圾回收

在这里插入图片描述

垃圾回收器,会定期的发现内存中无法访问到的对象,该对象称之为垃圾,垃圾回收器会在合适的时间将其占用的内存释放。

此文源于本人一点知识积累,仍处于学习阶段,有不足之处还请指出交流,谢谢!

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值