传递参数的2种情况的理解。
最近差不多一個(gè)月沒(méi)寫(xiě)博客了,主要的原因是目前在使用 Markdown 寫(xiě)學(xué)到的一些心得,一方面方便記筆記,另一方面頁(yè)面排版更加的美觀。
個(gè)人筆記站點(diǎn) : https://yewenxiang23.github.io
碰到的問(wèn)題:
今天碰到一個(gè)關(guān)于傳遞參數(shù)的問(wèn)題,想了一下午,終于想通了,打算總結(jié)記錄一下:
解決的思路:傳參是值復(fù)制的一個(gè)過(guò)程,傳遞的是值,
1 function setName(obj){ 2 obj.name = "yewenxiang"; 3 obj = new Object(); 4 obj.name = "ye"; 5 } 6 var person = new Object(); 7 setName(person); 8 console.log(person.name); //yewenxiang上面的代碼輸出了 "yewenxiang",而不是"ye"。感覺(jué)非常的怪異,下面來(lái)對(duì)于傳遞參數(shù)做一個(gè)總結(jié)。
?
傳遞參數(shù):
- 所有的函數(shù)參數(shù)都是按值傳遞的
也就是說(shuō),把函數(shù)的值復(fù)制給函數(shù)內(nèi)部的參數(shù),就和把值從一個(gè)變量復(fù)制到另一個(gè)變量一樣。
值有兩種類型:
- 基本類型:值保存在棧內(nèi)存中,復(fù)制的時(shí)候也是把值同時(shí)也復(fù)制了一份。
- 引用類型:值保存在堆內(nèi)存中,棧內(nèi)存中保存的只是指向堆內(nèi)存中值的一個(gè)指針,復(fù)制的時(shí)候紙箱基本類型傳參:
例子就拿 《javascript高級(jí)程序設(shè)計(jì)》上的例子來(lái)說(shuō)
基本類型的值傳參:
1 function addTen(num){ 2 num += 10; 3 return num; 4 } 5 var count = 20; 6 var result = addTen(count); 7 console.log(count); //20 8 console.log(result); //30函數(shù) addTen() 有一個(gè)num 參數(shù),而參數(shù)實(shí)際上是函數(shù)的局部變量。在調(diào)用這個(gè)函數(shù),并傳入?yún)?shù) count時(shí)。由于 count的值為20,傳遞參數(shù)的過(guò)程是一個(gè)值得復(fù)制過(guò)程,也就是把 count 的值20,復(fù)制給了參數(shù)(函數(shù)的局部變量) num = 20。在堆內(nèi)存中存在了 count=20 和num=20,兩個(gè)變量是互相不干擾的。
引用類型的值傳參:
1 function setName(obj){ 2 obj.name = "yewenxiang"; 3 } 4 var person = new Object(); 5 setName(person); 6 console.log(person.name); //"yewenxiang"這個(gè)例子中傳入了一個(gè) person 對(duì)象,也就是引用類型,引用類型的復(fù)制和基本類型的復(fù)制不同,復(fù)制的是棧內(nèi)存 變量person 中保存的地址,這個(gè)地址也指向堆內(nèi)存中同一個(gè)對(duì)象。所以修改了函數(shù)局部變量 obj的name屬性為"yewenxiang" ,person.name也變?yōu)榱?#34;yewenxiang"。
證明參數(shù)是按值傳遞的一個(gè)例子:
1 function setName(obj){ 2 obj.name = "yewenxiang"; 3 obj = new Object(); 4 obj.name = "ye"; 5 } 6 var person = new Object(); 7 setName(person); 8 console.log(person.name);這是我碰到的問(wèn)題,開(kāi)始我想的是輸出 "ye" ,為什么會(huì)輸出 "yewenxiang"呢。明明obj代表的是person這個(gè)對(duì)象,而函數(shù)內(nèi)部賦值之后又重新構(gòu)造了一個(gè)新對(duì)象并賦值為 "ye",所以應(yīng)該輸出 "ye"啊,為什么不是呢?那肯定是想錯(cuò)了嘛。廢話少說(shuō) 直接上圖:
上面3.4行代碼執(zhí)行之前:
3.4行代碼執(zhí)行之后:
由于obj為函數(shù)的局部變量,那么我們?nèi)绾巫C明呢?
1 function setName(obj){ 2 obj.name = "yewenxiang"; 3 console.log(obj.name); //yewenxiang 4 obj = new Object(); 5 obj.name = "ye"; 6 console.log(obj.name); //ye 7 } 8 var person = new Object(); 9 setName(person); 10 console.log(person.name); //yewenxiang 11 console.log(obj.name); //報(bào)錯(cuò)這樣就證明了我的想法是正確的。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/yewenxiang/p/6337961.html
總結(jié)
以上是生活随笔為你收集整理的传递参数的2种情况的理解。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Fragment生命周期与宿主Activ
- 下一篇: 2、Flutter 填坑记录篇