从头开始梳理JS(二)

98 阅读2分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

从头开始梳理JS

书接上文,上文我们说过了 var,let以及const。这三兄弟的作用都是用来定义变量的。那么我们定义的变量到底是怎样的呢?我们定义的变量又是怎样存在内存中的呢?

基础类型变量存储

首先,我们来说一下我们定义的变量在内存中是如何存放的。拿出我们上一篇文章写过的一点代码:

var str = 'str' 
var num = 0 
var bool = true
var undefine = undefined
var kong = null

我们可以看到,等号后面的内容是不一样的,上面这五种是我们js最开始的五种数据类型。按照顺序分别为,string(字符串类型),number(数字类型),boolean(布尔值),undefinded(未定义)以及null(空值)五种。我们可以通过下图来看。

WechatIMG33.png

引用类型变量存储

我们在第一篇文章中还有这么一个定义 var obj = { a:1 },这时我们定义的就不是一个基础类型而是一个引用类型了,当我们定义这种数据的类型时,内存时如何存储的呢?

WechatIMG34.png 在定义一个引用类型的时候,我们在栈内存中开拓一个空间,但是这个空间不是用来直接存数据的而是用来存一个地址的。这个地址就是用来指向我们堆内存中的一个空间。这是如果我们有另一个变量 obj2 = obj时,会发生什么呢?

WechatIMG36.png 我们可以看到,obj2 也是会开辟一个内存空间的,但是其中存的地址和obj是一样的。所以这就导致了当我们更改obj中一个属性的值时,obj2也会发生改变。这就是一个浅拷贝,我们只拷贝了对象的地址。