我在這裏主要的想提下的是JavaScript中的引用類型進行強制轉換類型.因爲對於基本數據類型的變換大多都是雷同的,很容易熟知,但是引用數據類型有一點小插曲.
JavaScript的引用類型主要爲對象,數組和函數.主要針對的是對對象和數組進行轉換.而轉換又包括兩種方式,即顯式和隱式轉換.
顯式強制類型轉換
首先我們需要一些基本的規則.
基本類型的字符串化規則:
- null ==> ‘null’
- true ==>‘true’ ,false ==> ‘false’
- undefined ==> ‘undefined’
- 數字也是自身字符串化,1 ==> ‘1’
基本類型的數字化規則:
- null ==> 0
- undefined ==> NaN
- true ==> 1, false ==> 0
- 字符串會拆開引號,看它是否是數字,是則輸出數字,否則輸出NaN.如果是空字符串,則會轉成0.
不同類型對象的valueof規則:
對象 ==>對象本身
Boolean ==> 布爾值
Number ==> 數字值
String ==> 字符串值
Array ==> 返回數組對象本身
Date ==> 距離1970的毫秒數
Function ==> 函數本身
Math和Error沒有valueof方法
通過構造String()化
首先,會調用引用數據類型的tostring()方法,會看該方法是否會返回基本數據類型,如果是就使用.如果不是就會調用valueof方法,返回基本數據類型就使用,如果不是則會報錯.
//通過複寫其系統方法來觀察
// obj,對象
Object.prototype.toString=function () {
return [];
}
Object.prototype.valueOf=function () {
return 456;
}
var obj = {
name:"Jan",
age:18
}
// obj.toString() ---> obj.valueOf()
var res = String(obj);
console.log(typeof res,res);//string '456'
// 數組
Array.prototype.toString=function () {
}
Array.prototype.valueOf=function () {
return 123;
}
var arr =[1,2,3,4];
var res = String(arr);
console.log(typeof res,res);//string undefined
通過構造Number()化
首先,會調用引用數據類型的valueof()方法,會看該方法是否會返回基本數據類型,如果是就使用.如果不是就會調用tostring()方法,返回基本數據類型就使用,如果不是則會報錯.
//對數組和對象進行number化
var arr = [1,2,3];
var res = Number(arr); //tostring==>1,2,3
console.log(typeof res,res);//number NaN
Object.prototype.valueOf=function(){
return " 12345 ";
}
var obj ={};
var res = Number(obj);
console.log(typeof res,res);//number 12345
var res = +obj;
console.log(typeof res,res);//number 12345
只有Number()和’+'正號才能激發顯式number化.
另外提下toPrimitive,它是引用數據類型轉基本數據類型.都是先回調用valueof方法,然後才調用tostring方法.
隱式強制類型轉換
隱式轉換一般是’+'符號觸發,還有邏輯判斷觸發
//如果某個操作數是字符串 + 將進行拼接操作
//遇到對象 則ToPrimitive()
Array.prototype.valueOf=function(){
return "1";
}
Array.prototype.toString=function(){
return false;
}
console.log([] + 1); //'11'
(1) if (..) 語句中的條件判斷表達式。
(2) for ( .. ; .. ; .. ) 語句中的條件判斷表達式(第二個)。
(3) while (..) 和 do..while(..) 循環中的條件判斷表達式。
(4) ? : 中的條件判斷表達式。
(5) 邏輯運算符 || (邏輯或)和 && (邏輯與)左邊的操作數(作爲條件判斷表達式)