关于JS中赋值语句的地址指向问题理解


初学JS语言的朋友们肯定会遇到到关于地址指向有关的问题问题,首先关于数据类型,一般可分为基本类型的变量和引用类型的变量,两者的存放方式自然是不同的,

  • 基本数据类型:基本类型值在内存中占据固定大小,数据直接存储在栈内存
  • 引用数据类型:引用类型在栈中存储了指针,这个指针指向堆内存中的地址,真实的数据存放在堆内存里。

具体如下:
一、基本类型的变量


其数据的存放方式如下图:


就是在栈内存(stack)中申请一块空间,存储数据内容。

还要注意:

  • 基本数据类型的值是不可变的,javascript中的原始值(undefined、null、布尔值、数字和字符串)是不可更改的,比如修改上面变量a的第一个值a[0]=0,输出的结果仍为123. 注意如果你写a = 0 ,这不是在修改a,而是在给a赋值。
  • 引用数据类型:引用类型是可以直接改变其值的

二、引用类型的变量
引用类型的变量一般涉及到数组、对象的声明赋值,以对象声明为例:
其数据的存放方式大体如下图:

 

同样是在栈内存(stack)中申请了两块空间,但存放的数据并非对象本身,而是在栈中存储了指针,这个指针指向堆内存中的地址,真实的数据存放在堆内存里。

 

与此类似,对象中存在对象时同理。
这里需要注意的是,如相互赋值,结果如下:

可以看到如果把1赋值给2,那么2就会指向1的地址,然后无论1和2谁修改了对象中的name和sex,他们的值都会发生改变,因为两者实际上指向的地址是同一块堆内存。

三、数据类型的比较

  • 基本数据类型: 基本类型的比较是值的比较,只要它们的值相等就认为他们是相等的
  • 引用数据类型: 引用数据类型的比较是引用的比较,看其的引用是否指向同一个对象
//基本数据类型
var a = 1;
var b = 1;
console.log(a === b);//true

//引用数据类型
var a = [1,2,3];
var b = [1,2,3];
console.log(a === b); // false   
//虽然变量 a 和变量 b 都是表示一个内容为 1,2,3 的数组,
//但是其在内存中的位置不一样,也就是说变量 a 和变量 b 指向的不是同一个对象,所以他们是不相等的

这样可以更好的帮助理解引用数据类型的地址与栈内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值