JavaScript是一門動態語言,所謂的動態語言能夠暫時理解爲在語言中的一切內容都是不肯定的。好比一個變量,這一時刻是個整型,下一時刻可能會變成字符串了。雖然變量的數據類型是不肯定的,可是各類運算符對數據類型是有要求的。若是運算符發現,運算子的類型與預期不符,就會自動轉換類型。javascript
本文主要介紹數據類型強制轉換和自動轉換,自動轉換是基於強制轉換之上。強制轉換主要指使用Number、String和Boolean三個函數,手動將各類類型的值,分佈轉換成數字、字符串或者布爾值。html
var a = 123 a.toString()//"123" var b = null; b.toString()//"報錯" var c = undefined c.toString()//"報錯"
var iNum = 10; alert(iNum.toString(2)); //輸出 "1010" alert(iNum.toString(8)); //輸出 "12" alert(iNum.toString(16)); //輸出 "A"
可是對於null和undefined,就不會調用toString()方法,它會將null直接轉換爲"null",將undefined 直接轉換爲"undefined"java
var a = null String(a)//"null" var b = undefined String(b)//"undefined"
String({a: 1}) // "[object Object]" String([1, 2, 3]) // "1,2,3"
下面分紅兩種狀況討論,一種是參數是原始類型的值,另外一種是參數是對象數組
(1)原始類型值函數
①字符串轉數字spa
Ⅰ 若是是純數字的字符串,則直接將其轉換爲數字.net
Ⅱ 若是字符串中有非數字的內容,則轉換爲NaN code
Ⅲ 若是字符串是一個空串或者是一個全是空格的字符串,則轉換爲0htm
Number('324') // 324 Number('324abc') // NaN Number('') // 0
②布爾值轉數字:true轉成1,false轉成0對象
Number(true) // 1 Number(false) // 0
③undefined轉數字:轉成NaN
Number(undefined) // NaN
④null轉數字:轉成0
Number(null) // 0
⑤Number() 接受數值做爲參數,此時它既能識別負的十六進制,也能識別0開頭的八進制,返回值永遠是十進制值
Number(3.15); //3.15 Number(023); //19 Number(0x12); //18 Number(-0x12); //-18
(2)對象
簡單的規則是,Number方法的參數是對象時,將返回NaN,除非是包含單個數值的數組。
Number({a: 1}) // NaN Number([1, 2, 3]) // NaN Number([5]) // 5
這種方式專門用來對付字符串,parseInt()一個字符串轉換爲一個整數,能夠將一個字符串中的有效的整數內容取出來,而後轉換爲Number。parseFloat()把一個字符串轉換爲一個浮點數。parseFloat()做用和parseInt()相似,不一樣的是它能夠得到有效的小數。
console.log(parseInt('.21')); //NaN console.log(parseInt("10.3")); //10 console.log(parseFloat('.21')); //0.21 console.log(parseFloat('.d1')); //NaN console.log(parseFloat("10.11.33")); //10.11 console.log(parseFloat("4.3years")); //4.3 console.log(parseFloat("He40.3")); //NaN
parseInt()在沒有第二個參數時默認以十進制轉換數值,有第二個參數時,以第二個參數爲基數轉換數值,若是基數有誤返回NaN
console.log(parseInt("13")); //13 console.log(parseInt("11",2)); //3 console.log(parseInt("17",8)); //15 console.log(parseInt("1f",16)); //31
二者的區別:Number函數將字符串轉爲數值,要比parseInt函數嚴格不少。基本上,只要有一個字符沒法轉成數值,整個字符串就會被轉爲NaN。
parseInt('42 cats') // 42 Number('42 cats') // NaN
上面代碼中,parseInt逐個解析字符,而Number函數總體轉換字符串的類型。
另外,對空字符串的處理也不同
Number(" "); //0 parseInt(" "); //NaN
它的轉換規則相對簡單:只有空字符串("")、null、undefined、+0、-0 和 NaN 轉爲布爾型是 false,其餘的都是 true,空數組、空對象轉換爲布爾類型也是 true,甚至連false對應的布爾對象new Boolean(false)也是true
Boolean(undefined) // false Boolean(null) // false Boolean(0) // false Boolean(NaN) // false Boolean('') // false
Boolean({}) // true Boolean([]) // true Boolean(new Boolean(false)) // true
遇到如下三種狀況時,JavaScript 會自動轉換數據類型,即轉換是自動完成的,用戶不可見。
JavaScript 遇到預期爲布爾值的地方(好比if語句的條件部分),就會將非布爾值的參數自動轉換爲布爾值。系統內部會自動調用Boolean函數。
邏輯運算符!若是對非布爾值進行運算,則會將其轉換爲布爾值,而後再取反。
因此咱們能夠利用該特色,來將一個其餘的數據類型轉換爲布爾值,
能夠爲一個任意數據類型取兩次反,來將其轉換爲布爾值,原理和Boolean()函數同樣。
if ('abc') { console.log('hello') } // "hello"
算數運算符(+ - * /)跟非Number類型的值進行運算時,會將這些值轉換爲Number,而後在運算,除了字符串的加法運算
true + 1 // 2 2 + null // 2 undefined + 1 // NaN 2 + NaN // NaN 任何值和NaN作運算都得NaN '5' - '2' // 3 '5' * '2' // 10 true - 1 // 0 '1' - 1 // 0 '5' * [] // 0 false / '5' // 0 'abc' - 1 // NaN
一元運算符也會把運算子轉成數值。
+'abc' // NaN -'abc' // NaN +true // 1 -false // 0
字符串的自動轉換,主要發生在字符串的加法運算時。當一個值爲字符串,另外一個值爲非字符串,則後者轉爲字符串。
'5' + 1 // '51' '5' + true // "5true" '5' + false // "5false" '5' + {} // "5[object Object]" '5' + [] // "5" '5' + function (){} // "5function (){}" '5' + undefined // "5undefined" '5' + null // "5null"