JavaScript 能夠根據運算環境自動轉換值的型別,以滿足運算需要。但是在很多情況下需要開發者手動轉換資料型別,以控制運算過程。
轉換為字串
常用值轉換為字串,如圖所示。
常用值轉換為字串
轉換前 |
轉換後 |
1 |
"1" |
0 |
"0" |
true |
"true" |
false |
"false" |
"" |
"" |
undefined |
"undefined" |
null |
"null" |
NaN |
"NaN" |
Infinity |
"Infinity" |
把值轉換為字串的常用方法有 2 種,具體說明如下。
1. 使用加號運算子
當值與空字串相加運算時,JavaScript 會自動把值轉換為字串。
1) 把數位轉換為字串,返回數位本身。
var n = 123;
n = n + "";
console.log(typeof n); //返回型別為 string
2) 把布林值轉換為字串,返回字串 "true" 或 "false"。
var b = true;
b = b + "";
console.log(b); //返回字串"true"
3) 把陣列轉換為字串,返回陣列元素列表,以逗號分隔。如果是空陣列,則返回空字串。
var a = [1,2,3];
a = a + "";
console.log(a); //返回字串 "1,2,3"
4) 把函數轉換為字串,返回函數的具體程式碼字串。
var f = function(){return 1;};
f = f + "";
console.log(f); //返回字串 "function (){return 1;}"
① 如果是內建型別函數,則只返回建構函式的基本結構,省略函數的具體實現程式碼。而自定義型別函數與普通函數一樣,返回函數的具體實現程式碼字串。
d = Date + "";
console.log(d); //返回字串 "function Date () { [ native code ] } "
② 如果是內建靜態函數,則返回 [object Class] 格式的字串表示。
m = Math +"";
console.log(m); //返回字串 "[object Math]"
5) 如果把物件範例轉換為字串,則返回的字串會根據不同型別或定義物件的方法和引數而不同。具體說明如下。
① 物件直接量,則返回字串為 "[object object]"
var a = {
x :1
}
a = a + "";
console.log(a); //返回字串 "[object object]"
② 如果是自定義類的物件範例,則返回字串為 "[object object]"。
var a =new function(){}();
a = a + "";
console.log(a); //返回字串 "[object object]"
③ 如果是內建物件範例,具體返回字串將根據引數而定。
正規表示式物件會返回匹配模式字串,時間物件會返回當前
GMT
格式的時間字串,數值物件會返回傳遞的引數值字串或者0等。
a = new RegExp(/^w$/) + "";
console.log(a); //返回字串 "/^w$/"
加號運算子有兩個計算功能:數值求和、字串連線。但是字串連線操作的優先順序要大於求和運算。因此,在可能的情況下,即運算元的資料型別不一致時,加號運算子會嘗試把數值運算元轉換為字串,再執行連線操作。
但是當多個加號運算子位於同一行時,這個問題就比較複雜。例如:
var a = 1 + 1 + "a";
var b= "a" + 1 + 1;
console.log(a); //返回字串 "2a"
console.log(b); //返回字串"a11"
通過上面程式碼可以看到,加號運算子還會考慮運算的順序。對於變數 a 來說,按照從左到右的運算順序,加號運算子會執行求和運算,然後再執行連線操作。但是對於變數 b 來說,由於 "a" + 1 表示式運算將根據連線操作來執行,所以返回字串 "a1",然後再用這個字串與數值 1 進行運算,再次執行連線操作,最後返回字串 "a11”,而不是字串 "a2”。
如果要避免此類現象的發生,可以考慮使用小括號運算子來改變表示式的運算順序。
var b = "a" + (1 + 1) ; //返回字串 "a2"
2. 使用toString()方法
當為簡單的值呼叫 toString() 方法時,JavaScript 會自動把它們封裝為物件,然後再呼叫 toString() 方法,獲取物件的字串表示。
var a = 123456;
a.toString();
console.log(a); //返回字串“123456”
使用加號運算子轉換字串,實際上也是呼叫 toString() 方法來完成,只不過是 JavaScript 自動呼叫 toString() 方法實現的。
JavaScript 能夠根據運算環境自動轉換變數的型別。在自動轉換中,JavaScript 一般根據運算的型別環境,按需進行轉換。例如,如果在執行字串為字串;如果在執行基本數學運算,則會嘗試把字串轉換為數值;如果在邏輯運算環境中,則會嘗試把值轉換為布林值等。
轉換為數位模式字串
toString() 是 Object 型別的原型方法,Number 子類繼承該方法後,重寫了 toString(),允許傳遞一個整數引數,設定顯示模式。數位預設為十進位制顯示模式,通過設定引數可以改變數位模式。
1) 如果省略引數,則 toString() 方法會採用預設模式,直接把數位轉換為數位字串。
var a = 1.000;
var b = 0.0001;
var c = 1e-1;
console.log(a.toString()); //返回字串“1”
console.log(b.toString()); //返回字串“0.0001”
console.log(c.toString()); //返回字串“0.0001”
toString() 方法能夠直接輸出整數和浮點數,保留小數位。小數位末尾的零會被清除。但是對於科學計數法,則會在條件許可的情況下把它轉換為浮點數,否則就用科學計數法形式輸出字串。
var a = 1e-14;
console.log(a.toString()); //返回字串“1e-14”
在預設情況下,無論數值採用什麼模式表示,toString() 方法返回的都是十進位制的數位字串。因此,對於八進位制、二進位制或十六進位制的數位,toString() 方法都會先把它們轉換為十進位制數值之後再輸出。
var a = 010; //八進位制數值 10
var b = 0x10; //十六進位制數值10
console.log(a.toString()); //返回字串“8”
console.log(b.toString()); //返回字串“16”
2) 如果設定引數,則 toString() 方法會根據引數把數值轉換為對應進位制的值之後,再輸出為字串表示。
var a = 10; //十進位制數值 10
console.log(a.toString(2)); //返回二進位制數位字串“1010”
console.log(a.toString(8)); //返回八進位制數位字串“12”
console.log(a.toString(16)); //返回二進位制數位字串“a”
轉換為小數格式字串
使用 toString() 方法把數值轉換為字串時,無法保留小數位。這對於貨幣格式化、科學計數等專業領域輸出顯示數位來說,無疑是不方便的。為此,JavaScript 提供了 3 個專用方法,具體說明如下。
1) toFixed()
toFixed() 能夠把數值轉換為字串,並顯示小數點後的指定位數。
var a = 10;
console.log(a.toFixed(2)); //返回字串“10.00”
console.log(a.toFixed(4)); //返回字串“10.0000”
2) toExponential()
toExponential() 方法專門用來把數位轉換為科學計數法形式的字串。
var a = 123456789;
console.log(a.toExponential(2)); //返回字串“1.23e+8”
console.log(a.toExponential(4)); //返回字串“1.2346e+8”
toExponential() 方法的引數指定了保留的小數位數。省略部分採用四捨五入的方式進行處理。
3) toPrecision()
toPrecision() 方法與 toExponential() 方法相似,但它可以指定有效數位的位數,而不是指定小數位數。
var a = 123456789;
console.log(a.toPrecision(2)); //返回字串“1.2e+8”
console.log(a.toPrecision(4)); //返回字串“1.235e+8”