前端紅寶書(shū)第一遍看過(guò)去之后狞甚,相當(dāng)多的東西都忘記了宾抓,第二遍看的時(shí)候,也開(kāi)始注意到一些細(xì)節(jié)的東西以及理解不到位的地方。
書(shū)P66 一個(gè)加粗框中寫(xiě)到:ECMAScript中所有參數(shù)傳遞都是值,不可能通過(guò)引用傳遞參數(shù)
當(dāng)時(shí)看過(guò)沒(méi)有怎么仔細(xì)想過(guò)日缨,一知半解吧,今天理解的更加深一些。當(dāng)然也是昨天做了個(gè)題目就因?yàn)檫@個(gè)掉坑里一時(shí)沒(méi)爬出來(lái)眷昆!
訪問(wèn)變量有按值和按引用兩種方式,而參數(shù)只能按值傳遞汁咏。
一亚斋、基本數(shù)據(jù)類(lèi)型: Number, String等都是按值傳遞這個(gè)好理解,當(dāng)時(shí)我也就理解這個(gè)吧攘滩。
var a = 10
function add(num){
num+=10
}
add(a)
console.log(a)
如上面的代碼帅刊,執(zhí)行add(a)的時(shí)候,會(huì)復(fù)制一份值給函數(shù)的arguments這偽數(shù)組漂问,當(dāng)然同時(shí)也是num這個(gè)命名參數(shù)赖瞒。arguments[0] = num女揭,函數(shù)內(nèi)部對(duì)num進(jìn)行了加操作,num = 20了栏饮。但是外部最后輸出a時(shí)吧兔,仍然是10,說(shuō)明a與函數(shù)內(nèi)部的num互不干擾袍嬉。其實(shí)此時(shí)可以把命名參數(shù)看成是局部參數(shù)境蔼,函數(shù)運(yùn)行結(jié)束,它也隨之銷(xiāo)毀冬竟。而它是按值傳遞的欧穴,復(fù)制了內(nèi)存中的一份值給num。所以內(nèi)部對(duì)num的操作不影響全局變量a的值
二泵殴、基本類(lèi)型的值好理解涮帘,但是JS中對(duì)象類(lèi)型的就不怎么好理解了,反正令我覺(jué)得有點(diǎn)繞笑诅;
先看例子:
var student = new Object()
function addNum (obj) {
obj.num = '23'
}
addNum(student)
console.log(student.num)
如上调缨,首先定義了一個(gè)student對(duì)象,然后通過(guò)函數(shù)給該對(duì)象添加了num學(xué)號(hào)的屬性值:23吆你。之后打印輸出的時(shí)候弦叶,很奇怪,居然給student對(duì)象添加上了屬性妇多,并且影響到了外部對(duì)象伤哺,這傳值明顯就是引用傳遞啊,函數(shù)內(nèi)部obj和student都指向堆中同一個(gè)對(duì)象者祖。就是引用傳遞嘛立莉。但是又和紅寶書(shū)上寫(xiě)的矛盾:不可能通過(guò)引用傳遞參數(shù)?七问?這就莫名奇妙了蜓耻。
查閱了很多大神寫(xiě)的說(shuō)明,但是感覺(jué)都不能夠說(shuō)明械巡,真是非常難理解刹淌。我覺(jué)得是不是這樣理解:以上述函數(shù)為例,我把student對(duì)象實(shí)例作為參數(shù)傳遞給obj時(shí)讥耗,是將student所指對(duì)象的地址復(fù)制了一份給obj有勾,這樣obj空間所存的地址和student就都指向了共同的存儲(chǔ)空間。而如果是引用傳遞的話古程,obj是沒(méi)有空間的柠衅,它將會(huì)和student公用一個(gè)空間,這個(gè)空間就保存著一個(gè)指向student實(shí)例對(duì)象的地址籍琳。
作者:御命-丹心
來(lái)源:CSDN
原文:https://blog.csdn.net/weixin_39728230/article/details/80607294