Js從頭學(xué)起(基本數(shù)據(jù)類型和引用類型的參數(shù)傳遞詳細(xì)分析)
更新時(shí)間:2012年02月16日 20:14:04 作者:
Js中所有函數(shù)的參數(shù)傳遞都是按值傳遞的,也就是把函數(shù)外面的值復(fù)制給函數(shù)內(nèi)部的參數(shù),就和把值從一個(gè)變量復(fù)制到另一個(gè)變量一樣。下面舉幾個(gè)特別的例子
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ù)。這時(shí)addTen的參數(shù)num可以看做是函數(shù)內(nèi)部的一個(gè)變量。在上段代碼中,就相當(dāng)于兩個(gè)基本數(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對象添加了一個(gè)屬性name并給該屬性賦值為"LSN",因?yàn)閛bj是引用類型,所以這里屬于是將引用類型person賦值給了obj,也就是說person和obj引用了一個(gè)內(nèi)存地址,所以當(dāng)給obj新加了屬性name時(shí),在函數(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對象新加一個(gè)屬性name并賦值后 又將obj定義成了一個(gè)新的對象(new Object()),定義新對象后又name賦上新的值“BCD”。這個(gè)時(shí)候如果是按引用傳遞的話,那么最后person對象就會自動(dòng)修改為指向其name屬性為"BCD"的新對象,但最后顯示的卻是“ABC”,這說明即使在函數(shù)內(nèi)部修改了參數(shù)的值,但原始的引用還保持不變。實(shí)際上,當(dāng)在函數(shù)內(nèi)部obj=new Object()時(shí) 這個(gè)新的obj就已經(jīng)成為函數(shù)內(nèi)部的局部對象了,這個(gè)對象會在函數(shù)執(zhí)行完畢后自動(dòng)銷毀。
復(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ù)。這時(shí)addTen的參數(shù)num可以看做是函數(shù)內(nèi)部的一個(gè)變量。在上段代碼中,就相當(dāng)于兩個(gè)基本數(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對象添加了一個(gè)屬性name并給該屬性賦值為"LSN",因?yàn)閛bj是引用類型,所以這里屬于是將引用類型person賦值給了obj,也就是說person和obj引用了一個(gè)內(nèi)存地址,所以當(dāng)給obj新加了屬性name時(shí),在函數(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對象新加一個(gè)屬性name并賦值后 又將obj定義成了一個(gè)新的對象(new Object()),定義新對象后又name賦上新的值“BCD”。這個(gè)時(shí)候如果是按引用傳遞的話,那么最后person對象就會自動(dòng)修改為指向其name屬性為"BCD"的新對象,但最后顯示的卻是“ABC”,這說明即使在函數(shù)內(nèi)部修改了參數(shù)的值,但原始的引用還保持不變。實(shí)際上,當(dāng)在函數(shù)內(nèi)部obj=new Object()時(shí) 這個(gè)新的obj就已經(jīng)成為函數(shù)內(nèi)部的局部對象了,這個(gè)對象會在函數(shù)執(zhí)行完畢后自動(dòng)銷毀。
您可能感興趣的文章:
- 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入門學(xué)習(xí)第九篇 Javascript DOM 總結(jié)
作為一個(gè)js-DOM開發(fā)者,你必須知道的一些DOM方法:2008-07-07
javascript與java有什么關(guān)系(區(qū)別與相似)
Java和JavaScript的編程語言,名稱聽起來相似,但卻是兩個(gè)公司開發(fā)的不同的產(chǎn)品。Java是SUN公司推出的新一代面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,特別適合于Internet應(yīng)用程序開發(fā);而JavaScript是Netscape公司的產(chǎn)品,可以嵌入Web頁面中的基于對象和事件驅(qū)動(dòng)的解釋性語言。2023-02-02
JavaScript開發(fā)規(guī)范要求(規(guī)范化代碼)
作為一名開發(fā)人員(WEB前端JavaScript開發(fā)),不規(guī)范的開發(fā)不僅使日后代碼維護(hù)變的困難,同時(shí)也不利于團(tuán)隊(duì)的合作,通常還會帶來代碼安全以及執(zhí)行效率上的問題。2010-08-08
javascript Math.random()隨機(jī)數(shù)函數(shù)
返回指定范圍的隨機(jī)數(shù)(m-n之間)的公式 ,大家可以參考下。2009-11-11

