大家对这道面试题,怎么理解的?
发布于 9 年前 作者 mlyknown 6114 次预览 最后一次回复是 9 年前 来自 问答
var a = {n: 1}
var b = a;
a.x = a = {n: 2}
console.log(a.x);
console.log(b.x)
关键点是 a.x = a = {n: 2}; 从右到做赋值。
在我的理解下最后 a:{x:{n:2},n:2} b:{x:{n:2},n:2}
但是结果却不是这么回事~~~
管理员温馨提示:发帖前请先简单学一下Markdown语法
14 回复
a.x = a; a = {n: 2}; 没这样用过.
这个其实是js的赋值表达式的运算! =是从右往左边赋值,a=b=c=1,那么abc都会等于1。 这里计算逻辑大概是这样: a=1; b=1; c=1; 面试代码运行逻辑也是类似, a.x = {n: 2}; a = {n: 2}; 看明白了吗?
顺便说下,4楼说的比较对, 我这个只是让你更快的理解,但是本质上这是错的,正确的请参照4楼说明!
.的优先级比=高
3楼说的是关键
@William17 还是不太明白a.x为什么是undefined,还有我稍微改了一下
var a = {n: 1} var b = a; a = {n: 2}; a.x = {n:2};console.log(b.x);这样的话b.x是undefined@zeroone001
本来写了很多 结果标签页刷新了。。就放个最后的解析图吧
![IK{Y@0S{~GR{NPT7(X`~PJ.png]
验证一下 a === b.x //true
同样的问题 https://segmentfault.com/q/1010000002637728
mark下
http://justjavac.com/javascript/2012/04/05/javascript-continuous-assignment-operator.html
3L真给力
我也理解了,谢了
如果说
.的优先级高于=,那么a.x=a={n:2}是不是可以理解为:这样得到的结果就是正确的。
那么如果再复杂点:
如果按照上面的理解方法,
b.x=d=a.x=a={n:3}是不是也是等价于:按照这样理解,得到的结果:
a:{n:3}b:{n:2,x:{n:3}}c:{n:1,x:{n:3}}d:{n:3}不知道理解是否正确,得到的结果是对的,看图:
var a = {n:1} var b = a;内存结构是这样的。a变量指向{n:1}对象,b变量指向{n:1}对象。
a.x = a = {n:2}可以分解成三步,先创建{n:2}对象,然后a.x = {n:2}对象,再a = {n:2}对象。原来{n:1}对象变成{n:1,x:指向{n:2}},a变量指向{n:2}对象。所以a.x undefined ,b.x = {n:2} ,b.x === a true

重点还是在于 .运算优先于=赋值运算, 理解了,thanks~~