关于引用类型连续赋值的一点见解

写在前面 这几天有同事要离职了,在准备面试,昨天晚上突然问我一个问题,说有点看不明白是怎么回事,我说发给我看看:

var a = {n:1}; var b = a; a.x = a = {n:2}; console.log(a.x); // --> undefined console.log(b.x); // --> {n:2} console.log(a === b.x); // --> true

我一看不就是一个赋值语句吗,这有啥,前两行略过,然后右结合,然后,emmmm...
原谅我有点草率了。
所以这个地方到底是怎么回事呢? 由于我强烈的好奇心,晚上下班我都没走,查了一个小时blog(大部分时间都是在看没用的东西),画画图,总结了一下,有了一点个人的见解,下面先看看最主要的三个知识点:

js中创建一个值,分为三部分:
1、创建一个值(如果这个值是基本类型值,就直接在栈内存中直接创建,如果是引用类型值,需要在堆内存开辟一个新的空间,把里面的内容存储进去)
2、创建一个变量(先把值创建好后,才是创建变量)
3、让值与变量相关联
变量赋值底层逻辑
【关于引用类型连续赋值的一点见解】
我们这里赋值的是对象,引用类型
那么是存在堆内存区域,我引用一下别人的图(自己懒得画了)
关于引用类型连续赋值的一点见解
文章图片

JS中变量的存储

赋值语句在ECMA的定义如下:
LeftHandSideExpression = AssignmentExpression
借用大佬的理解:左手边表达式 = 赋值表达式
你真的理解js的赋值语句么
通过以上三个方面的知识补充,我想我应该是明白怎么回事了。
小结一下
var a = {n:1}; var b = a;

关于引用类型连续赋值的一点见解
文章图片

a.x = a = {n:2};

在堆内存中开辟一块区域,创建{n:2}
获取变量a的值(是一个指向堆内存{n:1}的地址的值)
获取变量x的值(这里未声明x属性,所以在a指向的堆内存区域声明一个x)
关于引用类型连续赋值的一点见解
文章图片

将堆中的{n:2}的地址关联到a变量
将堆中的{n:2}的地址关联到x
关于引用类型连续赋值的一点见解
文章图片

完事。
单纯的小标题 自己觉得自己懂了,未必真懂
能给人讲明白了,那是真懂了,而且这个过程可能会有更多收货
如果我错了,不说出来我永远不知道我是错的
欢迎大佬指出我的错误,拜谢~

    推荐阅读