var a = { n : 1};
var b = a;
a.x = a = {n: 2};
alert(a.x);
alert(b.x);
输出:undefined
[object Object]
请问:a.x = a = {n: 2};
该句是如何赋值的?
var a = { n : 1};
var b = a;
a.x = a = {n: 2};
alert(a.x);
alert(b.x);
输出:undefined
[object Object]
请问:a.x = a = {n: 2};
该句是如何赋值的?
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}
应该是从右到左的。a.x=a={n:2}
,
先是执行a.x
此刻a指向{n:1}
,
然后执行 a={n:2}
将a重新指向,
最后执行a.x=a
,即{n:1}.x = {n:2}.
13 回答13.1k 阅读
7 回答2.3k 阅读
3 回答1.4k 阅读✓ 已解决
6 回答1.5k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
3 回答1.5k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
其实这类问题很容易理解,只需要记得变量只是对象的引用,变量并不是对象本身。
所以
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}
。