指針、帽子和女朋友


首先,事情開始於一道面試題

<script>
function A(){
	this.name="";
	this.age=18;
}

var a1=new A();
a1.name="尼古拉斯·屌";
var a2=a1;
a2.name="blue";
console.log(a1.name);  //變成blue了

var str1="尼古拉斯·屌";
var str2=str1;
str2="blue";
console.log(str1);     //沒變,還是尼古拉斯·屌
</script>

簡單來說

a2=a1;
a2.name=xxx;  //a1.name會變

str2=str1;
str2=xxx;     //str1不會變

歡迎覺得廢話太多的同學直接翻到最后看“技術流解釋”哈,那么我們開始

套用一句比較俗的話:“道理我都懂,可是為什么字符串就不會變呢”,JavaScript作為高級語言並沒有指針的概念,但卻又總被這事兒困擾,今天我就想試試讓大家理解這個概念,如果要弄明白這個事情,請先來弄明白一個特別簡單的事情:

假設你有女朋友叫夢琪,喜歡帶黃色帽子,你幫她買了頂紅色帽子,請問:夢琪帶什么顏色的帽?
答:紅色

假設你有女朋友叫夢琪,喜歡帶黃色帽子,你直接換了個喜歡帶紅色帽子的女朋友,請問:夢琪帶什么顏色的帽子?
答:還是黃色,沒變

如果我們理解了上面這個花心蘿卜和戴帽子的女朋友的問題,那么問題就變得非常簡單,用代碼再表示一遍:

//情況1:換帽子
你.女朋友=夢琪;
你.女朋友.帽子=紅色;

console.log(夢琪.帽子);	//紅色

//情況2:換女朋友
你.女朋友=夢琪;
你.女朋友=安易;

console.log(夢琪.帽子);	//黃色,沒變

簡單來說,你換女朋友了,關人家帽子啥事,對吧


為了徹底弄明白問題的步驟1/2:

讓我們把這個本就混亂的關系搞得更亂一些吧[捂臉]

假設張三和李四,都找了同一個女朋友,張三給她買了一頂帽子,請問:李四的女朋友換帽子了沒?
答:換了

假設張三和李四,都找了同一個女朋友,張三扛不住了,又新找了個女朋友,請問:這跟李四女朋友的帽子有關系嗎?
答:有毛關系啊

上面這個混亂的關系,用程序表述出來就是:

//情況1.換帽子
張三女朋友=李四女朋友;		//傳說中的引用:第一次見到能把出軌說的這么清新脫俗的
張三女朋友.帽子=綠色的帽子;

console.log(李四女朋友.帽子);	//變了,綠的

//情況2.跟帽子有毛關系
張三女朋友=李四女朋友;
張三女朋友=新的女朋友;

console.log(李四女朋友.帽子);	//不知道什么顏色,反正沒變

為了徹底弄明白問題的步驟2/2:

直接上代碼了,解釋見注釋哈

//情況1:帽子
var 張三女朋友=new 女朋友();   //太方便了有沒有
var 李四女朋友=張三女朋友;      //又引用了

張三女朋友.帽子=紅的;
console.log(李四女朋友.帽子);  //紅的,變了


//情況2:跟帽子有毛關系
var 張三女朋友=new 女朋友();
var 李四女朋友=張三女朋友;

張三女朋友=另一個;
console.log(李四女朋友.帽子);  //沒變,跟帽子有毛關系

所以,現在請跟隨我再來重新看一遍上面的問題

//情況1
var a1=new A();
var a2=a1;
//注意:在這個時候,a1和a2就是同一個東西,引用嘛,你懂的

a2.name="blue";	//你給女朋友,買了頂新的帽子
console.log(a1.name);	//她的帽子是Blue色的


//情況2
var str1="aaa";
var str2=str1;
//注意:這個時候,str1和str2也是同一個東西,也是引用

str2="blue";		//你直接換了個女朋友
console.log(str1);	//你原先女朋友沒啥變化

人上了年紀就會很啰嗦,直接上圖多好:

情況1:a2.name="blue"


情況2:str2="blue"

純技術流分隔線

1.指針:代表一個變量或屬性指向誰
2.賦值:代表改變變量或屬性的指向
合起來用:

a1=a2;
a2.name='blue';
//改變a2.name指向了'blue';但a1和a2依然指向同一個對象,所以:a1.name=>'blue'

str1=str2;
str2='blue';
//改變str2指向了'blue';這時str1和str2不再指向同一對象,所以:str1不變

end of 純技術流分隔線

結論:
1.都說人上了年紀廢話就是多,看來是真的
2.另外,我一直好奇有多少人會看到文章的最后,所以想做個簡單的實驗,我回頭和閱讀量對照一下 😃


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM