3 回答
TA贡献1802条经验 获得超5个赞
var a = { n : 1};
var b = a;
//语句从左到右执行,赋值从右到左。
//执行a.x时,a还是指向的是{n:1}的空间。
//赋值a时,a指针指向了{n:2},a.x中a原来指向的空间{n:1}添加x属性,指向现在a指向的空间{n:2};
a.x = a = {n: 2};
console.log(a.x); //undefined
console.log(b.x); //{n:2}
TA贡献1853条经验 获得超6个赞
应该是从右到左的。a.x=a={n:2},
先是执行a.x此刻a指向{n:1},
然后执行 a={n:2}将a重新指向,
最后执行a.x=a,即{n:1}.x = {n:2}.
TA贡献1993条经验 获得超6个赞
其实这类问题很容易理解,只需要记得变量只是对象的引用,变量并不是对象本身。
取值的时候顺着变量找到对象;
赋值的时候则改变变量的指向。
所以
对于
var a = {n: 1},想象一个对象{n: 1}放地上,用a指着它;var b = a就是b顺着a找到{n: 1},两者同时指着它;a.x = a = {n:2}左往右看,a.x是对a取值,顺着a找到{n: 1},再找到其x属性等待赋值,第二个
a本应是取值,但右边有=所以继续变成了赋值操作,a指向{n:2},a = {n:2}返回{n:2},给了等待赋值的{n: 1}.x;alert(a.x),顺着a找到{n:2},因为在 3.2 中a改变了指向,而{n: 2}没有x属性;alert(b.x),顺着b找到{n: 1},{n: 1}在 3.1 得到了x,顺着x找到了{n: 2}。
添加回答
举报
