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

鍍金池/ 問(wèn)答/HTML/ 不知是否能實(shí)現(xiàn)的對(duì)象問(wèn)題

不知是否能實(shí)現(xiàn)的對(duì)象問(wèn)題

var a=new Object()
      a.name = "Nicholas";    
      console.log(a.name)
      
      var a = new Object();     a.name = "Greg";
      console.log(a.name)
      

在js中對(duì)象創(chuàng)建是被分配再內(nèi)存的不同區(qū)域,那樣的話創(chuàng)建兩個(gè)同名的對(duì)象,給予不同的值我去調(diào)用.name的時(shí)候應(yīng)該會(huì)取到哪個(gè)值?

問(wèn)題1:實(shí)驗(yàn)結(jié)果顯示是最后創(chuàng)建的Greg這里面的邏輯是怎么樣的呢?
問(wèn)題2:能否讀取到第一次創(chuàng)建的a.name = "Nicholas";呢?

回答
編輯回答
九年囚

這段代碼在執(zhí)行的時(shí)候與下面代碼等價(jià)

var a
a = new Object()
a.name = "Nicholas";
console.log(a.name)

a = new Object();
a.name = "Greg";
console.log(a.name)

要點(diǎn)在于var不會(huì)重復(fù)聲明,引擎在解析到var的時(shí)候會(huì)尋找當(dāng)前作用域是否有同名變量,如果有就不會(huì)重復(fù)創(chuàng)建變量。因此你代碼中的操作都是在對(duì)aa.name賦值而已;由于后面的賦值會(huì)覆蓋前面的,因此最后打印的結(jié)果是Greg

對(duì)于第二個(gè)問(wèn)題,對(duì)象是引用類型,賦值時(shí)傳遞的是內(nèi)存地址,因此在垃圾回收算法執(zhí)行之前,第一個(gè) new Object是會(huì)存在于內(nèi)存中的,但是沒(méi)有對(duì)這個(gè)Object的引用,你無(wú)法訪問(wèn)這個(gè)變量。因此要想實(shí)現(xiàn)問(wèn)題2的目的,需要把第一個(gè)Object同時(shí)賦給另外一個(gè)變量b,后面不管a怎么變,b永遠(yuǎn)指向第一個(gè)Object

2017年7月12日 10:57
編輯回答
陌璃

這段代碼執(zhí)行的操作可以看這張圖:
圖片描述

第一次給a變量引用一個(gè)內(nèi)存地址,里面的數(shù)據(jù)為name="Nicholas",
第二次又將變量a引用了一個(gè)新的內(nèi)存地址,此時(shí)里面的數(shù)據(jù)為name="Greg";

這時(shí)候a就切斷了與Nicholas的聯(lián)系,它引用的是內(nèi)存中成員為name="Greg"的Object。

第一個(gè)對(duì)象因?yàn)槿鄙僖脽o(wú)法訪問(wèn)到,會(huì)被垃圾回收器回收。

2018年8月18日 16:24