JavaScript(三)數據類型轉換
類型轉換
JavaScript中的取值類型非常靈活,如當JavaScript期望使用一個布爾值的時候,你可以提供其它數據類型的,JavaScript將根據需要自行轉換數據類型。如下示例:
10 + “objects” // 結果“10objects”,數字10被轉換成字符串 “7” * “4” // 結果是28,兩個字符串被轉換成了數字。 var n = 1 - "x" // 結果是n等於NaN,因為字符串“x”無法被轉換為數字 n + "objects" //結果是“NaN objects”。NaN被轉換成了字符串類型
值 | 字符串 | 數字 | 布爾值 | 對象 |
undefined | "undefined" | NaN | false | throws TypeError |
null | "null" | 0 | false | throws TypeError |
true | "true" | 1 | true | new Boolean(true) |
false | "false" | 0 | false | new Boolean(false) |
""(空字符串) | "" |
0 | false | new String("") |
"1.2" | "1.2" | 1.2 | true | new String("1.2") |
"one" | "one" | NaN | true | new String("one") |
0 | "0" | 0 | false | new Number(0) |
-0 | "0" | -0 | false | new Number(-0) |
NaN | "NaN" | NaN | false | new Number(NaN) |
Infinity | "Infinity" | Infinity | true | new Number(Infinity) |
-Infinity | "-Infinity" | -Infinity | true | new Number(-Infinity) |
1 | "1" | 1 | true | new Number(1) |
{} | "[object Object]" | NaN | true | new object({}) |
[] | "" | 0 | true | new object([]) |
[9] | "9" | 9 | true | new object([9]) |
["a"] | "a" | NaN | true | new object(["a"]) |
function(){} | "函數的實現代碼" | NaN | true |
小結:字符串轉換成數字,如果字符串的開始和結尾有空格的數字可以正常轉換成數字,如“ 123 ”可以轉換成數字123,但如果有其它特殊符號得到的數字結果將是NaN。
顯示類型轉換
盡管JavaScript可以自動做許多類型轉換,但有時為了使代碼變得清晰易讀需要使用顯示類型轉換。
做顯示類型轉換最簡單的方法就是使用Boolean(),Number(),String(),object()函數,當前面沒有關鍵字new時,它們會作為類型轉換函數,來將值轉換成我們需要的數據類型。需要註意的是,除了null和undefined之外的任何值都具有toString()方法,這個方法的執行結果通常和String方法的返回結果一致,同樣需要註意的是,如果試圖把null或undefined轉換為對象,會拋出一個類型錯誤的錯誤。object()函數在這種情況下不會拋出異常,它僅簡單的返回一個新創建空間的對象。
在計算機程序中數字的解析和格式化是非常普通的工作,JavaScript中提供了專門的函數和方法來做更加精確的數字到字符串,字符串到數字的轉換。
Number類定義的toString()方法可以接收表示轉換基數(進制)的可選參數,如果不指定此參數,轉換規則將是基於十進制。同樣也可以將數字轉換成其它進制。
如下示例:
var num = 10; binay_str = n.toString(2); // 將數字轉換成二進制 octal_str = n.toString(8); // 將數字轉換成八進制 hex_str = n.toString(16); // 將數字轉換成十六進制
當處理財務或科學數據的時候,對於輸出小數點位置和有效數字位數,或者是科學技術法時,Number類為這種小數到字符串的轉換提供了三個方法:
toFixed(位數):根據參數指點小數點後的位數,如果有效位後面還有小數,則按四舍五入的方式進位。
toExponential(有效位):科學計數法,小數點前只保留1位,根據參數指定小數點後的有效位,同樣如果有效位後面還有小數按四舍五入進位。
torecision(有效位):根據指定的有效數字位數將數字轉換成字符串,如果有效位數字少於數字整數部分的位數,則轉換成科學計數法。
如下示例:
var n = 123456.789; n.toFixed(0); // "123457"四舍五入進1 n.toFixed(2); // "123456.79""四舍五入進1 n.toFixed(5); // "123456.78900"位數不足用0補位 n.toExponential(1); // "1.2e+5" n.toExponential(3); // "1.235e+5" n.toPrecision(4); // "1.235e+5" n.toPrecision(7); // "123456.8" n.toPrecision(10); // "123456.7890"
如果通過Number()轉換函數傳入一個字符串,它會試圖將其轉換為一個整數或浮點數,這個方法只能基於十進制數進行轉換,並且不能出現非法的尾隨字符。parseInt()函數,parseFloat()函數(它們是全局函數,不從屬於任何類的方法)更加靈活。parseInt()只解析整數,parseFloat()可以解析整數和浮點數。如果字符串前綴是“0x”“0X”,parseInt()將其解釋為十六進制,parseInt()和parseFloat()都會跳過任意數量的前導空格,盡可能解析更多數值字符串,並忽略後面的內容,如果第一個非空格字符是非法的特殊符號,將返回NaN。
如下示例:
parseInt("3 Hello World"); // 結果是3 parseFloat(" 3.14 Hello World"); // 結果是3.14 parseInt("-12.34"); // 結果是-12 parseInt("oxFF"); // 結果是255 parseInt("0xff"); // 結果是255 parseInt("-0xff"); // 結果是-255 parseFloat(".1"); // 結果是0.1 parseInt("0.1"); // 結果是0 parseInt(".1"); // 結果是NaN parseFloat("#23.33"); // 結果是NaN
parseInt()可以接收第二個可選參數,這個參數指定數字轉換的基數,取值範圍是2-36。
如下示例:
parseInt("11",2) // 將二進制轉換成十進制輸出 parseInt("ff",16); // 將十六進制轉換成十進制輸出 parseInt("zz",36); // 將三十六進制轉換成十進制輸出 parseInt("077",8); // 將八進制轉換成十進制輸出
對象轉換為原始值
對象到布爾值轉換非常簡單,所有對象(包括數組,函數)都轉換為true,對於對象到字符串和對象到數字的轉換是通過調用待轉換對象的一個方法來完成的。
所有對象繼承了兩個轉換方法,一個是toString()它的作用是返回一個反應這個對象的字符串,很多類定義了更多特定版本的toSring()方法,如數組類的toString()方法將每個數組元素轉換為一個字符串,並在元素之間添加逗號後合並成結果字符串。函數類的toString()返回這個函數的實現定義的表示方式。日期類Date定義的toString()返回一個可讀的日期和時間字符串。RegExp類定義的toString()將RegExp對象轉換為正則表達式字符串。
[1,2,3].toString(); // 結果是"1,2,3" (function(x) {...}).toString(); // 結果是"function(x) {...}" /\d+/g.toString(); // 結果是"/\\d+/g" new Date().toString(); // 當前時間
另一個轉換對象的函數是valueOf(),如果存在原始值,它就默認將對象轉換為表示它的原始值,對象是復合值,而且大多數對象無法真正表示為一個原始值,因此valueOf()方法簡單的返回對象本身,而不是返回一個原始值。
如下示例:
var d = new Date(); d.valueOf(); // 打印當前時間的時間戳1553439997486 var a = [1,2,3]; a.valueOf(); // 打印[1,2,3]
JavaScript中對象到字符串的轉換經歷如下步驟:
1、如果對象具有toString()方法,則調用這個方法,如果它返回一個原始值,JavaScript將整個值轉換成字符串(如果本身是字符串的話),並返回這個字符串結果。
2、如果對象沒有toString()方法,或者這個方法並不返回一個原始值,那麽JavaScript會調用valueOf()方法,如果返回值是原始值,JavaScript將整個值轉換為字符串並返回這個字符串結果。
3、如果JavaScript無法從toString()或valueOf()獲得一個原始值,此時它將拋出一個類型錯誤的異常。
對象到數字的轉過程也是一樣,只是它首先會調用valueOf()。
1、如果對象有valueOf()方法,後者返回一個原始值,則JavaScript將這個原始值轉換為數字並返回這個數字。
2、如果沒有valueOf()這個方法,調用toString()方法,後者返回一個原始值,則JavaScript將其轉換成字符串後返回。
3、如果沒有valueOf()和toSring()方法,拋出一個類型錯誤異常。
對象轉換為數字的細節解釋了為什麽空數組會被轉換為數字0以及為什麽具有單個元素的數組同樣會轉換成一個數字。數組繼承默認的valueOf方法,這個方法返回一個對象而不是一個原始值,因此,數組到數字的轉換調用toString方法,空數組轉換成空字符串,空字符串轉換成數字0,含有一個元素的數組轉換為字符串的結果和這個元素轉換字符串的結果一樣。如果數組只包含一個數字元素,這個數字轉換為字符串,在轉換回數字。
"+" 和 "==" 應用的對象到原始值的轉換包含日期對象的一種特殊情形。 日期類是JavaScript語言核心中唯一的預先定義類型,它定義了有意義的向字符串和數字類型的轉換。 對於所有非日期的對象來說, 對象到原始值的轉換基本上是對象到數字的轉換(首先調用valueOf()) , 日期對象則使用對象到字符串的轉換模式,然而,這裏的轉換和上文講述的井不完全一致:通過valueOf或toString()返回的原始值將被直接使用,而不 會被強制轉換為數字或字符串。
和"==" 一樣, "<” 運算符以及其他關系運算符也會做對象到原始值的轉換, 但要除去日期對象的特殊情形:任何對象都會首先嘗試調用valueOf(), 然後調用toString()。不管得到的原始值是否直接使用,它都不會進一步被轉換為數字或字符串。
"+"、 "=="、 "!=" 和關系運算符是唯一執行這種特殊的字符串到原始值的轉換方式的運算符。 其他運算符到特定類型的轉換都很明確,而且對日期對象來講也沒有特殊情況。 例如 " - ,, (減號)運算符把它的兩個操作數都轉換為數字。
下面的代碼示例:
var now = new Date(); // 當前時間 typeof (now+ 1); // "string" typeof (now - 1); // "number" now == now. toString(); // true now > (now -1); // true
JavaScript(三)數據類型轉換