一道常考的JS连续赋值面试题

565 阅读1分钟
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}}