【js】引用和操作符优先级
<h4>以下输出什么</h4>
<h3>题目一:</h3>
<pre><code>var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x)
console.log(b.x)</code></pre>
<p>执行:
1.先执行 a.x
2.a = {n:2} ;//从右向左赋值
3.a.x ={n:2}; //赋值操作</p>
<h4>解答思路:</h4>
<p>1、优先级。.的优先级高于=,所以先执行a.x,堆内存中的{n: 1}就会变成{n: 1, x: undefined},改变之后相应的b.x也变化了,因为指向的是同一个对象。
2、赋值操作是从右到左,所以先执行a = {n: 2},a的引用就被改变了,然后这个返回值又赋值给了a.x,需要注意的是这时候a.x是第一步中的{n: 1, x: undefined}那个对象,其实就是b.x,相当于b.x = {n: 2}</p>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/afa9d8630d07d21692460eba94aa637e?showdoc=.jpg" alt="" />
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/e690db3f0493773341e3025d0412c819?showdoc=.jpg" alt="" /></p>
<h3>题目二:</h3>
<pre><code>var a = { x: 1 };
var b = a;
a = a.x = { x: 1 };
console.log(a); //{x:1}
console.log(b);//{x:{x:1}}</code></pre>
<h5>解题的两个关键点:</h5>
<p>1.操作符的运算优先级问题;.的优先级高于赋值语句;</p>
<pre><code>var a = { x: 1 };
var b = a;</code></pre>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/2efebb11e08a5dbc69b3011373a2d806?showdoc=.jpg" alt="" /></p>
<pre><code>a.x = { x: 1 };
a = a.x;</code></pre>
<pre><code>当执行a.x = {x:1}</code></pre>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/70bf5d15a47e9b7d03a3a0297d62621c?showdoc=.jpg" alt="" /></p>
<pre><code>a = a.x;</code></pre>
<p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/50db94ee87dba9a16be3d25462bb3b29?showdoc=.jpg" alt="" /></p>