溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JavaScript基本數(shù)據(jù)類型和引用數(shù)據(jù)類型是什么

發(fā)布時間:2021-11-17 15:24:10 來源:億速云 閱讀:176 作者:iii 欄目:web開發(fā)

本篇內(nèi)容主要講解“JavaScript基本數(shù)據(jù)類型和引用數(shù)據(jù)類型是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“JavaScript基本數(shù)據(jù)類型和引用數(shù)據(jù)類型是什么”吧!

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

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

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

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

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

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

2. 復(fù)制變量值

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

var num1 = 5;  var num2 = num1; //5

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

JavaScript基本數(shù)據(jù)類型和引用數(shù)據(jù)類型是什么

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

var obj1 = new Object();  var obj2 = obj1;  obj1.name = "John";  alert(obj2.name); //"John"

JavaScript基本數(shù)據(jù)類型和引用數(shù)據(jù)類型是什么

3. 傳遞參數(shù)

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

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

function addTen(num){  num += 10;  return num;  }  var count = 20;  var result = addTen(count);  alert(count); //20,沒有變化  alert(result); //30

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

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

function setName(obj){  obj.name = "John";  }  var person = new Object();  setName(person);  alert(person.name); //"John"

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

function setName(obj){  obj.name = "John";  obj = new Object();  obj.name = "Evan";  }  var person = new Object();  setName(person);  alert(person.name); //"John"

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

4. 檢測類型

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

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

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

所有引用類型的值都是Object的實例。因此,在檢測一個引用類型的值或Object構(gòu)造函數(shù)時,instanceof都會返回true。當(dāng)用instanceof操作符檢測一個基本類型的值時,都會返回false,因為基本類型不是對象。

到此,相信大家對“JavaScript基本數(shù)據(jù)類型和引用數(shù)據(jù)類型是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI