在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 一道關(guān)于 對(duì)象之間 值傳遞的問題

一道關(guān)于 對(duì)象之間 值傳遞的問題

    var a = {
      num: 2
    };

    var b = a; 

    a.num = a = {
      num: 4
    };
    console.log(a.num);// 4
    console.log(b.num);// { num: 4 }

這個(gè)b.num是4不是因?yàn)?'var b = a時(shí)' b指向a了嗎?那為什么下面那個(gè)沒有指向a

    var a = {
      num: 2
    };

    var b = a; //沒有把指向給b嗎

    a = {
      num: 4
    };
    console.log(b.num)  //為什么是2  a已經(jīng)是4了b的指向還是a為什么不是4?
回答
編輯回答
拽很帥

Javascript中有5種基礎(chǔ)數(shù)據(jù)類型,分別是Undefined、Null、Boolean、Number、String(ES6中新加的Symbol,暫時(shí)不考慮它),基礎(chǔ)數(shù)據(jù)類型都是按值訪問,即我們可以直接操作保存在變量中得實(shí)際值。而Javascript中的引用數(shù)據(jù)類型,比如Array,Object。。。它們的值是保存在堆內(nèi)存中得對(duì)象,Javascript 不允許直接訪問堆內(nèi)存中的數(shù)據(jù),即無法直接操作對(duì)象的堆內(nèi)存空間。在操作對(duì)象時(shí),實(shí)際上我們操作的是對(duì)象的引用,也就是我們經(jīng)常提及的內(nèi)存地址、內(nèi)存指針等。廢話不多說,咱們來看題目。

var a = {
  num: 2
};

var b = a;

我們通過 var b = a; 進(jìn)行引用類型的賦值操作,該操作會(huì)自動(dòng)分配一個(gè)值保存在變量b,不過這個(gè)值就是咱們經(jīng)常提及的引用類型的一個(gè)內(nèi)存地址或內(nèi)存指針。當(dāng)內(nèi)存地址相同時(shí),盡管變量之間相互獨(dú)立,但訪問的具體對(duì)象實(shí)際上是同一個(gè),即變量 a 和 b 在內(nèi)存空間對(duì)應(yīng)的對(duì)象是同一個(gè),在該位置您不管是修改a.num,還是修改b.num,它們兩個(gè)都會(huì)受影響!

接下我們?cè)俜治鲆幌伦钊菀酌曰蟠蠹业囊恍写a:

a.num = a = {
  num: 4
};

因?yàn)镴avascript的成員訪問優(yōu)先級(jí)(19)比賦值優(yōu)先級(jí)(3)高(運(yùn)算符優(yōu)先級(jí)可參考:運(yùn)算符優(yōu)先級(jí)),因此先執(zhí)行成員訪問a.num,上面我們說了不管您是修改a.num,還是修改b.num,它們兩個(gè)都會(huì)受影響!所以這里變量b也會(huì)受到影響,因此實(shí)則發(fā)生了如下賦值代碼:

b.num = a = {
    num: 4
}

所以變量b對(duì)應(yīng)的堆內(nèi)存的對(duì)象如下:

b = {
 num: {
   num: 4
 }
}

接下來我們?cè)倏纯醋兞縜,變量a起先對(duì)應(yīng)的堆內(nèi)存的對(duì)象為:

a = {
  num: 2
};

當(dāng)執(zhí)行 b.num = a = { num: 4 }再次進(jìn)行引用類型的賦值操作,在這里會(huì)重新為a分配一個(gè)內(nèi)存指針!所以a最終變成了:

a = {
  num: 4
};
2018年4月2日 17:08
編輯回答
夏木

第一個(gè)問題
這里就兩個(gè)指向 {num: 2} {num:4}
a -> {num: 2}
b -> {num: 2}
前幾行操作讓ab同時(shí)指向{num: 2}
重點(diǎn)這一行:a.num = a = {num: 4};
因?yàn)閖s點(diǎn)號(hào)運(yùn)算符級(jí)別高所以先執(zhí)行點(diǎn)號(hào)使得a.num保留了指向,所以{num:2}.num = a = {num:4}
a -> {num:4}
b -> {num:{num:4}}

第二個(gè)問題
var a = { num: 2 };
var b = a;
截止這里 a -> b -> { num:2 } ab同時(shí)指向{ num:2 } ab共同操作同一個(gè)引用
a = { num: 4 }; a -> { num: 4 }a的指向變了 ab不再操作同一個(gè)引用 所以ab毫無關(guān)系

2017年7月16日 13:59