詳解JS資料型別轉換
資料型別分類
-
基本資料型別
Number | String | Boolean | Null | Undefined | Symbol
-
複合資料型別
Object
資料型別轉換
1. 顯示型別轉換
Number() | String() | Boolean()
1-1. Number()
-
基本資料型別
Number(123); //123 Number('123'); //123 Number('123a'); //NaN Number('abc'); //NaN Number(true); //1 Number(false); //0 Number(null); //0 Number(undefined); //NaN Number(NaN); //NaN Number(''); //0 Number(' '); //0
Number
在進行字串轉數字時,相當於先呼叫trim
,再進行Number
的轉換。
- 複合資料型別
複合型別的Number強制轉換,會先呼叫其本身的valueOf方法,這個方法預設會返回其本身,如果改寫了這個方法,且其返回值是基本型別,則直接對返回值進行Number強制轉換,如果返回值是複合型別,則再呼叫物件的toString方法,如果toString方法的返回值是基本型別,則對該方法的返回值呼叫Number方法,否則報錯。
var a = { s: 1, valueOf: ()=>{return 3} }; Number(a); //3 var b = {}; Number(b); // NaN var c = {s:1, toString:()=>{ return ' 123'}}; Number(c); //123
2-1. String()
- 基本資料型別
String(123); //"123"
String('123a'); //"123a"
String(true); //"true"
String(false); //"false"
String(null); //"null"
String(undefined); //"undefined"
String(NaN); //"NaN"
- 複合資料型別
複合型別的String強制轉換,會先呼叫其本身的toString方法,這個方法預設會返回的是一個字串,如果改寫了這個方法,且其返回值是基本型別,則直接對返回值進行String強制轉換,如果返回值是複合型別,則再呼叫物件的valueOf方法,如果valueOf方法的返回值是基本型別,則對該方法的返回值呼叫String方法,否則報錯。
var a = {
toString:function(){
return 11;
},
valueOf:function(){
return 22;
},
t:3
};
String(a);//11
Number(a);//22
預設的toString
的轉換如下
Object.prototype.toString.call(2); //"[object Number]"
Object.prototype.toString.call('abs');//"[object String]"
Object.prototype.toString.call(true); //"[object Boolean]"
Object.prototype.toString.call(null); //"[object Null]"
Object.prototype.toString.call(undefined);//"[object Undefined]"
Object.prototype.toString.call(NaN);//"[object Number]"
Object.prototype.toString.call( ()=>{} );//"[object Function]"
Object.prototype.toString.call( [] );//"[object Array]"
// HTML DOM 節點
var eles = document.getElementsByTagName("body");
document.writeln( eles.toString() ); // [object HTMLCollection]
document.writeln( eles[0].toString() ); // [object HTMLBodyElement]
所以這個toString
方法是不是很強大,但是有一點是需要注意的,Array
和Date
物件的toString
方法是重寫了的。
var a = [1,2,3]; a.toString(); //1,2,3
3-1. Boolean()
- true
Boolean(1); //除零的任意數字
Boolean(' ');//除''的任意其他字元
Boolean([]); //任意物件都為真
Boolean({});
Boolean(-1);//true
- false
Boolean(0);
Boolean('');
Boolean(null);
Boolean(undefined);
Boolean(NaN);
2. 隱式型別轉換
-
數學運算
"+"
有一個Strings時,將表示式的值轉換為String
"-"
將表示式的值轉換為Number
-
if條件
被隱式轉換為boolean
-
"=="不嚴格比較
任意兩種型別比較時,如果不是同一個型別比較的話,則按如下方式進行轉換比較
物件 => 字串 => 數值 數值 <= 布林值