引用类型的赋值问题

问题描述:

1 var a = {n: 1};
2 var b = a;
3 a.x = a = {n: 2};
4 console.log(a.x);
5 console.log(b);
6 输出什么

错误分析:
直觉性的判断a.x={n,2};b={n:2,x:object};

写了JS示例,在火狐中通过F12调用控制台面板得到以下输出:

错误原因有两点:

理解了引用类型变量的复制情况,没有理解引用类型变量作为指针实质,赋值时的使用。

操作符的优先级知识混乱。

正确解题思路:

首先了解,引用类型Object:

  • 在复制变量时,两个变量作为指针指向同一个对象;
  • 在变量赋值时,是重新指向另一个对象;
  • 通过点表示法,访问修改属性值时,所指向的对象地址不变;

其次关于操作符的有限性:

  • 赋值是从右往左,但是"."(字段访问操作符)的优先于"="(赋值操作符);

在了解到这两点后,开始分析题目的处理过程:

1 var a = {n: 1};     //将a指向对象{n:1}
2 var b = a;          //引用类型变量复制,b也指向对象{n:1}
3 a.x = a  = {n: 2};  //按照操作符优先级处理a.x,即添加a所指对象的属性x,对象修改为{n:1,x:undefined}
4                     //再按照自右向左的顺序赋值,先引用类型a重新指向新对象{n:2},
             //后从变量a向变量a.x赋值引用类型,指向同一个对象{n:2}
5 console.log(a.x); //a没有x属性,undefined 6 console.log(b); //b指向对象{n:1,x:Object}

附变量关系图:

原文地址:https://www.cnblogs.com/hhccdf/p/7001630.html