js的數據類型隱式轉換主要分為三種情況:
1. 轉換為boolean類型
2. 轉換為number類型
3. 轉換為string類型
轉換為boolean類型
數據在 邏輯判斷 和 邏輯運算 之中會隱式轉換為boolean類型
轉換規則表:
數據類型 |
轉換之后的值 |
數字 0 |
false |
NaN |
false |
空字符 ” |
false |
null |
false |
undefined |
false |
非0數字 |
true |
非空字符串 |
true |
非null對象類型 |
true |
注意:如果使用new操作符創建的對象隱式轉換為boolean類型都是true,哪怕是new String(”);
提示:連續使用兩個非操作符(!!)可以將一個數強制轉換為boolean類型,這在開發之中比較實用。
轉換為string類型和轉換為number類型
我將這兩個放在一起總結是因為一個數到底轉換為string還是number受到運行環境和操作符的影響,而不像上面轉換為boolean類型這么固定。
先說運行環境對數據類型隱式轉換的影響
很多內置函數期望傳入的參數的數據類型是固定的,如:alert(value)方法,它期望傳入的value值是一個string類型,但是如果我們傳入的是number類型或者object類型等非string類型的數據的時候,就會發生數據類型的隱式轉換。這就是環境運行環境對數據類型轉換的影響。
操作符也會影響數據的類型轉換
1. 當+號作為一元操作符操作單操作數的時候,他就會將這個數轉換為數字類型
2. 當+號作為二元操作符時,如果兩個操作數中存在一個字符類型的話,那么另外一個操作數也會無條件地轉換為字符串
3. 當+號作為二元操作符時,如果兩個操作數一個都不是字符串的話,兩個操作數會隱式轉換成數字類型(如果無法成功轉換成數字,則變成NaN,再往下操作),再進行加法算數操作
4. 當算數運算的操作符是+號以外的其他操作數時,兩個操作數都會轉成數字類型進行數字運算。
所以我們應該這樣來判斷:
1. 首先看該數據是否被操作符操作,如果被操作符操作了,遵循上面操作符對數據轉換影響的原則來進行數據的轉換
2. 如果該數據沒有被操作符操作,那么就觀察它所在具體程序環境之中,如果是alert()這樣的參數環境中,如果改數據不是字符串,那就肯定要轉換了
數據類型如何轉換成string類型或者number類型
數據類型轉換成字符串或者數字都會遵循一個原則:如果該數據是簡單數據類型,則直接轉換成字符串或者數字類型。如果該數據是復雜數據類型,那么先通過固定的方法將復雜值轉換為簡單數據,再轉成字符串或者數字。
簡單數據轉換字符串對照表:
原始數據類型 |
轉換之后的值 |
數字類型 |
數字類型的字符表示 |
字符串 |
不做任何改變 |
null |
‘null’ |
undefined |
‘undefined’ |
布爾類型 |
true變’true’,false變’false’ |
這樣的轉換調用了js引擎內部的TOString()操作,這個方法我們通過ES語言是無法訪問調用的。
簡單數據轉換數字對照表:
原始數據類型 |
轉換之后的值 |
數字類型 |
不做任何改變 |
空字符 ” |
0 |
非空字符串 |
將字符內的數據內容變為數據,如果還有其他符號中文等轉為NaN |
true |
1 |
false |
0 |
null |
0 |
undefined |
NaN |
NaN |
NaN |
復雜對象如何轉換為簡單值
一個復雜對象在轉為基礎類型的時候會調用ToPrimitive(hint)方法來指定其目標類型。如果傳入的hint值為number,那么就先調用對象的valueOf()方法,調用完valueOf()方法后,如果返回的是原始值,則結束ToPrimitive操作,如果返回的不是原始值,則繼續調用對象的toString()方法,調用完toString()方法之后如果返回的是一個原始值,則結束ToPrimitive操作,如果返回的還是復雜值,則拋出異常。如果傳入的hint值為string,則先調用toString()方法,再調用valueOf()方法,其余的過程一樣。
那么復雜對象是以什么標准來判斷ToPrimitive(hint)操作傳入的hint值到底是number還是string呢?
1. 如果運行環境非常明確的需要將一個復雜對象轉換為數字則傳入number如 Number(value) 和 +value 則傳入number
2. 如果運行環境非常明確的需要將一個復雜對象轉換為字符串則傳入string如String(value) 和 alert(value) 則傳入string
3. 如果是用+號連接兩個操作數,操作數在確定確定其中只要有一個為字符串的時候另外一個操作數會轉為字符串,ToPrimitive()會傳入string,但是如果兩個操作數都不能確定是字符串的時候則默認傳入number(Date對象是一個例外,它會默認傳入string)進行數據類型轉換。