一直對(duì)Javscript中的值傳遞和引用傳遞的感到模糊接癌,今天來(lái)細(xì)細(xì)研究一下
概念
值傳遞:調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)復(fù)制一份傳遞到函數(shù)中蕊玷,在函數(shù)中如果對(duì)參數(shù)進(jìn)行修改邮利,將不會(huì)影響到實(shí)際參數(shù)
引用傳遞:調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)的地址傳遞到函數(shù)中,在函數(shù)中對(duì)參數(shù)所進(jìn)行的修改垃帅,將影響到實(shí)際參數(shù)
理解:值傳遞是針對(duì)基本類(lèi)型的延届,引用傳遞是針對(duì)引用類(lèi)型的。傳參可以理解為復(fù)制變量的值贸诚,把這個(gè)副本傳遞給形參
1.基本類(lèi)型復(fù)制后方庭,形參和實(shí)參完全是獨(dú)立的,不管改變哪一個(gè)酱固,都不會(huì)對(duì)另一個(gè)產(chǎn)生影響
2.引用傳遞本質(zhì)上還是傳值械念,首先在棧中開(kāi)辟形參引用,然后把實(shí)參引用的值傳遞給形參引用
值傳遞
ction add(num) {
num++;
console.log("形參:", num);// 形參:21
}
var a = 20;
add(a);
console.log("實(shí)參:", a);// 實(shí)參:20
引用傳遞
function setNum(obj) {
obj.num = 10;
console.log("形參:", obj);// 形參:num = 10
}
var a = new Object();
setNum(a);
console.log("實(shí)參:", a);// 實(shí)參:num = 10
解析
當(dāng) var a = new Object()运悲;下圖時(shí)變量和對(duì)象的關(guān)系龄减;
調(diào)用setNum(a)時(shí),下圖時(shí)全局變量a和局部變量obj以及對(duì)象Object的關(guān)系:
- 這段代碼創(chuàng)建了一個(gè)Object對(duì)象班眯,變量(引用)a指向這個(gè)Object對(duì)象希停。
- 調(diào)用setNum(a)烁巫,在這個(gè)函數(shù)內(nèi)部,obj和a都引用的是同一個(gè)Object對(duì)象宠能,即a和Obj都指向同一個(gè)內(nèi)存堆地址亚隙。因此,通過(guò)傳遞實(shí)參引用a,對(duì)形參引用obj添加num屬性后违崇,也影響到了實(shí)參引用a阿弃。
- 所以,很多人就會(huì)被這種假象所蒙蔽羞延,錯(cuò)誤的認(rèn)為:在局部作用域修改對(duì)象恤浪,會(huì)在全局對(duì)象中反映出來(lái),就說(shuō)明參數(shù)是引用傳遞
function setNum(obj) {
obj.num = 10;
obj = new Object();
obj.num = 20;
console.log("形參:", obj);// 20
}
var a = new Object();
setNum(a);
console.log("實(shí)參:", a); // 10
解析
在函數(shù)內(nèi)部創(chuàng)建obj對(duì)象 obj = new Object(); 下圖是a和obj以及Object的關(guān)系:
這段代碼在前一個(gè)的基礎(chǔ)上肴楷,給setNum()函數(shù)中添加了兩行代碼:obj = new Object()改變了obj的指向水由;obj.num = 20給新創(chuàng)建的obj添加屬性。根據(jù)結(jié)果來(lái)看赛蔫,形參的改變并沒(méi)有影響到實(shí)參砂客,所以,在JS中呵恢,引用傳遞的本質(zhì)就是值傳遞鞠值。