今天逛群發(fā)現(xiàn)有同學問了這么一個問題
其實這道題目的難點并不在引用類型相關(guān)知識點鞭铆,而是在運算符優(yōu)先級
先給出解答
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x); // undefined
console.log(b.x); // {n:2}
主要難點在于對第三行 a.x = a = {n: 2} 的理解
- 明確 . 運算符優(yōu)先級遠遠高于 = 運算符,MDN相關(guān)文檔
- 明確 a = b = c = d = 7 的運算過程
- d 被賦值為 7 硼瓣,d = 7 的返回值為7
- c 被賦值為 d = 7 的返回值7
- b 被賦值為 c = 7 的返回值7
- a 被賦值為 b = 7 的返回值7
- 整個表達式的返回值為7
- 所以對于 a.x = a = {n: 2}
- 第一步執(zhí)行 a.x —— 為a對象創(chuàng)建x屬性春塌,此時x屬性的值是undefined,但是請注意此時的a對象和b對象的指針地址是相同的
a.x === b.x // true
所以 b.x 的值是 {n: 2}
此時a.x返回值為undefined - 第二步執(zhí)行 a = {n: 2} —— 注意在這一步 a對象指向了新地址,且返回值為{n: 2}
- 第三步執(zhí)行 undefined = {n: 2}
- 第一步執(zhí)行 a.x —— 為a對象創(chuàng)建x屬性春塌,此時x屬性的值是undefined,但是請注意此時的a對象和b對象的指針地址是相同的
- 所以最后的 a.x 是在被指向了新地址后的a的屬性宫补,因未被賦值過,自然是undefined
綜上所述曾我,a.x = a = {n: 2} 的運算過程可拆分為
a.x = a = {n: 2};
undefined = a = {n: 2} // a.x 返回了 undefined粉怕,此時a.x的值也是undefined
undefined = {n: 2} // a = {n: 2} 返回了 {n: 2},此時a對象指向了新指針
{n: 2} // undefined = {n: 2} 返回了 {n: 2}
所以抒巢,將 a.x = a = {n: 2} 換成 a = a.x = {n: 2} 效果相同
a = a.x = {n: 2}
a = undefined = {n: 2} // a.x 返回了 undefined 贫贝,此時a.x的值也是undefined
a = {n: 2} // undefined = {n: 2} 返回了 {n: 2},此時a對象指向了新指針
{n: 2} //a = {n: 2} 返回了 {n: 2}蛉谜,此時a對象指向了新指針