1. 程式人生 > >詳解JS資料型別轉換

詳解JS資料型別轉換

資料型別分類

  1. 基本資料型別
    Number | String | Boolean | Null | Undefined | Symbol

  2. 複合資料型別
    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方法是不是很強大,但是有一點是需要注意的,ArrayDate物件的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. 隱式型別轉換

  1. 數學運算
    "+" 有一個Strings時,將表示式的值轉換為String
    "-" 將表示式的值轉換為Number

  2. if條件
    被隱式轉換為boolean

  3. "=="不嚴格比較
    任意兩種型別比較時,如果不是同一個型別比較的話,則按如下方式進行轉換比較
    物件 => 字串 => 數值 數值 <= 布林值