写在后面
这几天有共事要到职了,在筹备面试,昨天晚上忽然问我一个问题,说有点看不明确是怎么回事,我说发给我看看:
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
完事。
单纯的小标题
本人感觉本人懂了,未必真懂
能给人讲明确了,那是真懂了,而且这个过程可能会有更多收货
如果我错了,不说进去我永远不晓得我是错的
欢送大佬指出我的谬误,拜谢~