javascript重修之書(一):如何判斷變量的數據類型


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,因為基本類型值不是對象。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM