带你好好理解JS堆和栈

121 阅读1分钟

我们先看一道面试题,你觉得会打印出什么?

<script>
        var a = { n: 1 };
        var b = a;
        a.x = a = { n: 2 };

        console.log(a.x)
        console.log(b.x)
</script>

我们先看一下浏览器

图片

为什么会这样呢?我们首先就想到堆和栈的知识

当浏览器运行到这一段代码的时候,会先简单处理一下变量,也就是变量提升了,就是在栈中声明了一个 a 和一个 b。

然后变量提升完后就进行相应的赋值操作,一共进行了两步。

先将 a 的指针指向堆中的 { n:1 },然后就 b 又将指针指向了 a 所指向的堆。如下图

(红1表示第一步,绿2表示第二步)

图片

然后我们看 a.x = a = { n : 2 } 这段代码该怎么解读呢,先执行 a.x ,为什么会这样操作呢?那是因为这是对象的属性操作,优先级是高于赋值操作的。

然后就在 a 所指向的堆中声明一个 x ,赋值为 undefined ,然后执行 { n : 2 },所以就开辟了另一个空间。

然后赋值给 a ,a的指针是指向了新开辟的空间,也就是说,而b指向的还是原来的空间,那么

可以这样理解

图片

要注意的是 a.x = a两个变量的指针指向是不同的

所以a的指针是指向新的空间的,b的指针是指向原来空间的

于是就是如浏览器所展示的一致。

这就是今天的分享了

大家不清楚或者不对的地方可以指出来一起交流哈