let a = {
n:1
}
let b = a
a.x = a = {
n:2
}
console.log(a.x)
console.log(b)
此题目用到的知识点:堆栈内存,运算符优先级。
这道题网上看了很多个版本的解释,愣是一个没看得懂。之前看b站某培训机构的面试题(b站本科毕业,慕课硕博连读),那上面对此题解释如下:
a.x = a = {n:2}是 先把a.x指向{n:2},再把a指向{n:2}。
乍一看没什么问题,但是了解一下运算符执行顺序,好像并不是这样。
某培训机构老师的截图:(我认为这个培训机构的老师说的是错的)
但是MDN上却有如下解释:
所以我综合mdn做出如下判断:
根据mdn运算符的优先级:
a.x = a = {n:2},由于.运算符优先级高于=,首先执行 a.x,相当于在{n:1}这个内存地址(我们把这个堆内存称之为0XA)里创建了一个新的内存x:undefined.
此a.x严格意义上来说代表的是堆内存0XA里的 x:undefined,此时堆内存OXA为{n:1,x:undefined}。
之后按照=的右运算法则,把{n:2}(我们把这个堆内存称之为0XB)赋给a变量,此时变量a的内存地址变为0XB,然后把a,也就是把0XB再次赋给堆内存OXA里的x属性,最终OXA内存变为{n:1,x:{n:2}}。
所以
console.log(a.x)相当于在a的新引用{n:2}创建了x属性并赋值undefined.
console.log(b)也就是输出了堆内存OXA{n:1,x:{n:2}}。