Js從頭學(xué)起(基本數(shù)據(jù)類型和引用類型的參數(shù)傳遞詳細(xì)分析)
更新時間:2012年02月16日 20:14:04 作者:
Js中所有函數(shù)的參數(shù)傳遞都是按值傳遞的,也就是把函數(shù)外面的值復(fù)制給函數(shù)內(nèi)部的參數(shù),就和把值從一個變量復(fù)制到另一個變量一樣。下面舉幾個特別的例子
1、基本數(shù)據(jù)類型傳遞參數(shù):
funciton addTen(num){
num+=10;
return num;
}
var count=20;
var result=addTen(count);
alert(count);//20
alert(resullt);//30
執(zhí)行結(jié)果是:20和30。在這段代碼中,將變量count當(dāng)做參數(shù)傳遞給了函數(shù)addTen,也就是相當(dāng)于將變量count的值復(fù)制給了函數(shù)addTen的參數(shù)。這時addTen的參數(shù)num可以看做是函數(shù)內(nèi)部的一個變量。在上段代碼中,就相當(dāng)于兩個基本數(shù)據(jù)類型變量之間的值復(fù)制。而基本數(shù)據(jù)類型都有自己獨(dú)立的內(nèi)存地址,所以num和count是沒有任何關(guān)系的,他們只是值相等而已,函數(shù)執(zhí)行完畢后,count的值并沒有改變。而函數(shù)外面的result是被直接賦值的,所以result的值就是函數(shù)的結(jié)果30。
2、引用類型傳遞參數(shù):
function setName(obj){
obj.name="LSN";
}
var person=new Object();
setName(person);
alert(person.name);//LSN
執(zhí)行結(jié)果是:LSN。在這段代碼中,函數(shù)setName的作用是給obj對象添加了一個屬性name并給該屬性賦值為"LSN",因?yàn)閛bj是引用類型,所以這里屬于是將引用類型person賦值給了obj,也就是說person和obj引用了一個內(nèi)存地址,所以當(dāng)給obj新加了屬性name時,在函數(shù)外面的person也跟著改變,最后person.naem的結(jié)果為LSN。
3、引用類型傳遞參數(shù)到底傳的是值還是引用?
function setName(obj){
obj.name="ABC";
obj=new Object();
obj.name="BCD";
}
var person=new Object();
setName(person);
alert(person.name);// ABC
執(zhí)行結(jié)果是:ABC。實(shí)例3與實(shí)例2的區(qū)別是在函數(shù)中又加了2行代碼,在給obj對象新加一個屬性name并賦值后 又將obj定義成了一個新的對象(new Object()),定義新對象后又name賦上新的值“BCD”。這個時候如果是按引用傳遞的話,那么最后person對象就會自動修改為指向其name屬性為"BCD"的新對象,但最后顯示的卻是“ABC”,這說明即使在函數(shù)內(nèi)部修改了參數(shù)的值,但原始的引用還保持不變。實(shí)際上,當(dāng)在函數(shù)內(nèi)部obj=new Object()時 這個新的obj就已經(jīng)成為函數(shù)內(nèi)部的局部對象了,這個對象會在函數(shù)執(zhí)行完畢后自動銷毀。
復(fù)制代碼 代碼如下:
funciton addTen(num){
num+=10;
return num;
}
var count=20;
var result=addTen(count);
alert(count);//20
alert(resullt);//30
執(zhí)行結(jié)果是:20和30。在這段代碼中,將變量count當(dāng)做參數(shù)傳遞給了函數(shù)addTen,也就是相當(dāng)于將變量count的值復(fù)制給了函數(shù)addTen的參數(shù)。這時addTen的參數(shù)num可以看做是函數(shù)內(nèi)部的一個變量。在上段代碼中,就相當(dāng)于兩個基本數(shù)據(jù)類型變量之間的值復(fù)制。而基本數(shù)據(jù)類型都有自己獨(dú)立的內(nèi)存地址,所以num和count是沒有任何關(guān)系的,他們只是值相等而已,函數(shù)執(zhí)行完畢后,count的值并沒有改變。而函數(shù)外面的result是被直接賦值的,所以result的值就是函數(shù)的結(jié)果30。
2、引用類型傳遞參數(shù):
復(fù)制代碼 代碼如下:
function setName(obj){
obj.name="LSN";
}
var person=new Object();
setName(person);
alert(person.name);//LSN
執(zhí)行結(jié)果是:LSN。在這段代碼中,函數(shù)setName的作用是給obj對象添加了一個屬性name并給該屬性賦值為"LSN",因?yàn)閛bj是引用類型,所以這里屬于是將引用類型person賦值給了obj,也就是說person和obj引用了一個內(nèi)存地址,所以當(dāng)給obj新加了屬性name時,在函數(shù)外面的person也跟著改變,最后person.naem的結(jié)果為LSN。
3、引用類型傳遞參數(shù)到底傳的是值還是引用?
復(fù)制代碼 代碼如下:
function setName(obj){
obj.name="ABC";
obj=new Object();
obj.name="BCD";
}
var person=new Object();
setName(person);
alert(person.name);// ABC
執(zhí)行結(jié)果是:ABC。實(shí)例3與實(shí)例2的區(qū)別是在函數(shù)中又加了2行代碼,在給obj對象新加一個屬性name并賦值后 又將obj定義成了一個新的對象(new Object()),定義新對象后又name賦上新的值“BCD”。這個時候如果是按引用傳遞的話,那么最后person對象就會自動修改為指向其name屬性為"BCD"的新對象,但最后顯示的卻是“ABC”,這說明即使在函數(shù)內(nèi)部修改了參數(shù)的值,但原始的引用還保持不變。實(shí)際上,當(dāng)在函數(shù)內(nèi)部obj=new Object()時 這個新的obj就已經(jīng)成為函數(shù)內(nèi)部的局部對象了,這個對象會在函數(shù)執(zhí)行完畢后自動銷毀。
您可能感興趣的文章:
- javascript中的五種基本數(shù)據(jù)類型
- JavaScript基本數(shù)據(jù)類型及值類型和引用類型
- JavaScript類型系統(tǒng)之基本數(shù)據(jù)類型與包裝類型
- javascript基本數(shù)據(jù)類型及類型檢測常用方法小結(jié)
- javascript基本數(shù)據(jù)類型和轉(zhuǎn)換
- JS中的兩種數(shù)據(jù)類型及實(shí)現(xiàn)引用類型的深拷貝的方法
- 淺談js基礎(chǔ)數(shù)據(jù)類型和引用類型,深淺拷貝問題,以及內(nèi)存分配問題
- JavaScript數(shù)據(jù)類型之基本類型和引用類型的值
- JS實(shí)現(xiàn)隊(duì)列與堆棧的方法
- JavaScript調(diào)用堆棧及setTimeout使用方法深入剖析
- JS數(shù)據(jù)類型(基本數(shù)據(jù)類型、引用數(shù)據(jù)類型)及堆和棧的區(qū)別分析
相關(guān)文章
深入理解JavaScript系列(42):設(shè)計模式之原型模式詳解
這篇文章主要介紹了深入理解JavaScript系列(42):設(shè)計模式之原型模式詳解,原型模式(prototype)是指用原型實(shí)例指向創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象,需要的朋友可以參考下2015-03-03深入理解JavaScript系列(45):代碼復(fù)用模式(避免篇)詳解
這篇文章主要介紹了深入理解JavaScript系列(45):代碼復(fù)用模式(避免篇)詳解,本文講解了默認(rèn)模式、借用構(gòu)造函數(shù)、借用構(gòu)造函數(shù)并設(shè)置原型、共享原型、臨時構(gòu)造函數(shù)、klass等內(nèi)容,需要的朋友可以參考下2015-03-03JavaScript中的分號插入機(jī)制詳細(xì)介紹
這篇文章主要介紹了JavaScript中的分號插入機(jī)制詳細(xì)介紹,本文講解JavaScript中各種情況下的分號插入機(jī)制,需要的朋友可以參考下2015-02-02JavaScript初學(xué)者建議:不要去管瀏覽器兼容
如果可以回到過去的話,我會告訴自己這句話:初學(xué)JavaScript的時候無視DOM和BOM的兼容性,先了解一些基礎(chǔ)知識最后再考慮兼容性2014-02-02關(guān)于javascript事件響應(yīng)的基礎(chǔ)語法總結(jié)(必看篇)
下面小編就為大家?guī)硪黄P(guān)于javascript事件響應(yīng)的基礎(chǔ)語法總結(jié)(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,祝大家游戲愉快哦2016-12-12