JavaScript基礎之值傳遞和引用傳遞

js的值傳遞和引用(地址)傳遞面試

首先總述一下:
js的5種基本數據類型 number,string,null,undefined,boolean 在賦值傳遞時是值傳遞,
js的引用數據類型(object,array,function)進行引用傳遞,其實底層都是對象。編輯器

廢話很少說,下面直接上代碼學習

值傳遞例子:spa

1 var a = 10;
2 var b = a;
3 b = 5;
4 console.log('a:'+a,'b:'+b) // a:10 b:5

一樣的,若是你改變其中a的值,a的值變化,b不會改變。code

基本數據類型的賦值傳遞,變量直接包含的是一個值,你能夠理解這個賦值過程爲把你電腦裏的一個文件(假設原本在c盤)複製到了D盤,而後你就很清楚知道,它兩是徹底不相干的兩個文件(複製可是沒修改前只是內容同樣)了,沒有關聯性的獨立文件,不會相互干擾。(不一樣地址路徑下相同的值)對象

引用傳遞例子以下:blog

1 var obj = {a:1,b:2,c:3};
2 var objed = obj;
3 objed.a = 0;
4 console.log('obj:',obj,'objed:',objed) // obj: {a: 0, b: 2, c: 3} objed: {a: 0, b: 2, c: 3}

obj對象賦值給變量objed,須要理解的是,對象是以地址的形式存放在內存中的。仍是用簡單易懂的話說吧,變量obj存放的不是a,b,c這三個值,而是它這個總體對象佔用的一個空間(有些人用相似堆和棧的思路來對比理解),你每看到一個對象(非基本數據類型皆是對象),你看到的應該是一個空間,便於理解,能夠本身取個名字「#001」(隨便叫什麼都行)。那麼變量obj就是一個叫「#001」的地址空間,這個空間裏面有a,b,c三個東西,且有它的值。objed變量被賦「值」是這個空間「#001」。因此obj和objed實質上都是叫「#001」的空間,不論你是修改obj裏內容仍是objed裏的內容,實質上都是「#001」空間裏的那個它。因此修改變量obj的內容和objed的內容都是同一個東西,obj和objed都是同樣的內容包含。一樣用使用電腦來理解,就是你將你的文件放到編輯器上修改創做,你會發現,你修理和鞭打的是你編輯器裏的代碼,可是你磁盤裏的文件一樣在捱打😃。編輯器裏的和你磁盤裏躺的傷口如出一轍。由於你的代碼文件被放到了編輯器的工做空間了。它也是一個空間。實際操做的就是同一個東西。只不過須要保存去實現賦值這一步!內存

好了,言語過於累贅,重要的是本身理解到。下面是看到過的面試題,能夠看看你是否真的理解了呢?string

 1 function changeAgeAndReference(person) {
 2     person.age = 20;
 3     person = {
 4         name: 'Paul',
 5         age: 30
 6     };
 7     return person;
 8 }
 9 var personObj1 = {
10     name: 'changeAlive',
11     age: 25
12 };
13 var personObj2 = changeAgeAndReference(personObj1);
14 console.log(personObj1); // -> ?
15 console.log(personObj2); // -> ?

以上存粹是我的理解。歡迎討論,留言,一塊兒學習!io

相關文章
相關標籤/搜索