赋值顺序的理解

53 阅读1分钟
let a = {n:1}
let b = a  //  b = {n:1}
a.x = a = {n: 4}
console.log(a.x) //  undefined
console.log(b.x) //  {n:4}

结果为什么会这样,原因如下:

1. 首先赋值如果是基础类型,因为是在栈内存中,会直接新开辟一个空间赋值,如果是引用类型,那就是赋值一个地址。所以第一第二行,{n:1} 地址赋值给了 a,a 同时把这个地址赋值给了 b,所以 a 和 b 地址都是指向 {n:1}

2. 第三行,由于"."运算符的优先级是高于"="运算符的,此时优先是 a.x 执行,但是此时 a.x 并没有值,所以暂时是 undefined,所以此时 a 和 b 地址指向为 {n: 1, x: undefined}

3. 然后再执行“=”运算符,此时 {n: 4} 赋值给 a,所以 a 就重新开辟了一个空间地址指向 {n: 4},和原来的 {n:1, x:undefined} 就无关了

4. 接下来执行 a.x = a 因为 a.x 已经是优先执行了,刚在暂时赋值为 undefined,现在把 a 的值 {n: 4} 赋值给 a.x,实际上就是给原来的 a,现在的 b 的那个地址更新一下赋值变为 {n: 1, x: {n:4}}

5. 所以打印时候,现在的 a 本来就是没有 x 属性的