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

6次阅读

共计 850 个字符,预计需要花费 3 分钟才能阅读完成。

写在后面

这几天有共事要到职了,在筹备面试,昨天晚上忽然问我一个问题,说有点看不明确是怎么回事,我说发给我看看:

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

完事。

单纯的小标题

本人感觉本人懂了,未必真懂
能给人讲明确了,那是真懂了,而且这个过程可能会有更多收货
如果我错了,不说进去我永远不晓得我是错的
欢送大佬指出我的谬误,拜谢~

正文完
 0