有这样一个案例:
var foo = {n: 1};
var bar = foo; 
foo.x = foo = {n: 2};
console.log(foo, foo.x);
请问:foo.x值为什么为undefined?
请问:foo.x值为什么为undefined?一、知识点:
1.赋值表达式: 左侧表达式 = 右侧表达式;
解释:先运算左侧表达式,再运算右侧表达式的结果,再把右侧的值赋值给左侧;
左侧表达式运算结果必须满足: 可以被赋值(变量,数组索引,对象属性);
右侧表达式运算结果为数据(值);
2.引用值变量存的是地址,地址里面存的才是值;
二、案例分析:
1.该表达式可理解为:左侧表达式 = 右侧赋值表达式,即 左侧表达式 = (左侧表达式 = 右侧表达式);
2.先运算左侧表达式;
3.再运算右侧表达式;
4.右侧表达式内部同样是(先运算左侧表左式,再运算右侧表达式 );
三、案例解析:
foo.x = foo = {n: 2} 相当于 foo.x = (foo = {n: 2})
1.先运算左侧表达式foo.x,拿到之前foo指向的地址,并获取这个地址属性x;
2.再运算右侧表达式 foo = {n: 2} ,即变量foo断开原来的地址换一个新的地址 foo = {n: 2};
3.再把右侧表达式的值{n: 2}赋值给左侧表达式foo.x即foo.x = {n: 2} , 即给原先地址增加的属性x 赋值{n: 2};
4.最后foo换了地址,新地址存的是{n: 2};
5.之前地址的值增加了一个x属性,之前地址存入变量bar,所以bar = {n: 1, x: {n: 2}}

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注