var a={n:1}
var b=a;
a.x=a={n:2}
console.log(a)//{n:2}
console.log(a.x)//undefined
console.log(b)//{ n: 1, x: { n: 2 } }
我的理解:
a先引用了{a:1}对象,
b又引用了a,
a又改变了引用,指向{a:1},
a.x的赋值过程不理解
var a={n:1}
var b=a;
a.x=a={n:2}
console.log(a)//{n:2}
console.log(a.x)//undefined
console.log(b)//{ n: 1, x: { n: 2 } }
我的理解:
a先引用了{a:1}对象,
b又引用了a,
a又改变了引用,指向{a:1},
a.x的赋值过程不理解
给题主提供另一个思路:
js中‘.’运算符的优先级是要高于‘=’的,所以才会有a = a.x = {n:2}和a.x = a ={n:2}的结果是一致的。
知道了这个大前提就好办了
a.x=a={n:2}
拆开来看:
第一步:对象a增加属性x(注意这里还未赋值,只是单纯声明,由于引用关系b也拥有一个未赋值的x属性)
第二步:对象a改变赋值{n:2}(注意这里a的指向和第一步中是不一样的)
第三步:给第一步中的x赋值{n:2},即b.x = {n:2}
最终:a:{n:2} b:{x:{n:2},n:1}
a.x=a={n:2}
这是赋值语句,从右开始,相当于让 a
重新指向一个对象,因为这是一个
语句,所以前面的a
仍然没有被动态改变,仍然指向的是 前一个对象
,但是后面出现的 a
却是已经改变指向的,
console.log(a)
这个a
就是指向新的对象。
2.console.log(a.x)
这个 x
属性相当于是前一个对象的属性,但是 a
是已经改变了的,所以没有这个属性。
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
https://segmentfault.com/q/10...
by @Lemures
我什么也没说我只是答案的搬运工…