写在前面

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

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

完事。

单纯的小标题

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


小了白了兔
1 声望0 粉丝