文 / 景朝霞
来源公号 / 朝霞的光影笔记
ID / zhaoxiajingjing
图 / 自己画
❥❥❥❥点个赞,让我知道你来过~❥❥❥❥

let a = 12;let b = a;b = 13;console.log(a);-----------------let a = {n: 12};let b = a;b['n'] = 13;console.log(a.n);-----------------let a = {n: 12};let b = a;b = {n: 13};console.log(a.n);

△ 来,亮出你的答案吧~

停!!!

画图、画图去

.

.

.

输出结果分别是

13

13

12


△ 20-6-14.1图解

浏览器执行代码时,开辟一块栈内存作为执行环境 execution context。把需要执行的代码进栈执行,执行完毕后出栈销毁。

全局作用域/执行上下文/栈内存直到应用程序退出,例如关闭网页或浏览器时才会被销毁。

在Web浏览器中,Global 对象指向的是window对象,这是一个“兜底儿对象”。换句话说就是,不属于任何其他对象的属性和方法,都是它的属性和方法。

例如:parseInt()setTimeout()alert()等等。

在全局作用域中有一个变量对象 variable object,在环境中定义的所有变量和函数都保存在这个对象上。我们编写的代码无法访问这个对象,但解析器在处理数据时会用到它。

var/function/let/const声明的变量都会存储在VO上,但是,只有var/function声明的变量会同时作为window的属性出现。

基本数据类型值:直接存储在栈内存中

numberbooleanstringundefinednullsymbolbigint

引用数据类型值:一种复杂的数据,存储在堆内存中

object:普通对象、实例、正则、日期、Math数学函数、prototype__proto__、函数等

function:普通函数、构造函数、类等

第一段代码L1-L4

L1: 变量a中保存的值是12。

L2:当使用a的值来初始化b时,b中也保存了值12。

但b中的12与a中的12是完全独立的,该值只是a中12的一个副本。

此后,这两个变量可以参与任何操作而不会互相影响。

输出结果:13

写这个时候,想到了看的电视剧《三生三世枕上书》

白凤九殿下为了给东华帝君报恩,也划去一片影子追随帝君去历劫了

他们的影子都投生在梵音谷以阿兰若和沉烨的身份开启另一段生活了

这个副本就是他们的第三世,一段虐心的故事

扯远了.....再回来....

第二段代码L6-L9

当一个变量向另一个变量赋值引用类型的值时,同样也会将存储在VO中的值复制一份放到新变量中存储。

不同的是,这个值的副本是实际是一个指针,而这个指针指向存在堆内存中唯一的对象。

两个变量实际上引用的是同一个对象。

因此,改变其中一个变量,就会影响另一个变量。

输出结果:13

第三段代码L11-L14

变量a存储一个引用类型的堆地址,变量b用变量a的值初始化后,他俩指向同一个堆地址。

L13:b={n:13}这句代码的意思是:

① 创建一个引用类型的值,开辟一块堆内存(地址:AAAFFF111),存储键值对

② 变量b已经初始化过了

③ 把堆内存的地址与变量b关联起来

这样变量b指向了一个新的堆内存,变量a的保持不变。

输出结果:12

- end -