JavaScript數(shù)據(jù)類型之基本類型和引用類型的值
ECMAScript變量包含兩種不同數(shù)據(jù)類型的值:基本類型值和引用類型值?;绢愋椭凳呛?jiǎn)單的數(shù)據(jù)段,而引用類型值指那些可能由多個(gè)值構(gòu)成的對(duì)象。
在將一個(gè)值賦給變量時(shí),解析器必須確定這個(gè)值是基本類型還是引用類型?;绢愋桶ㄈ鏤ndefined、Null、Boolean、Number和String,這5種基本類型數(shù)據(jù)類型是按值訪問(wèn)的,因此可以操作保存在變量中的實(shí)際的值;引用類型類型的值是保存在內(nèi)存中的對(duì)象。與其他語(yǔ)言不同,JavaScript不允許直接訪問(wèn)內(nèi)存中的位置,也就是說(shuō)不能直接操作對(duì)象的內(nèi)存空間。在操作對(duì)象時(shí),實(shí)際上實(shí)在操作對(duì)象的引用而不是實(shí)際的對(duì)象,因此,引用類型的值是按引用訪問(wèn)的。
1、動(dòng)態(tài)的屬性
定義基本類型和定義引用類型的方法大相近庭。對(duì)于引用類型的值,我們可以為其添加屬性和方法,也可以改變和刪除其屬性和方法,如下:
var person = new Object();
person.name = "zxj";
alert(person.name); //"zxj"
2、復(fù)制變量值
如果從一個(gè)變量向另一個(gè)變量復(fù)制基本類型的值,會(huì)在變量對(duì)象上創(chuàng)建一個(gè)新值,然后將該值復(fù)制到為新變量分配的位置上。
var num1 = 5;
var num2 = num1; //5
當(dāng)從一個(gè)變量向另一個(gè)變量復(fù)制引用類型的值時(shí),同樣也會(huì)將存儲(chǔ)在變量對(duì)象中的值復(fù)制一份放到為新變量分配的內(nèi)存空間里。不同的是,這個(gè)值實(shí)際上是一個(gè)指針,而這個(gè)指針執(zhí)行存儲(chǔ)在堆中的一個(gè)對(duì)象。復(fù)制結(jié)束后,兩個(gè)變量實(shí)際上將引用同一個(gè)對(duì)象。因此,改變其中一個(gè)變量,就會(huì)影響到另一個(gè)變量,如下所示:
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "zxj";
alert(obj2.name); //"zxj"
3、傳遞參數(shù)
ESMAScript中所有函數(shù)的參數(shù)都是按值傳遞的。也就是說(shuō),把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù),就是把值從一個(gè)變量復(fù)制到另一個(gè)變量一樣。基本類型值的傳遞如同基本類型變量的復(fù)制一樣。引用類型值的傳遞,則如同引用類型變量的復(fù)制一樣。有不少開(kāi)發(fā)者在這一點(diǎn)上可能感到困惑,因?yàn)樵L問(wèn)變量有按值和按引用兩種方式,而參數(shù)只能按值傳遞。
在向參數(shù)傳遞基本類型的值時(shí),被傳遞的值會(huì)被復(fù)制給一個(gè)局部變量(即命名參數(shù))。如下代碼所示:
function addTen(num) {
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
alert(count); // 20,沒(méi)有變化
alert(result); // 30
參數(shù)實(shí)際上是函數(shù)的局部變量。參數(shù)num和變量count互不認(rèn)識(shí),它們僅僅具有相同的值。假如num是按引用傳遞的,那么變量count的值也將變成30,從而反映函數(shù)內(nèi)部的變化。
在向參數(shù)傳遞引用類型的值時(shí),會(huì)把這個(gè)值在內(nèi)存中的地址復(fù)制一個(gè)給局部變量,因此這個(gè)局部變量的變化會(huì)反映在函數(shù)的外部。在這里我們使用引用類型來(lái)看一下:
function setName(obj) {
obj.name = "zxj";
}
var person = new Object();
setName(person);
alert(person.name); //"zxj"
在這個(gè)函數(shù)內(nèi)部,obj和person引用的是同一個(gè)對(duì)象。換句話說(shuō),即使這個(gè)對(duì)象是按值傳遞的,obj也會(huì)按引用來(lái)訪問(wèn)同一個(gè)對(duì)象。于是,當(dāng)在函數(shù)內(nèi)部為obj添加name屬性后,函數(shù)外部的person也會(huì)有所反映,因?yàn)閜erson指向的對(duì)象在堆內(nèi)存中只有一個(gè),而且是全局對(duì)象。很多開(kāi)發(fā)者錯(cuò)誤的認(rèn)為:在局部作用域中修改的對(duì)象會(huì)在全局作用域中反映出來(lái),就說(shuō)明參數(shù)是按引用傳遞的。為了證明對(duì)象是按值傳遞的,我們?cè)诳纯聪旅孢@個(gè)進(jìn)過(guò)修改的例子:
function setName(obj) {
obj.name = "zxj";
obj = new Object();
obj.name = "sdf";
}
var person = new Object();
setName(person);
alert(person.name);
上面這個(gè)例子可以看出,如過(guò)person是按引用傳遞的,那么person就會(huì)自動(dòng)被修改為指向其name屬性值為"sdf"的新對(duì)象。但是,當(dāng)接下來(lái)再訪問(wèn)person.name時(shí),顯示的仍然是"zxj"。這說(shuō)明即使在函數(shù)內(nèi)部修改了參數(shù)的值,但原始的引用仍然保存不變。實(shí)際上,當(dāng)在函數(shù)內(nèi)部重寫obj時(shí),這個(gè)變量引用的就是一個(gè)局部對(duì)象了。而這個(gè)局部對(duì)象會(huì)在函數(shù)執(zhí)行完畢時(shí)立即銷毀。
可以將ECMAScript函數(shù)的參數(shù)想象成局部變量。
4、檢測(cè)類型
雖然在檢測(cè)基本數(shù)據(jù)類型時(shí)typeof是一個(gè)得力助手,但是在檢測(cè)引用類型時(shí),這個(gè)操作符用處卻不大。通常,我們并不想知道某個(gè)值是對(duì)象,而是想知道他是什么類型的對(duì)象。為此ECMAScript提供了instanceof操作符,其語(yǔ)法如下:
result = varible instanceof constructor
如果變量是給定引用類型的實(shí)例,那么instanceof操作符會(huì)返回true:
alert(person instanceof Object);
相關(guān)文章
javascript Function函數(shù)理解與實(shí)戰(zhàn)
小編給大家?guī)?lái)一片關(guān)于javascript的基礎(chǔ)教學(xué)內(nèi)容,關(guān)于Function函數(shù)的訓(xùn)練與理解,一起學(xué)習(xí)下吧。2017-12-12淺談關(guān)于JavaScript API設(shè)計(jì)的一些建議和準(zhǔn)則
這篇文章主要介紹了淺談關(guān)于JavaScript API設(shè)計(jì)的一些建議和準(zhǔn)則,文中列舉了許多知名的JS API進(jìn)行輔助說(shuō)明,極力推薦!需要的朋友可以參考下2015-06-06讓ie運(yùn)行js時(shí)提示允許阻止內(nèi)容運(yùn)行的解決方法
這個(gè)問(wèn)題一般是因?yàn)榫W(wǎng)頁(yè)中使用了一些js代碼,而ie的默認(rèn)安全級(jí)別過(guò)高導(dǎo)致運(yùn)行js時(shí)需要經(jīng)過(guò)準(zhǔn)許才可以。下面是IE的設(shè)置方法。2010-10-10JavaScript 學(xué)習(xí)筆記二 字符串拼接
JavaScript 字符串拼接的一些知識(shí)點(diǎn)分析,對(duì)于提高效率等,都是非常值得一看的。2010-03-03JavaScript lastIndexOf方法入門實(shí)例(計(jì)算指定字符在字符串中最后一次出現(xiàn)的位置)
這篇文章主要介紹了JavaScript字符串對(duì)象的lastIndexOf方法入門實(shí)例,lastIndexOf方法用于計(jì)算指定字符在字符串中最后一次出現(xiàn)的位置,需要的朋友可以參考下2014-10-10js實(shí)現(xiàn)checkbox全選和反選示例
這篇文章主要介紹了js實(shí)現(xiàn)checkbox全選和反選示例,需要的朋友可以參考下2014-05-05javaScript 事件綁定、事件冒泡、事件捕獲和事件執(zhí)行順序整理總結(jié)
這篇文章主要介紹了javaScript 事件綁定、事件冒泡、事件捕獲和事件執(zhí)行順序整理總結(jié)的相關(guān)資料,需要的朋友可以參考下2016-10-10