1. 程式人生 > >JavaScript 基本資料型別和Object 轉換

JavaScript 基本資料型別和Object 轉換

JavaScript中的資料型別分為兩種:基本資料型別和物件型別,其中物件型別包含物件,陣列,以及函式。

基本資料型別

在JavaScript中,包含三種基本的資料型別,字串(String),數值(Number),布林值(boolean),下面是一些簡單的例子:

1 var str ="Hello, world";//字串 2 var i =10;//整型數 3 var f =2.3;//浮點數 4 5 var b =true;//布林值

我們可以分別檢視變數的值及變數的型別:

複製程式碼 1 alert(str); 2 alert(i); 3 alert(f); 4 alert(b);
5 6 alert(typeof str); 7 alert(typeof i); 8 alert(typeof f); 9 alert(typeof b); 複製程式碼

JavaScript中,所有的數字,不論是整型浮點,都屬於“數字”基本型別。typeof是一個一元的操作符.

物件型別

  這裡提到的物件不是物件本身,而是指一種型別,此處的物件包括,物件(屬性的集合,即鍵值的散列表),陣列(有序的列表),函式(包含可執行的程式碼)。

物件型別是一種複合的資料型別,其基本元素由基本資料型別組成,當然不限於基本型別,比如物件型別中的值可以是其他的物件型別例項,我們通過例子來說明:

複製程式碼
1 var str ="Hello, world"; 2 var obj =new Object(); 3 obj.str = str; 4 obj.num =2.3; 5 6 var array =new Array("foo", "bar", "zoo"); 7 8 var func =function(){ 9 print("I am a function here"); 10 } 11 複製程式碼


兩者之間的轉換

  類似與Java中基本資料型別的自動裝箱拆箱,JavaScript也有類似的動作,基本資料型別在做一些運算時,會臨時包裝一個物件,做完運算後,又自動釋放該物件。

我們可以通過幾個例子來說明:

1 var str ="JavaScript Kernal"; 2 print(str.length);//列印17 

str為一個字串,通過typeof運算子可知其type為”string”,而:

1 var str2 =new String("JavaScript Kernal"); 2 3 print(typeof str2);

  可知,str2的type為”object”,即這兩者並不相同,那麼為什麼可以使用str.length來的到str的長度呢?事實上,當使用str.length時,JavaScript會自動包裝一個臨時的String物件,內容為str的內容,然後獲取該物件的length屬性,最後,這個臨時的物件將被釋放。

  而將物件轉換為基本型別則是通過這樣的方式:通過呼叫物件的valueOf()方法來取得物件的值,如果和上下文的型別匹配,則使用該值。如果valueOf取不到值的話,則需要呼叫物件的toString()方法,而如果上下文為數值型,則又需要將此字串轉換為數值。由於JavaScript是弱型別的,所以JavaScript引擎需要根據上下文來“猜測”物件的型別,這就使得JavaScript的效率比編譯型的語言要差一些。

  valueOf()的作用是,將一個物件的值轉換成一種合乎上下文需求的基本型別,toString()則名副其實,可以打印出物件對應的字串,當然前提是你已經“過載”了Object的toString()方法。

事實上,這種轉換規則會導致很多的問題,比如,所有的非空物件,在布林值環境下,都會被轉成true,比如:

複製程式碼 1 function convertTest(){ 2 if(new Boolean(false) &&new Object() &&3 new String("") &&new Array()){ 4 print("convert to boolean") 5 } 6 } 7 8 convertTest();//convert to Boolean 複製程式碼

初學者容易被JavaScript中的型別轉換規則搞暈掉,很多情況下會覺得那種寫法看著非常彆扭,其實只需要掌握了規則,這些古怪的寫法會大大的提高程式碼的效能,我們通過例子來學習這些規則:

複製程式碼 1 var x =3; 2 var y = x +"2";// => 32 3 var z = x +2;// => 5 4 5 print(y); 6 print(z);  複製程式碼

通常可以在JS程式碼中發現這樣的程式碼:

1 if(datamodel.item){ 2 //do something... 3 }else{ 4 datamodel.item =new Item(); 5 }

這種寫法事實上具有更深層次的含義:

  應該注意到,datamodel.item是一個物件(字串,數字等),而if需要一個boolean型的表示式,所以這裡進行了型別轉換。在JavaScript中,如果上下文需要boolean型的值,則引擎會自動將物件轉換為boolean型別。轉換規則為,如果該物件非空,則轉換為true,否則為false.因此我們可以採取這種簡寫的形式。

型別的判斷

typeof並不總是有效的,比如下面這種情況:

1 var obj = {}; 2 var array = ["one", "two", "three", "four"]; 3 4 print(typeof obj);//object 5 print(typeof array); //object

  執行結果顯示,物件obj和陣列array的typeof值均為”object”,這樣我們就無法準確判斷了,這時候,可以通過呼叫instanceof來進行進一步的判斷:

1 print(obj instanceof Array);//false 2 print(array instanceof Array);//true 

  第一行程式碼返回false,第二行則返回true。因此,我們可以將typeof操作符和instanceof操作符結合起來進行判斷。