一道关于  对象之间  值传递的问题
```
    var a = {
      num: 2
    };

    var b = a; 

    a.num = a = {
      num: 4
    };
    console.log(a.num);// 4
    console.log(b.num);// { num: 4 }

```
这个b.num是4不是因为 'var b = a时' b指向a了吗？那为什么下面那个没有指向a
```
    var a = {
      num: 2
    };

    var b = a; //没有把指向给b吗

    a = {
      num: 4
    };
    console.log(b.num)  //为什么是2  a已经是4了b的指向还是a为什么不是4？
```
Javascript中有5种基础数据类型，分别是`Undefined、Null、Boolean、Number、String（ES6中新加的Symbol，暂时不考虑它）`，基础数据类型都是按值访问，即我们可以直接操作保存在变量中得实际值。而Javascript中的引用数据类型，比如Array，Object。。。它们的值是保存在堆内存中得对象，Javascript 不允许直接访问堆内存中的数据，即无法直接操作对象的堆内存空间。在操作对象时，实际上我们操作的是对象的引用，也就是我们经常提及的内存地址、内存指针等。废话不多说，咱们来看题目。
```
var a = {
  num: 2
};

var b = a;
```
我们通过` var b = a; `进行引用类型的赋值操作，该操作会自动分配一个值保存在变量b，不过这个值就是咱们经常提及的引用类型的一个内存地址或内存指针。当内存地址相同时，尽管变量之间相互独立，但访问的具体对象实际上是同一个，即变量 a 和 b 在内存空间对应的对象是同一个，在该位置您不管是修改a.num，还是修改b.num，它们两个都会受影响！
接下我们再分析一下最容易迷惑的一行代码：
```
a.num = a = {
  num: 4
};
```
因为Javascript的成员访问优先级（19）比赋值优先级（3）高（运算符优先级可参考：运算符优先级），因此先执行成员访问a.num，上面我们说了不管您是修改a.num，还是修改b.num，它们两个都会受影响！所以这里变量b也会受到影响，因此实则发生了如下赋值代码：
```
b.num = a = {
    num: 4
}
```
所以变量b对应的堆内存的对象如下：
```
b = {
 num: {
   num: 4
 }
}
```
接下来我们再看看变量a，变量a起先对应的堆内存的对象为：
```
a = {
  num: 2
};
```
当执行 `b.num = a = { num: 4 }`再次进行引用类型的赋值操作，在这里会重新为a分配一个内存指针！所以a最终变成了：
```
a = {
  num: 4
};
```