1)案例分析:先理解,将某一变量赋值为数组、对象、对象数组的时候,该变量实际上只是一个傀儡,是数组、对象、对象数组的引用
var
a={n:1};//定义变量a,将(一个属性为n,属性值为1的对象{n:1})赋值给a,假设(这个属性为n,属性值为1的对象{n:1}),存储的地址为address_1
var
b=a;//定义变量b,指向变量a,实际上此时,变量a、b均指向存储地址address_1
a.x=a={n:10086};
//此处拆开看,并且需要理解"="等号为右赋值
//1、变量a新增定义一个属性x,该属性x的值被右赋值(第一个"="等号)为a,也就是赋值为{n:1},即此时的变量a指向的值为:{n:1,x:{n:1}},同样也就是说存储地址address_1上存储的对象变为:{n:1,x:{n:1}},由于b在a.x=a={n:10086};代码执行之前,被定义为指向存储地址address_1,因此此时b指向的值为存储地址address_1上存储的对象:{n:1,x:{n:1}}
//2、接下来第二个"="等号,a.x被重新赋值为{n:10086},依据1、的分析,此时的变量a指向的值为:{n:1,x:{n:10086}},同样也是存储地址address_1上存储的对象变为:{n:1,x:{n:10086}},变量b指向该存储地址address_1,其值为:{n:1,x:{n:10086}}
//3、a.x赋值完毕之后,a={n:10086},也就是说变量a被重写指向另(一个属性为n,属性值为10086的对象{n:10086}),而(这个属性为n,属性值为10086的对象{n:10086}存储的地址为address_2),也就是此时a已经被重写指向address_2地址上存储的对象{n:10086},b则仍然指向address_1地址上存储的对象{n:1,x:{n:10086}},所以a.x为undefined,b.x为{n:10086}
alert(a.x);//undefined
alert(b.x);//{n:10086}