我们先看一道面试题,你觉得会打印出什么?
<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的指针是指向原来空间的
于是就是如浏览器所展示的一致。
这就是今天的分享了
大家不清楚或者不对的地方可以指出来一起交流哈