深入理解JavaScript中的傳值與傳引用
1.傳值(by value)
變量的值被復(fù)制出一份,與原來(lái)的值將不相干,也就是說(shuō)即使新的值被修改,原來(lái)的值也不會(huì)改變,在JavaScript中基本類型都是傳值的.
function testPassValue()
{
var m=1;
var n=2;
//將m,n的值復(fù)制一份,傳遞到passValue
passValue(m,n);
alert(m); //將是原有的值
}
function passValue(a,b)
{
a = a+b; //改變a的值,這里a只是原有值的一份copy
alert(a);
}
輸出結(jié)果:
3
1
2.傳引用(by reference).
引用本身復(fù)制一份傳給function,引用指向的對(duì)象并沒(méi)有被復(fù)制傳遞(java中也是如此),在function中,如果改變了對(duì)象的屬性的值,由于和原來(lái)的引用指向的是同一個(gè)對(duì)象,因此在通過(guò)原來(lái)的引用訪問(wèn)到的將是修改過(guò)的值;
但是如果只是在function中將引用指向一個(gè)新的對(duì)象,將不會(huì)改變?cè)瓕?duì)象的值,改變的只是復(fù)制的這一份引用.
function testPassValue()
{
var date = new Date(2006,02,27);
alert(date.getDate()); //輸出為 27
//將date引用本身復(fù)制一份,傳遞到passReference,注意date所指向的對(duì)象并沒(méi)有被復(fù)制
passReference(date);
alert(date.getDate()); //輸出為12
//同上
changeReference(date);
alert(date.getDate()); //輸出還為12
}
function passReference(da)
{
//由于da和原引用指向的是同一個(gè)對(duì)象,在function外,通過(guò)原有的引用訪問(wèn)到的將是對(duì)象的日期屬性值,將是修改之后的值.
da.setDate(12);
}
function changeReference(da)
{
//此時(shí)da引用實(shí)際上是原引用的一份copy,將引用本身重新賦值,將不會(huì)影響原引用
da= new Date(2007,05,11);
//將da引用指向一個(gè)新的對(duì)象,此時(shí)原引用指向的還是原來(lái)的對(duì)象
alert(da.getDate()); // 輸出為11
}
3 特殊的String
在JavaScript中,String也傳引用的. js中只有charAt方法,而沒(méi)有對(duì)應(yīng)的修改方法,和java中的String相同,都具有不變性.
var s1 = "hello";
var s2 = "hell" + "o";
if (s1 == s2)
alert("s1 = s2"); //這句會(huì)不會(huì)執(zhí)行? java用的熟的人可能會(huì)認(rèn)為不會(huì)執(zhí)行(這句話我頗有微詞,java中也是會(huì)執(zhí)行的!),因?yàn)閖ava中的==比較的是同一性. 事實(shí)上在js中對(duì)String==比較的是值是否相等,所以這句話會(huì)執(zhí)行. 但是對(duì)其他的Object == 比較和java中一樣是同一性.
- 有關(guān)js的變量作用域和this指針的討論
- JavaScript防止全局變量污染的方法總結(jié)
- 基于JavaScript 聲明全局變量的三種方式詳解
- JS判斷字符串變量是否含有某個(gè)字串的實(shí)現(xiàn)方法
- js判斷變量是否未定義的代碼
- JS 判斷某變量是否為某數(shù)組中的一個(gè)值的3種方法(總結(jié))
- 改變javascript函數(shù)內(nèi)部this指針指向的三種方法
- javascript function、指針及內(nèi)置對(duì)象
- 淺談JavaScript中指針和地址
- JS是按值傳遞還是按引用傳遞
- JavaScript中變量、指針和引用功能與操作示例
相關(guān)文章
koa2服務(wù)端使用jwt進(jìn)行鑒權(quán)及路由權(quán)限分發(fā)的流程分析
這篇文章主要介紹了koa2服務(wù)端使用jwt進(jìn)行鑒權(quán)及路由權(quán)限分發(fā) ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07JS優(yōu)化與惰性載入函數(shù)實(shí)例分析
這篇文章主要介紹了JS優(yōu)化與惰性載入函數(shù),結(jié)合具體實(shí)例形式分析了JS惰性載入的原理、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-04-04JavaScript 實(shí)現(xiàn)完美兼容多瀏覽器的復(fù)制功能代碼
這兩天在做Web前端時(shí),遇到需求通過(guò)js實(shí)現(xiàn)文本復(fù)制的功能。經(jīng)過(guò)一番測(cè)試,終于實(shí)現(xiàn)了出來(lái),有需要的小伙伴可以參考下。2015-04-04JavaScript實(shí)現(xiàn)網(wǎng)頁(yè)版五子棋游戲
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)網(wǎng)頁(yè)版五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07js 右鍵菜單,支持不同對(duì)象不同菜單(兼容IE、Firefox)
版本雖然很老也不符合標(biāo)準(zhǔn)了,不過(guò)代碼是值得參考的,需要右鍵菜單的朋友可以參考下。2010-01-01