日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
JavaScript基本數(shù)據(jù)類型和引用數(shù)據(jù)類型

ECMAScript包含兩種不同數(shù)據(jù)類型的值:基本類型值和引用類型值?;绢愋椭抵傅氖呛唵蔚臄?shù)據(jù)段,而引用類型值那些可能有多個值構(gòu)成的對象。

在進(jìn)行變量賦值時,解析器必須確定這個值是基本類型值還是引用類型值。常用的5中基本數(shù)據(jù)類型為:Undefined、Null、Boolean、Number和String?;緮?shù)據(jù)類型是按值訪問的,因?yàn)榭梢圆僮鞅4嬖谧兞恐械膶?shí)際的值。而引用類型的值是保存在內(nèi)存中的對象。JavaScript不允許直接訪問內(nèi)存中的位置,即不能直接操作對象的內(nèi)存空間。在操作對象時,實(shí)際上是在操作對象的引用而不是實(shí)際的對象。因此,引用類型的值是按引用訪問的。

1. 動態(tài)的屬性

對于引用類型的值,我們可以為其添加屬性和方法,也可以改變和刪除其屬性和方法。例如:

 
 
  1. var person = new Object();
  2. person.name = "John";
  3. alert(person.name); //"John"

只要對象不被銷毀或者這個屬性不被刪除,這個屬性就一直存在。但我們不能給基本類型的值添加屬性,盡管并不會導(dǎo)致任何錯誤。

2. 復(fù)制變量值

如果從一個變量向另一個變量復(fù)制基本類型的值,會在變量對象上創(chuàng)建一個新值,然后將該值復(fù)制到為新變量分配的位置上,例如:

 
 
  1. var num1 = 5;
  2. var num2 = num1; //5

下圖形象地展示了復(fù)制基本類型值的過程:

當(dāng)從一個變量向另一個變量復(fù)制引用類型的值時,同樣會將存儲在變量對象中的值復(fù)制一份放到為新變量分配的空間中。不同的是,這個值的副本實(shí)際上是一個指針,而這個指針指向存儲在堆中的一個對象。復(fù)制操作結(jié)束后,兩個變量實(shí)際上將引用同一個對象。因此,改變其中一個變量,就會影響另一個變量,例如:

 
 
  1. var obj1 = new Object();
  2. var obj2 = obj1;
  3. obj1.name = "John";
  4. alert(obj2.name); //"John"

3. 傳遞參數(shù)

ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的。把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù),就和把一個變量的值復(fù)制給另一個變量一樣。無論傳遞的是基本類型的值還是引用類型的值。這里需要注意,訪問變量有按值和按引用兩種方式,但參數(shù)只能按值傳遞。

在向參數(shù)傳遞基本類型的值時,被傳遞的值會被復(fù)制給一個局部變量(即命名參數(shù))。例如:

 
 
  1. function addTen(num){
  2. num += 10;
  3. return num;
  4. }
  5. var count = 20;
  6. var result = addTen(count);
  7. alert(count); //20,沒有變化
  8. alert(result); //30

參數(shù)實(shí)際上是函數(shù)的局部變量。參數(shù)num和變量count互不認(rèn)識,它們只是具有相同的值。假如num是按引用傳遞的,那么count的值也會變成30,從而反應(yīng)函數(shù)內(nèi)部的變化。

在向參數(shù)傳遞引用類型的值時,會把這個值在內(nèi)存中的地址復(fù)制給一個局部變量,因此這個局部變量的變化會反應(yīng)在函數(shù)外部。例如:

 
 
  1. function setName(obj){
  2. obj.name = "John";
  3. }
  4. var person = new Object();
  5. setName(person);
  6. alert(person.name); //"John"

在這個函數(shù)內(nèi)部,obj和person引用的是同一個對象。換句話說,即使這個值是按值傳遞的,obj也會按引用來訪問同一個對象。于是,在函數(shù)內(nèi)容為obj添加nama屬性在函數(shù)外的person對象也有所反應(yīng),因?yàn)閜erson指向的對象在堆內(nèi)存中只有一個,而且是全局對象。有許多開發(fā)者認(rèn)為,在函數(shù)內(nèi)容修改的對象會在全局作用域中反應(yīng)出來,說明參數(shù)是按引用傳遞的,這個觀點(diǎn)其實(shí)是錯誤的,看下面的代碼:

 
 
  1. function setName(obj){
  2. obj.name = "John";
  3. obj = new Object();
  4. obj.name = "Evan";
  5. }
  6. var person = new Object();
  7. setName(person);
  8. alert(person.name); //"John"

如果person是按引用傳遞的,那么person就會自動被修改為指向其name屬性為"Evan"的新對象,但我們訪問person.name時發(fā)現(xiàn)其值仍然為"John",這說明即使在函數(shù)內(nèi)部修改了參數(shù)的值,但原始的引用仍然保持不變。實(shí)際上,在函數(shù)內(nèi)部重寫obj時,這個變量引用的就是一個局部對象了。而這個局部對象在函數(shù)執(zhí)行完成之后會立即銷毀。

4. 檢測類型

要檢測一個值是不是基本數(shù)據(jù)類型,typeof操作符是***工具。它可以檢測一個變量是字符串、數(shù)值、布爾值還是undefined。如果一個變量是對象或null,則typeof操作符會返回object。

但是在檢測引用類型的值時,typeof用處就不那么大了,通常我們并不想知道某個值是對象,而想知道它是什么類型的對象,此時可以使用instanceof操作符,如果變量是給定引用類型的實(shí)例,那么instanceof操作符就會返回true。例如:

 
 
  1. alert(person instanceof Object);    //變量person是Object嗎?
  2. alert(colors instanceof Array);    //變量colors是Array嗎?
  3. alert(pattern instanceof RegExp);    //變量pattern是RegExp嗎?

所有引用類型的值都是Object的實(shí)例。因此,在檢測一個引用類型的值或Object構(gòu)造函數(shù)時,instanceof都會返回true。當(dāng)用instanceof操作符檢測一個基本類型的值時,都會返回false,因?yàn)榛绢愋筒皇菍ο蟆?/p>
當(dāng)前題目:JavaScript基本數(shù)據(jù)類型和引用數(shù)據(jù)類型
網(wǎng)站路徑:http://m.5511xx.com/article/dpsoooh.html