本篇文章內容:javascript
ECMAScript中有5種簡單數據類型(也稱爲基本數據類型):undefined、Null、Boolean、Number、String;
有一種複雜數據類型:Object;java
Undefined類型只有一個值,即undefined. 使用var聲明變量可是未進行初始化時,這個變量的值就是undefined.面試
Null類型一樣只有一個值,就是null. null表示一個空對象指針,當定義的一個變量準備未來保存對象,那麼最好將該變量初始化爲null。正則表達式
面試時也有遇到過undefined和null的區別或者說聯繫的問題,對於這個問題就能夠這樣回答:
實際上undefined值是派生自null值的,所以ECMA-262規定它們的相等性測試要返回true,即null == undefined //true。這就是null和undefined這兩個值之間的聯繫,可是二者也有明顯的區別。undefined的做用是當聲明瞭一個變量但還還沒有定義的時候,這個變量就默認取undefined值,但不管什麼狀況下都不必將一個變量顯示的設置爲undefined,null則不一樣,只要當用於保存對象的變量還未保存對象時,都應該將其初始化爲null.
*須要注意的是,雖然null == undefined的結果爲true,由於二者是相似的值,可是null === undefined 的結果爲false,由於二者類型不一樣。數組
該類型有兩個字面值:true和false.數據結構
區別於其餘語言,ECMAScript並無爲整數和浮點數分別定義數據類型,Number類型用於表示全部數值。框架
即字符串。函數
該類型是這門語言中全部對象的基礎類型。 javascript中的引用類型有:Object、Function、Date、Array、RegExp、Boolean、Number、String和自定義類等,可是全部這些引用類型都是對象,即Object。 另外在javascript高級程序設計中有這樣一句話:引用類型的值(對象)是引用類型的一個實例。在ECMAScript中,引用類型是一種數據結構,用於將數據和功能組織在一塊兒。測試
認識了javascript的數據類型以後,咱們來看它們的類型檢測問題,如何判斷一個數據的類型呢?ui
首先咱們來細數一下javascript中的數據類型,咱們將它們分爲兩類: 基本數據類型:String,Number,Boolean,Undefined,Null; 引用類型:Function、Array、Object、Date、RegExp和自定義對象等。
下面分別介紹三種方式來判斷數據類型:
對於基本數據類型,咱們能夠用typeOf()函數來判斷類型,但有一個例外就是null,它是不能用typeOf()來判斷的。
typeof(1); // number
typeof('1'); // string
typeof(true); // boolean
typeof(undefined); // boolean
typeof(null); // object
typeof(console.log); // function
複製代碼
能夠看到執行typeof()函數能夠獲得六種結果,分別是number、string、boolean、oject、function,其中基本類型數據除了null都能經過typeof()獲得驗證,因此檢測出null之外的基本函數均可以用typeof來進行類型檢測。
另:爲何typeof(null)值爲object?
其實是javascript最初實現中的一個錯誤,而後被EAMAScript沿用了,如今null被認爲是對象的佔位符,從而解釋了這一矛盾。
typeof()函數對於基本數據類型的判斷還差強人意,可是它是徹底沒辦法用於判斷引用數據類型的,由於全部引用數據類型都會返回Object。因而javascript引入了instanceof,用來判斷一個變量是某個對象的實例。
var obj = {}
console.log(obj instanceof Object); // true
var arr = []
console.log(arr instanceof Array); // true
var date = new Date()
console.log(date instanceof Date); // true
var fn = function() {}
console.log(fn instanceof Function); // true
var str = '123'
console.log(str instanceof String); // false
複製代碼
經過以上的代碼可見,instanceof對於引用類型的類型檢測支持很好,可是沒法對基本類型數據進行類型檢測。
在javascript高級程序設計中提供了一種能夠通用的來判斷基本數據類型和引用數據類型的方法。
//一、對基本數據類型num1和對基本包裝類型(特殊的引用類型)num2的類型檢測
var num1 = 1;
var num2 = new Number(1);
console.log(Object.prototype.toString.call(num1) == '[Object Number]'); // true
console.log(Object.prototype.toString.call(num2) == '[Object Number]'); // true
//二、對數組的類型檢測
var arr = [];
console.log(Object.prototype.toString.call(arr) == '[Object Array]') // true
//三、對函數的類型檢測
var fn = function() {}
console.log(Object.prototype.toString.call(fn) == '[Object Function]') // true
//四、對自定義對象的類型檢測
function A() {}
var a = new A();
console.log(Object.prototype.toString.call(a) == '[Object Object]') // true
複製代碼
因而可知,Object.prototype.toString.call()能夠用來做爲自定義類之外的數據類型檢測的通用方法,而對於自定義類咱們能夠轉而使用instanceof來進行判斷。
Object.prototype.toString.call()作類型判斷的結果狀況以下:
constructor是Object的每一個實例都存在的一個屬性(再強調一遍,在ECMAScript中,Object類型是全部其餘實例的基礎,換句話說Object類型所具備的屬性和方法也存在於更具體的對象中),該屬性(constructor)保存着用於建立當前對象的函數,即該屬性會返回對建立對象的構造函數的引用。
[].constructor == Array // true
{}.constructor == Object // true
複製代碼
須要注意的是,當用instanceof和constructor對數組進行類型檢測時,被判斷的Array必須是當前頁面聲明的: 好比一個頁面(父頁面)有一個框架(iframe),框架中引用了一個頁面(子頁面),在子頁面中聲明瞭一個Array,並將其賦值給父頁面的一個變量,Array == Object.constructor;會返回false. 緣由是: 一、Array屬於引用類型數據,在傳遞的時候僅僅是地址的傳遞。 二、每一個頁面的Array原生對象所引用的地址是不同的。在自頁面聲明的Array所對應的構造函數是子頁面的Array對象。父頁面進行判斷使用的Array並不等於子頁面的Array.