js内存空间
0 Views 前端 with
本文字数:529 字 | 阅读时长 ≈ 2 min

js内存空间

0 Views 前端 with
本文字数:529 字 | 阅读时长 ≈ 2 min

这篇文章主要介绍了js内存空间

理解js内存空间,对于我们理解很多题目大有帮助,特别是一些面试题目。例如下面这个题目:

1
2
3
4
5
6
7
8
9
10
11
12
var a = 20;
var b = a;
b = 30;
// 这时a的值是多少?

var m = {
a: 10,
b: 20
}
var n = m;
n.a = 15;
// 这时m.a的值是多少

js内存空间

栈与堆

其实js中没有严格意义区分栈内存和堆内存。但是我在理解的时候还是把他们分开了!我个人是如下理解的:

变量对象与基础数据类型(例如:Undefined、Null、Boolean、Number、String)都放在栈(stack)里
引用数据类型,比如:对象,数组等一般都放在堆(heap)里

例如如下代码:

1
2
3
4
5
6
7
8
var a1 = 0; // 变量对象
var a2 = 'this is string'; // 变量对象
var a3 = null; // 变量对象

var b = {
m: 20
}; // 变量b存在于变量对象中也可以理解为栈,{m: 20} 作为对象存在于堆内存中
var c = [1, 2, 3]; // 变量c存在于变量对象中也可以理解为栈,[1, 2, 3] 作为对象存在于堆内存中

基础数据类型也可以理解为栈里的数据都是按值访问,我们可以直接操作保存在变量中的实际的值。但是在堆内存中,我们不能直接操作对象的堆内存空间。在操作堆里的对象时,实际上是在操作对象的引用而不是实际的对象。因此,引用类型的值都是按引用访问的。我们可以地把引用理解为保存在变量对象中的一个地址,这个地址是和堆内存的值是相关联的。

那么上面的面试题目我们可以用如下图来解释:

因此a还是20

第二个题目:

复制之后是引用的复制。修改了堆里面的对象之后,n和m对应的是同一个对象,因此输出m.a会变成15

Sep 02, 2018