前端進階|第十二天 連續(xù)賦值到底賦給了誰?

var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x);//undefined
console.log(b);

輸出結(jié)果為
console.log(a.x);//undefined
console.log(b);//Object {n: 1 x: {n: 2}}

看的我有點懵,不是剛給a.x賦值了么,怎么轉(zhuǎn)眼就undefined了呢?

看到網(wǎng)友結(jié)構過程是這樣的。
1.給a賦值,a作為一個對象指向{n:1}.

var a = {n: 1};

2.b和a共同指向{n:1}

var b = a;

3.關鍵在第三行的拆解

a.x = a = {n: 2};

等價于

a.x = (a = {n: 2});

傳統(tǒng)編程語言認為a.x的結(jié)果就是括號運算的結(jié)果,但js卻偏不。
首先計算a.x,因為之前我們并沒有給a聲明成員x,所以a.x運算的結(jié)果就是,給a和b執(zhí)行的{n:1}聲明一個成員,即{n:1,x:undefined},因為還沒賦值,所以值是 undefined.
接著計算a={n:2},這個操作,會使得a開始指向{n:2},而不再是{n:1,x:undefined}。也就是說a移情別戀了,現(xiàn)在指向{n:1,x:undefined}只剩下了b。
那么最終對{n:1,x:undefined}里面的x賦值,只對b有效。所以最終打印a.x針對的是{n:2}這個對象,當然是undefined。而b里面的x賦值順利完成為{n:2},即b最終值為{n:1,x:{n:2}}.
js果然自成一派。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,081評論 0 2
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,264評論 0 38
  • 第一章 前端三大語言:HTML(專門編寫網(wǎng)頁內(nèi)容)、CSS(編寫網(wǎng)頁樣式)、JS(專門編寫網(wǎng)頁交互行為) 能簡寫盡...
    fastwe閱讀 1,208評論 0 0
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,155評論 0 2
  • 01javascript語法規(guī)范 <!DOCTYPE html> javascript語法...
    ouyangqinbin閱讀 1,399評論 0 0

友情鏈接更多精彩內(nèi)容