写在前面
这几天有同事要离职了,在准备面试,昨天晚上突然问我一个问题,说有点看不明白是怎么回事,我说发给我看看:
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
完事。
单纯的小标题
自己觉得自己懂了,未必真懂
能给人讲明白了,那是真懂了,而且这个过程可能会有更多收货
如果我错了,不说出来我永远不知道我是错的
欢迎大佬指出我的错误,拜谢~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。