let a=b={m:2}的顺序

88 阅读1分钟

遇到过一到题:大概是这样的。

let a = { m: 0 }
let b = a
a.x = a = {m:2}
console.log(a.x) //undefined
console.log(b.x) //{m:2}

分析:a和b都是对象,在栈中存储的地址。所以b = a是把a保存的地址(也就是{m:0}的地址)赋值给b。然后就是本人答错的部分,也是本文的重点。 a.x = a = {m:2} 先执行a.x = {m:2} 后执行 a = {m:2}。

第一步,在a里添加属性x并且赋值{m:2}。这时候b里面保存也是这个地址,所以b 和 a 都是 {m:0,x:{m:2}}

第二步,将a里面保存的地址换成了{m:2}的地址。所以a.x输出undefined,b.x输出{m:2}

下面是代码验证:

let a = { m: 0 }
let b = a
a.x = {m:2}
console.log(a==b);//true
a = {m:2}
console.log(a.x) //undefined
console.log(b.x)// {m:2}
console.log(a==b);//false