https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
var a = {n: 1}
var b = a;
a.x = a = {n: 2};
console.log(a.x);
console.log(b.x)
1.給a添加屬性x揖铜,此時a,b都是 { n:1,x:undefined },a.x 運算后的結果即為這個object(可以說也就是b)的x屬性值搬瑰。
2.把{n:2}賦值給a埋市,此時a是 {n:2},是一個新的對象态辛。 b是{ n:1,x:undefined }。
由于( . 運算符最先計算)一開始js已經(jīng)先計算了a.x酗电,便已經(jīng)解析了這個a.x是對象A的x魁兼,所以在同一條公式的情況下再回來給a.x賦值,也不會說重新解析這個a.x為對象B的x捌议。
所以 a.x=a 應理解為對象A的屬性x指向了對象B:
(這個時候a.x 已經(jīng)運算完了,不會再與a產(chǎn)生任何關系引有,a.x依舊代表那個n為1對象的x屬性值瓣颅,和a已經(jīng)沒關系了)
3.把{n:2}賦值給a.x 也就是 { n:1,x:undefined }這個對象的x屬性,這個時候b依舊指向這個object譬正,因此此時宫补,a是{n:2},b是{n:1,x:{n:2}}
試試下面這道題吧 涉及到了原型鏈 私有方法 全局變量等等
function Foo() {
getName = function () { console.log (1); };
return this;
}
Foo.getName = function () { console.log (2);};
Foo.prototype.getName = function () { console.log (3);};
var getName = function () { console.log (4);};
function getName() { console.log (5);}
//請寫出以下輸出結果:
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();