經過手動進行類型轉換,Javascript提供瞭如下轉型函數:編程
轉換爲數值類型:Number(mix)、parseInt(string,radix)、parseFloat(string) 轉換爲字符串類型:toString(radix)、String(mix) 轉換爲布爾類型:Boolean(mix)
一、Number(mix)函數,能夠將任意類型的參數mix轉換爲數值類型。其規則爲:數組
(1)若是是布爾值,true和false分別被轉換爲1和0 (2)若是是數字值,返回自己。 (3)若是是null,返回0. (4)若是是undefined,返回NaN。 (5)若是是字符串,遵循如下規則: 一、若是字符串中只包含數字,則將其轉換爲十進制(忽略前導0) 二、若是字符串中包含有效的浮點格式,將其轉換爲浮點數值(忽略前導0) 三、若是是空字符串,將其轉換爲0 四、若是字符串中包含非以上格式,則將其轉換爲NaN (6)若是是對象,則調用對象的valueOf()方法,而後依據前面的規則轉換返回的值。若是轉換的結果是NaN,則調用對象的toString()方法,再次依照前面的規則轉換返回的字符串值。
下表列出了對象的valueOf()的返回值:函數
對象 | 返回值 |
---|---|
Array | 數組的元素被轉換爲字符串,這些字符串由逗號分隔,鏈接在一塊兒。其操做與 Array.toString 和 Array.join 方法相同。 |
Boolean | Boolean 值。 |
Date | 存儲的時間是從 1970 年 1 月 1 日午夜開始計的毫秒數 UTC。 |
Function | 函數自己。 |
Number | 數字值。 |
Object | 對象自己。這是默認狀況。 |
String | 字符串值。 |
下面提供幾個例子,你能寫出它的正確結果嗎:測試
Number(「hello CSSer!」);
Number(「0×8″);
Number(「」);
Number(「020dd」);
Number(「070″);
Number(true);編碼
二、parseInt(string, radix)函數,將字符串轉換爲整數類型的數值。它也有必定的規則:code
(1)忽略字符串前面的空格,直至找到第一個非空字符 (2)若是第一個字符不是數字符號或者負號,返回NaN (3)若是第一個字符是數字,則繼續解析直至字符串解析完畢或者遇到一個非數字符號爲止 (4)若是上步解析的結果以0開頭,則將其看成八進制來解析;若是以0x開頭,則將其看成十六進制來解析 (5)若是指定radix參數,則以radix爲基數進行解析
小測驗:
parseInt(「hello CSSer!」);
Number(「0×8″);
parseInt(「」);
parseInt(「020dd」);
parseInt(「070″);
parseInt(「22.5″);對象
三、parseFloat(string)函數,將字符串轉換爲浮點數類型的數值。ip
它的規則與parseInt基本相同,但也有點區別:字符串中第一個小數點符號是有效的,另外parseFloat會忽略全部前導0,若是字符串包含一個可解析爲整數的數,則返回整數值而不是浮點數值。
四、toString(radix)方法。除undefined和null以外的全部類型的值都具備toString()方法,其做用是返回對象的字符串表示。字符串
對象 | 操做 |
---|---|
Array | 將 Array 的元素轉換爲字符串。結果字符串由逗號分隔,且鏈接起來。 |
Boolean | 若是 Boolean 值是 true,則返回 「true」。不然,返回 「false」。 |
Date | 返回日期的文字表示法。 |
Error | 返回一個包含相關錯誤信息的字符串。 |
Function | 返回以下格式的字符串,其中 functionname 是被調用 toString 方法函數的名稱:function functionname( ) { [native code] } |
Number | 返回數字的文字表示。 |
String | 返回 String 對象的值。 |
默認 | 返回 「[object objectname]」,其中 objectname 是對象類型的名稱。 |
五、String(mix)函數,將任何類型的值轉換爲字符串,其規則爲:string
(1)若是有toString()方法,則調用該方法(不傳遞radix參數)並返回結果 (2)若是是null,返回」null」 (3)若是是undefined,返回」undefined」
六、Boolean(mix)函數,將任何類型的值轉換爲布爾值。
如下值會被轉換爲false:false、」"、0、NaN、null、undefined,其他任何值都會被轉換爲true。
在某些狀況下,即便咱們不提供顯示轉換,Javascript也會進行自動類型轉換,主要狀況有:
一、 用於檢測是否爲非數值的函數:isNaN(mix)
isNaN()函數,經測試發現,該函數會嘗試將參數值用Number()進行轉換,若是結果爲「非數值」則返回true,不然返回false。
二、遞增遞減操做符(包括前置和後置)、一元正負符號操做符
這些操做符適用於任何數據類型的值,針對不一樣類型的值,該操做符遵循如下規則(通過對比發現,其規則與Number()規則基本相同): (1)若是是包含有效數字字符的字符串,先將其轉換爲數字值(轉換規則同Number()),在執行加減1的操做,字符串變量變爲數值變量。 (2)若是是不包含有效數字字符的字符串,將變量的值設置爲NaN,字符串變量變成數值變量。 (3)若是是布爾值false,先將其轉換爲0再執行加減1的操做,布爾值變量編程數值變量。 (4)若是是布爾值true,先將其轉換爲1再執行加減1的操做,布爾值變量變成數值變量。 (5)若是是浮點數值,執行加減1的操做。 (6)若是是對象,先調用對象的valueOf()方法,而後對該返回值應用前面的規則。若是結果是NaN,則調用toString()方法後再應用前面的規則。對象變量變成數值變量。
小測驗:
分別對如下類型的值執行後置遞增操做,結果是什麼?
「2″, 」02dd」, 」", false, 22.5, +」", -false, +new Date()
三、 加法運算操做符
加號運算操做符在Javascript也用於字符串鏈接符,因此加號操做符的規則分兩種狀況:
若是兩個操做值都是數值,其規則爲:
(1)若是一個操做數爲NaN,則結果爲NaN
(2)若是是Infinity+Infinity,結果是Infinity
(3)若是是-Infinity+(-Infinity),結果是-Infinity
(4)若是是Infinity+(-Infinity),結果是NaN
(5)若是是+0+(+0),結果爲+0
(6)若是是(-0)+(-0),結果爲-0
(7)若是是(+0)+(-0),結果爲+0
若是有一個操做值爲字符串,則:
若是兩個操做值都是字符串,則將它們拼接起來
若是隻有一個操做值爲字符串,則將另外操做值轉換爲字符串,而後拼接起來
若是一個操做數是對象、數值或者布爾值,則調用toString()方法取得字符串值,而後再應用前面的字符串規則。對於undefined和null,分別調用String()顯式轉換爲字符串。
能夠看出,加法運算中,若是有一個操做值爲字符串類型,則將另外一個操做值轉換爲字符串,最後鏈接起來。
四、 乘除、減號運算符、取模運算符
這些操做符針對的是運算,因此他們具備共同性:若是操做值之一不是數值,則被隱式調用Number()函數進行轉換。具體每一種運算的詳細規則請參考ECMAScript中的定義。
五、 邏輯操做符(!、&&、||)
邏輯非(!)操做符首先經過Boolean()函數將它的操做值轉換爲布爾值,而後求反。
1、邏輯與(&&)操做符,若是一個操做值不是布爾值時,遵循如下規則進行轉換:
(1)若是第一個操做數經Boolean()轉換後爲true,則返回第二個操做值,不然返回第一個值(不是Boolean()轉換後的值)
(2)若是有一個操做值爲null,返回null
(3)若是有一個操做值爲NaN,返回NaN
(4)若是有一個操做值爲undefined,返回undefined
邏輯或(||)操做符,若是一個操做值不是布爾值,遵循如下規則:
(1)若是第一個操做值經Boolean()轉換後爲false,則返回第二個操做值,不然返回第一個操做值(不是Boolean()轉換後的值)
(2)對於undefined、null和NaN的處理規則與邏輯與(&&)相同
六、 關係操做符(<, >, <=, >=)
與上述操做符同樣,關係操做符的操做值也能夠是任意類型的,因此使用非數值類型參與比較時也須要系統進行隱式類型轉換:
(1)若是兩個操做值都是數值,則進行數值比較
(2)若是兩個操做值都是字符串,則比較字符串對應的字符編碼值
(3)若是隻有一個操做值是數值,則將另外一個操做值轉換爲數值,進行數值比較
(4)若是一個操做數是對象,則調用valueOf()方法(若是對象沒有valueOf()方法則調用toString()方法),獲得的結果按照前面的規則執行比較
(5)若是一個操做值是布爾值,則將其轉換爲數值,再進行比較
注:NaN是很是特殊的值,它不和任何類型的值相等,包括它本身,同時它與任何類型的值比較大小時都返回false。
七、 相等操做符(==) 相等操做符會對操做值進行隱式轉換後進行比較: (1)若是一個操做值爲布爾值,則在比較以前先將其轉換爲數值 (2)若是一個操做值爲字符串,另外一個操做值爲數值,則經過Number()函數將字符串轉換爲數值 (3)若是一個操做值是對象,另外一個不是,則調用對象的valueOf()方法,獲得的結果按照前面的規則進行比較 (4)null與undefined是相等的 (5)若是一個操做值爲NaN,則相等比較返回false (6)若是兩個操做值都是對象,則比較它們是否是指向同一個對象