JavaScript是一種很是靈活的弱類型的語言,它的靈活性的一方面體如今其繁雜多樣的類型轉換。好比當JavaScript指望使用一個布爾值的時候(好比if語句中)你能夠提供任一類型的值,JavaScript會按照須要自行轉換類型;當使用==操做符比較兩個類型值的時候,也會對兩個操做數按需進行轉換,一樣的事情也發生在使用+,>和<等操做符時。這些靈活繁雜的轉換每每會使初學者不知所措,本文對JavaScript的類型轉換作一個總結。程序員
JavaScript中的類型能夠分爲兩大類:原始類型( primitive types)和對象類型(object types).其中原始類型包括數字number,字符串string,布爾boolean,null和undefined五種;除此五種以外的類型都是對象類型(包括function,array,regex等).數組
JavaScript中對於不一樣類型值之間的轉換見下表(該表爲<JavaScript權威指南>第三章表3-2)瀏覽器
值 | 字符串 | 數字 | 布爾值 | 對象 |
undefined | 「undefined」 | NaN | false | throws TypeError |
null | 「null」 | 0 | false | throws TypeError |
true | 「true」 | 1 | new Boolean(true) | |
false | 「false」 | 0 | new Boolean(false) | |
「」(空字符串) | 0 | false | new String(「」) | |
「1.2」 | 1.2 | true | new String(「1.2」) | |
「one」 | NaN | true | new String(「one」) | |
0 | 「0」 | false | new Number(0) | |
-0 | 「0」 | false | new Number(-0) | |
NaN | 「NaN」 | false | new Number(NaN) | |
Infinity | 「Infinity」 | true | new Number(Infinity) | |
-Infinity | 「-Infinity」 | true | new Number(-Infinity) | |
1(其餘非無窮大的數字) | 「1」 | true | new Number(1) | |
{} | 待討論 | 待討論 | true | |
[] | 「」 | 0 | true | |
[9] | 「9」 | 9 | true | |
[‘a’] | 使用join()方法鏈接各個元素,分隔符爲逗號 | NaN | true | |
function(){} | 待討論 | NaN | true |
從上表能夠看出,JavaScript中原始類型之間的類型轉換已經被明肯定義,原始類型到對象的轉換也被明肯定義,表格中有三個內容爲"待討論"的單元格,均是對象類型到原始類型之間的轉換,是JavaScript類型轉換的難點。這裏簡單對前兩種狀況作一下總結:
- 只有undefined,null,空字符串,0(包括0和-0)和NaN轉換爲布爾類型時會被轉換爲false,其他類型的值轉換成布爾類型都是true
- 原始類型到對象類型的轉換,null和undefined會拋出異常,而number,string和bool則會轉換成對應的包裝類型Number,String,Boolean.對於這三種原始類型,也可使用Object構造函數轉換成對象,Object構造函數會根據傳入參數的具體值來調用Number,String或者Boolean中的一個來構造對象.代碼以下
var num = new Number(10); var str = new String("abc"); var boolean = new Boolean(false); var num1 = new Object(10); var str1 = new Object("abc"); var boolean1 = new Boolean(false); console.log(typeof num + " " +num.constructor ); //輸出object function Number() { [native code] } console.log(typeof str + " " + str.constructor);//輸出object function String() { [native code] } console.log(typeof boolean + " " + boolean.constructor);//輸出object function Boolean() { [native code] } console.log(typeof num1 + " " + num1.constructor);//輸出object function Number() { [native code] } console.log(typeof str1 + " " + str1.constructor);//輸出object function String() { [native code] } console.log(typeof boolean1 + " " + boolean1.constructor);//輸出object function Boolean() { [native code] }
本小節中提到的"對象類型"僅指native objects,能夠理解爲由程序員定義的對象類型,不包括JavaScript宿主(好比瀏覽器)所定義的對象,由於宿主定義的對象可能有特殊的方法來進行類型轉換.另外本小節標題裏的原始類型僅包含bool,string和number三種類型,對象到null或者undefined的轉換不須要討論.而對象到bool類型的轉換在上面已經討論過,全部的對象類型轉換布爾類型都是true,即便new Boolean(false)轉換成布爾類型也是true.因此本小節值得討論的內容就剩下對象類型到字符串的轉換與對象類型到數字的轉換.函數
對象到字符串和對象到數字類型的轉換涉及到兩個重要的方法,最終的轉換結果會受到這兩個方法返回結果的影響,這兩個方法就是toString和valueOf.全部的對象都會從Object對象中繼承到這兩個方法.toString方法 用於返回對象的字符串表示(可是其實也能夠不返回字符串).對於默認從Object繼承而來的toString方法並不會返回太多有意義的內容.而valueOf方法目的是返回一個能夠表示對象的原始類型值,可是因爲對象的複雜性,大多數狀況下根本不可能用一個原始類型值來表示,因此默認的valueOf只是返回對象自身.Date類型是一個特例,這是JavaScript預約義類型之中惟一重寫了toString和valueOf方法的類型.spa
對象類型轉換字符串類型步驟以下:3d
對象類型轉換數字類型步驟以下:code
例子與對象轉換字符串相似,再也不給出.介紹到這裏,你們應該知道爲何空數組轉換成字符串是空字符串,可是轉換成數字是0了吧.能夠解釋僅有一個元素的數組在轉換成字符串和數字時的結果.對象