//情况1
let a={n:1} let b=a; a.x=a={n:2}; console.log('a',a); //{n:2} console.log('b',b); //{n:1,x:{n:2}} //情况2 let a={n:1} let b=a; a=a.x={n:2}; console.log('a',a); console.log('b',b);
这是一道阿里的笔试题,自己最开始碰到的时候也是一脸懵逼,然后看了各种人的解释,貌似是懂了,但是别人一问,我又傻逼了,总感觉没有屡清楚
最近呢看到B站上一个老师讲解这道题目的时候,通过画图分析堆栈呢,答案是给出来了,但是自己分析了一下,感觉不太对
//大佬的解释是,对于连等操作,是从左往右的,并且赋值操作呢,是分三步来的,1,定义变量,2,创建值,3,将二者关联起来,所以大佬的逻辑是,
1,a.x={n:2},此时b=a,所以b={n:1,x:{n:2}} a={n:2} 从结果看,是对的,但是如果把题目换成情况二呢
此时,如果从左往右算的话,a={n:2,x:a} b={n:1}
但是事实上,上面两种情况的结果是一样的
后面又看了别人得到解释,是这样的,这里涉及到运算符的优先级问题具体优先级可以参考MDN上的一张表(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)
点运算符权重是19,而赋值权重是3,也就是说点操作符优先级高
1,a.x 结果就是a=b={n:1,x:undefined}
2,连等,从又向左,这样,两种情况的结果就是一样的了。
a.x其实已经指向了堆里面的一个地方了,所以,当a.x={n:2}时,通过作图,是很容易得出结论的