JAVASCRIPT數據類型(值類型-引用類型-類型總覽)

值類型:也稱爲原始數據或原始值(primitive value)。數據結構

這類值存儲在棧(stack)中,棧是內存中一種特殊的數據結構,也稱爲線性表,棧按照後進先出的原則存儲數據,先進入的數據被壓入棧底,最後插入(push)的數據放在棧頂,須要讀取數據時從棧頂開始彈出(pop)數據,即最後一個數據被第一個讀出來。所以說,值類型都是簡單的數據段。變量的位置和變量值的位置是重疊的,也就是說值類型的數據被存儲在變量被訪問的位置。框架

引用類型:這類值存儲在堆(heap)中,堆是內存中的動態區域,至關於自留空間,在程序運行期間會動態分配給代碼和堆棧。函數

堆中存儲的通常都是對象,而後經過一個編號傳遞給棧內變量,這個編號就是所謂的引用指針(point),這樣變量和變量值之間是分離的,它們經過指針相聯繫。當讀寫數據時,計算機經過變量的指針找到堆中的數據塊,並進行操做。性能

在JavaScript中,number、string、boolean、null和undefined型數據都是值類型。因爲值類型數據佔據的空間都是固定的,因此能夠把它們存儲在狹窄的內存棧區。這種存儲方式更方便計算機進行查找和操做,因此執行速度會很是快。ui

而對於object型數據(包括function和array)來講,因爲它們的大小是不固定的,因此不能存儲在棧區,只能被分配到堆區,若是存儲在棧區,則會下降計算機尋址的速度。而堆的空間是不固定的,因此很適合存儲大小不固定的對象數據,而後在棧區存儲對象在堆區的地址便可,而地址的大小是固定的,因此這種分離存儲的方法不會影響計算機的尋址速度,對於變量的性能也沒有任何負面影響(如圖)。spa

在JavaScript語言中,object、function和array等對象都是引用型數據。不少語言都把字符串視爲引用型數據,而不是值類型,由於字符串的長度是可變的。可是JavaScript比較特殊,它把字符串做爲值類型進行處理。不過,字符串在複製和傳遞運算中,是以引用型數據的方法來處理的。.net

以上轉自:http://developer.51cto.com/art/201107/279599.htm指針

 2、JavaScript類型總覽htm

JavaScript類型總覽

 

此外,補充一下圖中用到的概念:對象

一、內置(Build-in)對象與原生(Naitve)對象的區別在於:前者老是在引擎初始化階段就被建立好的對象,是後者的一個子集;然後者包括了一些在運行過程當中動態建立的對象。

二、引擎擴展對象是一個並不太大的集合,通常來講比較肯定,它們也屬於引擎的原生對象(但不屬於ECMA規範的原生對象)。

三、宿主對象不是引擎的原生對象,而是由宿主框架經過某種機制註冊到JavaScript引擎中的對象。

四、一些宿主會把本身提供的對象/構造器也稱爲「原生對象」,例如Internet Explorer 7就把它提供的XMLHttpRequest()稱爲原生的——與此相對的是在它的更早先版本中經過「new ActiveXObject('Microsoft.XMLHTTP')」這樣的方法建立的對象。這種狀況下,讀者應注意到「宿主的原生對象」與「引擎的原生對象」之間的差別。

以上轉自:http://blog.csdn.net/aimingoo/article/details/6676530

3、JavaScript的數據類型問題

首先咱們談兩點體會。其一,JavaScript不是純粹的面嚮對象語言,它是混合語言,因此所謂「一切面向對象」既是宣傳用語,也是一種語言處理技巧。僅從「面向對象」來理解這個語言的類型,會犯不少錯誤。其二,ECMAScript的描述老是很準確而又遲滯於這門語言的發展。因此要理解一些現象,既要從JavaScript的歷史中去找,也要考慮到JavaScript如今的發展。ECMAScirpt是一個標準的、規範化的參考,但不是所有。

接下來講說類型。JavaScript既是過程式語言,也是面向對象的語言。這必定程度上,也表現爲:它事實上有兩套類型系統。第一套類型系統是用typeof來識別,這是這個語言的基本類型系統,只有六種類型,即undefined、number、boolean、string、object與function。我通常也稱之爲基礎類型系統。之因此稱爲「基礎」,是由於第二套類型系統是以它爲基礎,從object這一種類型中發展起來的,即對象類型系統。

對象類型系統用instanceof來識別,它至關於其它高級語言中的is操做/運算。面向對象的多態主要經過as和is來表達,對於JavaScript來講,因爲是弱類型的(沒有強制類型檢查),因此不須要as。

對象類型系統與基礎類型系統存在映射關係,例如基礎類型的string影射到對象系統中的String。但這只是影射,因此本質上來講string類型不是String類型。二者本質上不一樣。具體來講,undefined,string、number和boolean是「值類型」;object與function是「引用類型」。因爲String、Number與Boolean在基礎類型中都屬於object類型,是Object()的子類,所以是引用類型。Function()也是引用類型。全部引用類型均可以看着Object()的子類,因此任意函數也是Object()的子類。例如"<匿名函數> instanceof Object"返回true。

undefined是值類型,它沒有對應的對象類型——咱們一般能夠稱之爲Undefined類型,但它沒有對應的構造器。undefined只有一個值,即undefined。準確地說,undefined代表聲明(或產生)了但沒有值的變量。而Null也是一個類型,null是它的唯一值(按照語言規則,null也是一個關鍵字)。Null類型是對象類型,亦便是引用類型。因此Null與Undefined本質的不一樣,是它們分屬在不一樣的類型系統中,解釋着不一樣類型系統中的「無」的概念。通常來講,DOM中的某個屬性或成員若是無值,應該使用null;而JavaScript運算過程當中若是出現無值,應該使用undefined。

上面強調要從「兩套類型系統」的角度來理解上述類型。而這兩個類型系統在JavaScript中是能夠混用的,實現這一特性的技術被稱爲「類包裝」。這是JavaScript對Java的主要借鑑,也是後來的.NET對Java的主要借鑑之一——類包裝也被稱爲「裝箱」(以及「拆箱」)。JavaScript中的類包裝過程出現然屬性存取中,即「.運算符」或「[]運算符」。當這兩個運算符發現左操做數x是一個「值類型」數據時,將隱式地調用Object(x)過程將它轉爲對象,所以

'abc'.length

這個運算實際上就等效於

Object('abc').length

 以上轉自:http://developer.51cto.com/art/201107/279599.htm
相關文章
相關標籤/搜索