js中原始数据(原始值)与复杂数据(引用值)在数据引用上的区别

本文介绍了JavaScript中原始数据和复杂数据在数据引用上的差异。原始数据存储在栈中,赋值操作会创建独立的副本;而复杂数据存储在堆中,赋值操作会导致多个变量共享同一堆内存。通过示例解释了数组赋值后如何影响相关变量,强调了理解数据存储方式对于正确操作变量的重要性。
摘要由CSDN通过智能技术生成

在这里插入图片描述

所以两大类的数据引用方法是不同的,见下例:

  • 原始数据的引用
案例一:
var a = 10;
var b = a;
a = 20;
document.write(b);  //return 10 (b没有受到新赋值a的影响)

复杂数据的引用

案例二:
var arr1 = [1,2];
var arr2 = arr1;
arr1.push(3);
document.write(arr2); //return [1,2,3] (arr2受到了arr1的影响)
案例三:
var arr1 = [1,2];
var arr2 = arr1;
var arr1 = [1,2,3];
document.write(arr2);  //return [1,2] (arr2没有受到arr1的影响)

发生上述三个不同情况的根本原因在于存储位置stack与heap的区别。

案例一:
var a = 10;
var b = a;
a = 20;
document.write(b);  //return 10 (b没有受到新赋值a的影响)

在案例一中,10赋值给a,相当于在stack栈中给a开设了一个存储空间,存储的数值为10。a再赋值给b,相当于给b开设了一个存储空间,值从a的空间直接复制。所以如图,a与b二者在赋值后是相互独立的。改变a的值只是改变了a空间,和b没有关系。两个不同的存储空间。

在这里插入图片描述

案例二:
var arr1 = [1,2];
var arr2 = arr1;
arr1.push(3);
document.write(arr2); //return [1,2,3] (arr2受到了arr1的影响)

所有复杂数据都储存在堆heap中,但是并非直接通过名称储存,而是通过stack存储的路径。把数组储存在heap中,通过heap的路径(eg. heap1001)来引用。路径存储在stack的空间中。所以当arr1把数组赋值到arr2时,实际上是两个stack栈(arr1,arr2)共同指向堆heap的同一个空间[1,2]。push(3)输入后heap1001的值改变为[1,2,3],自然,arr1与arr2的值都会改变,因为arr1与arr2指向同一房间。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200510171844743.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NhcGdyYXM=,size_16,color_FFFFFF,t_70在这里插入图片描述

案例三:
var arr1 = [1,2];
var arr2 = arr1;
var arr1 = [1,2,3];
document.write(arr2);  //return [1,2] (arr2没有受到arr1的影响)

把arr1的值赋给arr2,实际上是把arr1的空间heap1001共享给arr2. arr1被重新赋值新的数组,是指在heap中开设新的空间来存储新数组。所以arr1指向[1,2,3],arr2指向[1,2],两者互不干涉,最后输出arr1还是原始的数组[1,2]

综上所述,只要开设新数组,那么就会开设新的房间,该房间不会对其他变量产生影响。不同的数据类型存储方式不同,需要区别分析,不能简单赋值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值