javascript重修之書(一):如何判斷變量的數據類型
寫在前面:寫的有點亂哈,不足之處希望大家可以多多指正_(┐「ε:)_。
一:基本類型和引用類型的區別:
1:動態屬性:
對於引用類型的值,我們可以對其動態的添加屬性和方法,也可以改變和刪除其屬性和方法,如果這個對象不刪除或者添加的屬性和方法不刪除,其屬性和方法會一直存在。
而對於基本類型的值,我們不能為其添加屬性,這樣做雖然不會報錯,但是會返回undefined,看一下代碼:
function fun() {
console.log("我是一個方法");
}
var obj = new Object;
obj.name = "林沖";
obj.fun1 = fun;
console.log(obj.name);
console.log(obj.fun1);
var val = "12";
val.name="二狗";
val.fun1=fun;
console.log(val.name);
console.log(val.fun1);
打開f12查看輸出的結果:

從以上代碼我們可以發現,引用類型可以為其動態添加屬性和方法,也可以訪問。基本類型未報錯,但訪問的值確實undefined。
2:復制變量值:
基本類型的值,復制的值是相互獨立的,操作其中的一個變量,另一個變量不受影響,看以下代碼:
var name1 = '林沖'; var name2 = name1; name2 = "二狗"; console.log(name1); //“林沖” console.log(name2); //“二狗”
從以上代碼可以發現,我們將name1的值復制給name2,然后我們修改了name2的值,name1卻未受影響,請看以下示意圖:

當將一個變量給另一個變量復制引用類型的值的時候,兩個變量實際上引用的是同一個對象,改變其中一個變量就會影響另外一個變量,看一下的代碼:
var people = new Object; people.name = "林沖"; var people2 = people; people2.name = "二狗"; console.log(people.name); //二狗
以上代碼我們將變量people保存一個對象的新實例並動態添加了name屬性,然后將people復制到people2,修改people2的name屬性后,輸出people的name屬性會發現值也被修改了。因此,當復制引用類型的值的時候,改變其中一個變量也會影響到另一個變量。看下圖:

二:檢測值類型 基本類型:(Undefined、Null、Boolean、Number和String)
以上我們了解了何為基本類型和引用類型,那么如何判斷一個變量究竟是什么類型的呢?這個時候我們就可以用到typeof操作符。我們先分析以下這段代碼輸出的值:
var a ="123"; var b = 123; var c = true; var d; var e = null;
var f = new Object(); console.log("a的數據類型是"+typeof a); console.log("b的數據類型是"+typeof b); console.log("c的數據類型是"+typeof c); console.log("d的數據類型是"+typeof d); console.log("e的數據類型是"+typeof e); console.log("f的數據類型是"+typeof f);
打開瀏覽器的f12,我們可以看到輸出了以下這些內容:

從輸出的內容中我們可以發現,變量a,b,c,d,f的類型很好理解,可為什么變量e的值為null,輸出的數據類型卻是object呢?我們可以參考參考ECMAScript5.1中文版4.3.11節中對null值的描述:
空值 (null value):
代表對象值故意留空的一個原始值(其意思是它只是期望此處將引用一個對象, 注意是"期望")
三:檢測引用類型(Object Function array RegExp。。。)
引用類型值是指可能由多個值構成的對象。引用類型值保存在內存中,而JS是不能直接訪問內存的,所以對於引用類型,操作的不是實際的對象而是對象的引用。先看一下代碼理解到底什么是引用類型:
function myArray(){
var a = ["林沖"];
var b = a;
console.log(a[0]);//林沖
b[0] = '林二狗';
console.log(a[0]); //林二狗
}
myArray();
從以上代碼的輸出結果可以看出,修改b[0]的值也改變了a[0]的值,這是因為引用類型復制和簡單類型不同,復制完成后新值和之前的值都是引用的同一個對象,所以之前的值改變,也會影響復制后的值。如圖:

以上的例子我們了解了什么是引用類型,但是根據規定所有引用類型的值都是Object的實例,那么我們是要typeof操作符輸出的值肯定是object,但是引用類型值是指可能由多個值構成的對象,那我們怎樣才能知道這個引用類型究竟是什么類型的對象呢?這個時候我們就要用到instanceof操作符,其語法如下所示:
result = variable instanceof constructor
我們在上面的代碼作出以下修改:
function myArray(){
var a = ["林沖"];
var b = a;
console.log(a[0]);
console.log(typeof a);
console.log(a instanceof Function); //false
console.log(a instanceof Array); //true
b[0] = '林二狗';
console.log(a[0]);
console.log(b instanceof Array); //true
}
myArray();
從上面的代碼可以看出,檢測引用類型a是否為Function的時候會返回false,二是否為數組則會返回true, 引用類型b也是同理。這里要注意的是:使用instanceof操作符檢測基本類型會一直返回false,因為基本類型值不是對象。
